Giter VIP home page Giter VIP logo

nfc-entry-management's Introduction

nfc-entry-management's People

Contributors

taiki-kuraishi avatar

Watchers

 avatar

nfc-entry-management's Issues

Devlopment-v1.0

概要

本プロジェクトは、Kaishi Labの入退室を管理するシステムを開発します。システムは、学生証のNFCリーダーを用いて学生の入退室を自動で記録し、管理します。

フロントエンド部分は、Felica-RC-S380というNFCリーダーとPythonを用いて学生証の情報を読み取ります。バックエンド部分は、Go言語で作られたAPIサーバーとMySQLデータベースから構成され、学生の入退室情報を管理します。

学生がKaishi Labに入室する際には、学生証をNFCリーダーにかざすことで、その情報がAPIサーバーに送信され、データベースに保存されます。同様に、学生が退室する際にも学生証をかざすことで、その情報がAPIサーバーに送信され、データベースの該当するレコードが更新されます。

設計

システム構成図

flowchart

%%フロント側
subgraph DO1[Docker]
	subgraph GOU[front]
		  OU1[Felica-RC-S380]
			Python[python]
		end

%%バックエンド
		subgraph BC1[BackEnd]
	
		subgraph AP1[api-server]
			Go[Go]
		end
	
			subgraph DB1[DB]
			MySQL[MySQL]
		end
	end
end
Loading

DB設計

