Air_Conditioning_Management_App

解決したい課題

  • バスツアーやセミナーなど団体で室内にいる時に空調に対する不満に対して手を挙げづらい

「寒い(暑い)けれど、自分だけだったらどうしよう、言いづらい、、、」

  • 上記のようなケースは自分の意見が時々刻々と変わりうる
  • 既存のアプリでは解決できない
    • アンケート収集アプリはあるが、初期設定が面倒
    • 包含関係ではあるが、上記ニーズに特化しているわけではなく、オーバースペック

競合

1対多のアンケート収集サービス

Slido

  • 国内で最も有名?なサービス
  • 1対多
  • クイズやアンケートを収集

Mentimeter

  • 1対多
  • クイズやアンケートを収集

参考

Pigeonhole Live

  • 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

仕様

ホスト

機能要件

  • ルームを作成できる
    • 民意のお題を設定できる
      • 例) 「空調」
    • 民意の選択肢を作成できる
      • ラジオボタン形式の単一選択
  • ゲスト用URLを発行できる
    • 対応するQRコードを生成できる

非機能要件

  • ルーム
    • 最終操作から2日経過すると、不要なルームとしてクローズされる
    • ルームに追加できるゲスト数上限は 200
  • 民意
    • 1ルーム1つ(将来的に複数設定できるようにしたい)
    • 選択肢は5段階
      • 例)「寒い」「やや寒い」「ちょうど良い」「やや暑い」「暑い」
      • 両極と中央を設定できる
  • ゲストからはホストのURLを推測できないようにする必要がある

ゲスト

機能要件

  • 民意を選択できる
  • 民意を変更できる
  • リセット(無選択状態化)できる
  • 総意(集計結果)を閲覧できる
    • 更新ボタンで直近の総意を取得できる
      • デフォルトは1h
      • 1h, 2h, 3h に切替えられる

非機能要件

  • ゲスト用のURLは1つ
    • Cookieでユーザーを識別する

ユビキタス言語

ユビキタス言語開発語説明
ルーム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

nametypedescription
idprimary_keyプライマリーキー
titlestringお題
created_at
updated_at

hosts

nametypedescription
idprimary_keyプライマリーキー
room_id所属ルームID
created_at
updated_at

guests

nametypedescription
idprimary_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(ルーム作成、ゲストアカウント発行、民意投稿など)を実装
    • 関数を実装
      • createRoom
      • createGuestAccount
      • deleteGuestAccount
      • selectOpinion
      • viewConsensus
      • resetConsensus
  • API Gateway
    • REST API エンドポイントの設定
    • 各種Lambda関数と連携

3. データベース

  • AWS DynamoDB
    • テーブル設計
      • Rooms テーブル
        • room_id (Partition Key)
        • host_id
        • created_at
        • updated_at
        • expiration_time
        • is_closed
      • Guests テーブル
        • guest_id (Partition Key)
        • guest_name
        • room_id (Sort Key)
      • Opinions テーブル
        • opinion_id (Partition Key)
        • room_id (Sort Key)
        • guest_id
        • opinion_value
        • created_at
        • updated_at

4. フロントエンド

  • React
    • ホスト用のページとゲスト用のページを作成
    • 状態管理ライブラリ(Reduxなど)を使用してアプリケーションの状態を管理
    • ホストページ
      • ルーム作成フォーム
      • ゲストアカウント発行機能
      • 民意追加フォーム
      • 総意の表示
      • QRコード生成機能(ライブラリを使用)
    • ゲストページ
      • 民意選択機能(ラジオボタン)
      • 総意の表示

5. デプロイとインフラ管理

  • AWS Amplify
    • フロントエンドのデプロイ、ホスティング
  • AWS CloudFormation
    • インフラのコード管理、リソースの自動デプロイ

6. プロセスフロー

  1. ホストの操作
    • ホストはフロントエンドアプリにログインし、ルームを作成
    • ルーム作成時に、DynamoDBのRoomsテーブルにレコードが追加
    • 民意を追加し、QRコードを生成
    • ゲストアカウントを作成し、DynamoDBのGuestsテーブルにレコードが追加
  2. ゲストの操作
    • ゲストはQRコードをスキャンして、専用のURLにアクセス
    • 民意を選択し、DynamoDBのOpinionsテーブルにレコードが追加
  3. 総意の表示
    • ホストとゲストは、総意表示APIを通じて現在の意見状況を取得
    • DynamoDBから集計データを取得し、表示