repaint-architecture

全体的な仕様

仕様

QR コードはバックエンドでは生成せず、クライアント(コンソールやモバイルアプリ)で生成する。

モバイルの要件

イベント参加者とイベント運営が使用するアプリ。 Flutter で iOS/Android 向けに作成する。

イベント参加者向け

イベント参加 QR スキャン

URL からパラメータのイベント ID のみを解釈し、サーバーに送信する。 内部的にこのタイミングでアカウントが作成される。 イベント参加 QR コードの仕様

アプリ起動時の更新

アプリを起動するたびに、広告用の Token をサーバーに送信し、現在の写真等をサーバーから受信する。 受信した写真に差分が発生している場合は、あらためて写真を取得し直す。

スポット検知

ServiceUUID でビーコンを購読して、スポットに入った、出たことを LINE Simple Beacon を使い検出し、サーバーに送信する。

ピック用 QR スキャン

JSON の QR コードを読み込み、サーバーに送信する。 QR コードと対応したスポット内でスキャンしなければピックできない。 ピックスポットのパレット取得 QR コードの仕様

画像を表示

現在の収集状況に応じて、画像を表示する。 画像はアプリ使用者の意思によって任意のタイミングで保存できる。 デフォルト画像(複数枚)と撮影した画像(0..1)を選択することができる。

画像を開いている状態で画像処理が完了したり、パレットを取得した等の事情で画像が更新される場合、自動的に画像を更新する。 画像の更新は、透過度を 0%-100%で徐々に変化させるアニメーションを行う。

参加者 QR 表示

参加者識別 QR を表示する。 すでに写真が登録されていた場合は、上書きすると元の撮影写真が消える旨の説明を行う。 参加者識別 QR コードの仕様

HP などへの導線

イベント HP や、イベント運営の連絡先などを表示する。

通知

二つのタイミングで通知を行う。

アカウントの削除

任意のタイミングでアカウントを削除できるようにする。 削除をすると、バッチ処理により event_log に定義されるデータ以外の全てのデータが破棄されることが保証される。

イベント運営向け

モバイル・コンソール共通

ビーコン・スポットの登録

ビーコンの HWID とスポットの ID を紐付ける。 登録時にスポットの登録名を入力する。

スポットの確認

近くにあるスポットを確認する。 電波強度により、どのビーコンをどのスポットとして登録したかを確認できる。

イベント運営向け Web コンソールの要件

イベント運営が使用するアプリ。 Node.js で Web アプリとして作成する。

モバイル・コンソール共通

Auth0 によるログイン

モバイルとコンソールは共通のアカウントでログインする必要がある。

写真撮影

参加者の QR コードを読み込み、参加者の写真を撮影し、サーバーに送信する。 複数人の写真を同時に撮影ができ、その場合は参加者の QR を連続して読み取る。 参加者識別 QR コードの仕様

イベント前

イベントの作成・設定

イベントを作成し、設定する。 イベントデータ
イベント参加者が参加するための QR コードが生成される。 LP/イベント参加兼用コード

イベント管理者の招待

イベント管理者を既存のイベントに招待する。 招待 URL メールアドレス宛に送り、Auth0 のアカウントをイベントに関連付ける。

スポットの詳細設定

イベント中

人流制御

あるスポットから別のスポットへの人流制御を行う。 あるスポットにいるランダムな参加者に通知が行く。 人流制御先のスポットはボーナスとなり、パレットが増加する。

終了タイミングは、B にいる人間が A の n%になるまで、または増加イベントの時間制限がくるまで

イベント中・イベント後

イベントのメトリクスの可視化

イベントログを Grafana で可視化する。 イベントログ

バックエンドの要件

API サーバーは Rust で作成する。 そのほかは後述する。

バックエンド API サーバー

各要件を満たすような API を提供する。 API スキーマのリポジトリ

画像処理

画像全般についての仕様

Pub/Sub により、バックエンド API サーバーから画像処理のリクエストを受け取り、画像処理を行う。

画像のクラスタリング

画像の色をパレットに分けて、パレット別の透過 png を生成する。

画像の合成

リクエストをもとにパレットの透過 png を合成する。

画像取得ワンタイム認証サーバー

repaint-image-otp のリポジトリ

Nginx と連携し、通常の URL をワンタイム URL にする。

画像取得 URL が、https://example.com/image/1234567890の場合、https://example.com/image/1234567890?token=abcdefgのように、tokenパラメータを付与する。