erDiagram
      User ||--|{ Entry : "1:N"
      User {
          uint StudentNumber PK "学籍番号"
          string Name "氏名(カタカナ)"
          datetime CreatedAt
          datetime UpdatedAt
      }
      Entry {
          uint ID PK
          datetime EntryTime
          datetime ExitTime
          uint StudentNumber FK
      }
Loading

フロー図

入館時

graph LR
	student_card[student_card]
	nfc_reader[Felica-RC-S380]
	api-server[api-server]
	mysql[(mysql)]
student_card -- scan --> nfc_reader -- StudentNumber,Name,DateTime --> api-server -- StudentNumber,EntryTime --> mysql
  
Loading

入室時

graph LR
	student_card[student_card]
	nfc_reader[Felica-RC-S380]
	api-server[api-server]
	mysql[(mysql)]
student_card -- scan --> nfc_reader -- StudentNumber,Name,DateTime--> api-server -- StudentNumber,ExitTime
--> mysql
Loading

アーキテクチャ(api-server)

  • 太線 : 依存関係
  • 点線 : 制御処理の流れ
  • 線 : interfaceの実装
flowchart TD
	subgraph Infrastructure
		router
		router -.-> controller
		router ==> I-controller

		subgraph Interface Adapter
			repository
			repository ==> DB
			repository -.-> DB
			usecase -.-> repository --> I-repository

			controller
			controller ==> I-usecase
			controller -.-> usecase
			controller --> I-controller

			subgraph Usecase
				usecase ==> models
				usecase ==> I-validator
				usecase -.-> validator --> I-validator
				usecase ==> I-repository
				usecase --> I-usecase

				subgraph Entities
					models

				end
			end
		end
	end
		
Loading

イベント仕様

  1. nfc-reader
イベントID イベント名 概要 詳細
EVENT-nfc-reader-01 Card_Scan_Correct Felica-RC-S380で学生証に埋め込まれた情報を取得する 1.Felica-RC-S380が待機状態のときに、学生証をかざす 2.学生証がFelica-RC-S380に触れたとき、main.pyに書かれたon_connect関数が動き、学生証の情報を読取る 3.学生証が正しく読み取られたら、API-ServerのEVENT-01が走る
EVENT-nfc-reader-02 Card_Scan_Error Felica-RC-S380で学生証以外のカードを検知したときにエラーを吐く 1.Felica-RC-S380が待機状態のときに、学生証をかざす 2.学生証がFelica-RC-S380に触れたとき、main.pyに書かれたon_connect関数が動き、カードの情報を読取る 3.エラーを出力し、カードが離れたら待機状態に戻る
  1. api-server
イベントID Architecture 対応箇所 イベント名 概要 詳細
EVENT-api-server-01 router Router nfc_readerからのAPIを受け取るAPIエンドポイント http://localhost:8080/ POSTメソッドを受け取りEnrtyControllerを呼び出す。API Keyが正しくない場合、HTTP statu code 403を返す。処理が正常に動作した場合、HTTP statu code 200を返す。API詳細ドキュメント @nfc_reader → api_server
EVENT-api-server-02 controller EnrtyController 条件分岐に対応したusecaseを呼び出すコントローラー 条件分岐に対応したusecaseを呼び出すコントローラー
EVENT-api-server-03 usecase RegistrarUser 新規ユーザ作成処理 UserValidatorとCreateUserを呼び出す
EVENT-api-server-04 UpdateUser ユーザ情報更新処理 UpdateUserByStudentNumberを呼び出す
EVENT-api-server-05 Entry 入室処理 CreateEntryを呼び出す
EVENT-api-server-06 Exit 退出処理 UpdateExitTimeを呼び出す
EVENT-api-server-07 validator UserValidator ユーザ情報のバリデーション student_numberが8桁の数字であること、nameがUTF-8でエンコードされた2文字以上32文字以下であること、timestampがiso8601形式でmsまで表された文字列であること
EVENT-api-server-08 EntryValidator Entry情報のバリデーション student_numberが8桁の数字であること、timestampがiso8601形式でmsまで表された文字列であること
EVENT-api-server-09 repository CreateUser User Tableにレコードの追加
EVENT-api-server-10 UpdateUserByStudentNumber StudentNumberが一致するUser Tableの最初のレコードをUpdateする Update可能なカラムは、name,UpdateAtのみ
EVENT-api-server-11 GetUserByStudentNumber StudentNumberが一致するUser Tableの最初のレコードを取り出す
EVENT-api-server-12 CreateEntry Entry Tableにレコードの追加 ExitTimeはnullでレコード作成
EVENT-api-server-13 UpdateExitTime IDが一致するUser Tableの最初のレコードをUpdateする update可能なカラムは、UpdateAt,nameのみ
EVENT-api-server-14 GetActiveEntryByStudentNumber Entry TabaleのStudentNumberが指定した値で尚且つExitTimeがnullのレコードを取り出す

タスク

  • nfc-readerの全てのイベントの実装とテストコードの記述
  • api-serverの全てのイベントの実装とテストコードの記述
  • nfc-readerの単体テスト
  • api-serverの単体テスト
  • #10

初期環境構築

概要

Dockerを使用した、開発環境とプログラム実行環境の構築
pre-commitを設定し、リンターとフォーマットを自動化
vscode拡張機能の設定

目的

dockerを使用することで環境の一貫性と移植性を高めるとともに、開発速度の向上を目的とする
pre-commitを使用し、コードの品質の向上、チェックとリンターとフォーマッターの自動化による開発速度の向上を目的とする
vscode拡張機能を設定したファイルextensions.jsonを作成し、全ての開発者が同じツールを使用して作業することによる開発の効率化目的とする

設計

構成図

sequenceDiagram
  participant pi as nfc-reader
  participant api as api-server
  participant db as DB
    Note over pi : "学生証をタッチ"
    pi ->>+ api : http post
    api ->> db : データを格納
    api -->>- pi : http response
Loading
  • nfc-reader
    • 概要
      学生証(nfc)を読み取り、api-serverへデータを送信する。
      nfc読み取りUSBデバイス(RC-S380)を使用する。
    • 言語 : python
    • version : 3.12.1
  • api-server
    • 概要
      nfc-readerから送信されたデータをDBに格納、入退室の状態管理
    • lang : Go
    • version : 1.21.6
  • DB
    • type : mysql
    • version : 8.0

pre-commitチェック項目

  1. 行末の不要な空白のチェック
  2. ファイルの終わりに改行が存在するかチェック
  3. YAMLファイルが正しくフォーマットされていて、構文エラーがないか
  4. TOMLファイルが正しくフォーマットされていて、構文エラーがないかを
  5. マージコンフリクトのマーカー(<<<<<<<, =======, >>>>>>>)がコードに残っていないか
  6. JSONファイルが正しくフォーマットされていて、構文エラーがないか
  7. リポジトリに大きなファイルが追加されていないかを
  8. スペルチェック
  9. Golangのリンター、フォーマッター
  10. pythonのリンター、フォーマッター
  11. dockerのビルドエラーチェック

DB設計

erDiagram
    User ||--|{ Entry : "1:N"
    User {
        uint StudentNumber PK "学籍番号"
        string Name "氏名(カタカナ)"
        datetime CreatedAt
        datetime UpdatedAt
    }
    Entry {
        uint ID PK
        datetime EntryTime
        datetime ExitTime
        uint StudentNumber FK
    }
Loading

タスク

  • Goの実行環境を構築するためのDockerfileの作成
  • mysqlの実行環境を構築するためのDockerfileの作成
  • pythonの実行環境を構築するためのDockerfileの作成
  • dockerによるpythonの実行環境でusbデバイスが使用できる
  • 上記の3つのコンテナをまとめるdocker-compose.ymlの作成
  • pre-commitの設定ファイル.pre-commit-config.yamlの作成
  • DBのマイグレーション

Security policyの策定

概要

Security policyの策定

目的

システムで使用する個人に関するデータに対して、非人道的な扱いをしないことを利用者に明示することができる
利用者に明示し、利用者が同意した場合、システム担当者は同意した個人に関するデータの扱いをすることができる
ただしそのデータの使用範囲は、策定したセキュリティポリシーの範囲を越えてはならず、越えた場合、個人情報保護法違反となる可能性があり、懲役1年または100万円以下の罰金が科される
また、セキュリティポリシーをシステム担当者全員に周知する意味でも、セキュリティポリシーは必要である

タスク

  • Security policyに必要な項目を決定する

補足・懸念点

自己判断が難しい。先生に見てもらうが良しな気がする

READMEの整備とTaskfileを使用した一連のコマンドを一元化と再利用可能化

概要

READMEファイルの整備
Taskfileを使用した一連のコマンドを一元化と再利用可能化

  • 環境変数の設定、dbのマイグレーション、APIサーバーの起動までの一連のコマンドをTaskfileに定義
  • APIサーバーの再起動に必要な一連のコマンドをTaskfileに定義
  • テストに必要な一連のコマンドをTaskfileに定義

タスク

  • README.mdの作成
  • Taskfile.ymlの作成

GitHub Actionsを使用したリンター、フォーマッターの実行

概要

pre-commitを使用して行っている、リンター、フォーマッターをGitHub Actionsでも実行する

目的

コミットが行われる前に、pre-commitのチェックが回避された場合でも、pre-commitがインストールされていない環境からのコミットが行われる際も、すべてのコードがリンターやフォーマッター、テストなどのチェックを正常にパスすることを目的とする

タスク

  • GitHub Actions のワークフローを定義するCode_quality_and_docker_build.ymlの作成
  • .pre-commit-config.ymlと同等のチェックをGitHub Actionsにて実行できる

補足・懸念点

.pre-commit-config.yml](https://github.com/taiki-kuraishi/nfc-entry-management/blob/d860d32464be75bc48d620c8a53616fc8fcc019a/.pre-commit-config.yaml)と同等のチェックをGitHub Actionsにて実行できることが確認されていない

コード静的解析ツール CodeQL の導入

概要

コード静的解析ツール CodeQL を導入し、
GitHub Actionsとpre-commitでの実行

目的

セキュリティ脆弱性を検出し、その原因となるコードパターンを特定

タスク

  • GitHub Actionsを使用し、mainブランチへのプッシュとプルリクエストにて、CodeQLの実行
  • pre-commitを使用し、コミット時にCodeQLの実行

補足・懸念点

CodeQLをpre-commitフックとして実行することは可能ですが、CodeQLの解析は通常時間がかかるため
開発効率を低下させる可能性がある

feature and enhancement template : Issueテンプレートが表示されない

概要

feature_and_enhancement.mdが.github/ISSUE_TEMPLATE に定義されているにもかかわらず、GitHubにてfeature and enhancement templateが表示されない

再現方法

https://github.com/taiki-kuraishi/nfc-entry-management/issues/new/choose
にアクセスしてもfeature and enhancement templateが表示されない

期待する挙動

feature and enhancement template(feature_and_enhancement.md)が.github/ISSUE_TEMPLATE に定義されており、使用できる

補足

現状bug report teamplateしか表示されない
スクリーンショット 2024-02-05 16 09 19

補足・懸念点

Issue テンプレートは、.github/ISSUE_TEMPLATE に定義されています

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.