Air_Conditioning_Management_App
解決したい課題
- バスツアーやセミナーなど団体で室内にいる時に空調に対する不満に対して手を挙げづらい
「寒い(暑い)けれど、自分だけだったらどうしよう、言いづらい、、、」
- 上記のようなケースは自分の意見が時々刻々と変わりうる
- 既存のアプリでは解決できない
- アンケート収集アプリはあるが、初期設定が面倒
- 包含関係ではあるが、上記ニーズに特化しているわけではなく、オーバースペック
競合
1対多のアンケート収集サービス
- 国内で最も有名?なサービス
- 1対多
- クイズやアンケートを収集
参考
ユースケース
ホスト
- ルームを作成できる
- 民意を複数設定できる
- 例) 空調: 寒い or 暑い、 声: 小さい or 大きい
- ゲスト用URLを発行できる
- 総意を確認できる
flowchart LR
host((ホスト))
subgraph App
createRoom[ルームを作成する]
createAccount[ゲストアカウントを作成する]
deleteAccount[ゲストアカウントを削除する]
view[総意を確認する]
end
host --> createRoom
host --> createAccount
host --> deleteAccount
host --> view
ゲスト
flowchart LR
guest((ゲスト))
subgraph App[アプリ]
select["民意(寒い/暑い)を選択する"]
view["総意(寒い/暑い)を確認できる"]
end
guest --> select
guest --> view
イベントストーミング
flowchart LR
CreateRoom["`ルームが作成された
Actor: ホスト
Command: ルームを作成した
Group: ルーム
`"]
Select["`民意(寒い/暑い)が選択された
Actor: ゲスト
Command: 民意を選択する
Group: 民意
`"]
Aggregated{{"`
集計された
Policy: 民意が投稿された
Command: 民意を集計する
Group: 民意
`"}}
Closed{{"`ルームがクローズされた
Policy: ルームの最終投稿から2日経過した
Command: ルームをクローズした
Group: ルーム
`"}}
CreateRoom --> Select --> Aggregated --> Closed
仕様
ホスト
機能要件
非機能要件
- ルーム
- 最終操作から2日経過すると、不要なルームとしてクローズされる
- ルームに追加できるゲスト数上限は 200
- 民意
- 1ルーム1つ(将来的に複数設定できるようにしたい)
- 選択肢は5段階
- 例)「寒い」「やや寒い」「ちょうど良い」「やや暑い」「暑い」
- 両極と中央を設定できる
- ゲストからはホストのURLを推測できないようにする必要がある
ゲスト
機能要件
- 民意を選択できる
- 民意を変更できる
- リセット(無選択状態化)できる
- 総意(集計結果)を閲覧できる
- 更新ボタンで直近の総意を取得できる
- デフォルトは1h
- 1h, 2h, 3h に切替えられる
非機能要件
ユビキタス言語
| ユビキタス言語 | 開発語 | 説明 |
|---|
| ルーム | Room | 集団が属する部屋 |
| ホスト | Host | 集団を管理する立場のユーザー |
| ゲスト | Guest | 集団に属する参加者 |
| 民意 | Vote | ゲストユーザーの選択結果 |
| 総意 | Consensus | ゲストユーザーの民意の総和 |
設計
基本設計
クラス設計
classDiagram
class Room {
+String id
+String Name
}
class Host {
+String id
+String room_id
}
class Guest {
+String id
+String room_id
}
Room "1" <-- "1" Host
Room "1" <-- "1..n" Guest
テーブル設計
rooms
| name | type | description |
|---|
| id | primary_key | プライマリーキー |
| title | string | お題 |
| created_at | | |
| updated_at | | |
hosts
| name | type | description |
|---|
| id | primary_key | プライマリーキー |
| room_id | | 所属ルームID |
| created_at | | |
| updated_at | | |
guests
| name | type | description |
|---|
| id | primary_key | プライマリーキー |
| room_id | | 所属ルームID |
| created_at | | |
| updated_at | | |
システム構成
1. アーキテクチャ
- バックエンド: Serverless アーキテクチャ(AWS Lambda + API Gateway)
- データベース: AWS DynamoDB(NoSQL)
- フロントエンド: シングルページアプリケーション(SPA)フレームワーク(Next.js)
- 認証: AWS Cognito
- デプロイ: AWS Amplify(フロントエンド)、AWS CloudFormation(インフラ管理)
2. バックエンド
- AWS Lambda
- 各種API(ルーム作成、ゲストアカウント発行、民意投稿など)を実装
- 関数を実装
createRoomcreateGuestAccountdeleteGuestAccountselectOpinionviewConsensusresetConsensus
- API Gateway
- REST API エンドポイントの設定
- 各種Lambda関数と連携
3. データベース
- AWS DynamoDB
- テーブル設計
Rooms テーブル room_id (Partition Key)host_idcreated_atupdated_atexpiration_timeis_closed
Guests テーブル guest_id (Partition Key)guest_nameroom_id (Sort Key)
Opinions テーブル opinion_id (Partition Key)room_id (Sort Key)guest_idopinion_valuecreated_atupdated_at
4. フロントエンド
- React
- ホスト用のページとゲスト用のページを作成
- 状態管理ライブラリ(Reduxなど)を使用してアプリケーションの状態を管理
- ホストページ
- ルーム作成フォーム
- ゲストアカウント発行機能
- 民意追加フォーム
- 総意の表示
- QRコード生成機能(ライブラリを使用)
- ゲストページ
5. デプロイとインフラ管理
- AWS Amplify
- AWS CloudFormation
6. プロセスフロー
- ホストの操作
- ホストはフロントエンドアプリにログインし、ルームを作成
- ルーム作成時に、DynamoDBの
Roomsテーブルにレコードが追加 - 民意を追加し、QRコードを生成
- ゲストアカウントを作成し、DynamoDBの
Guestsテーブルにレコードが追加
- ゲストの操作
- ゲストはQRコードをスキャンして、専用のURLにアクセス
- 民意を選択し、DynamoDBの
Opinionsテーブルにレコードが追加
- 総意の表示
- ホストとゲストは、総意表示APIを通じて現在の意見状況を取得
- DynamoDBから集計データを取得し、表示