アジチャレ(ハッカソン)で参考にした記事や考え方を書いていく
1日目を終えて
うまく行ったこと
- フロントのホスティングができたこと
- 画面設計に対してチームで共通認識が持てたこと
- ci/cdを整えれた
うまくいかなかったこと
- フロント部隊に対して的確な指示を出せていなかった
- React初めてが2人,初心者が1人のフロントチームなので、細かめに指示を出した方がいい
- 自分が1つページを作って、作り方を示すとわかりやすいかも
- 当日にアイデアに対する意見の違いで時間を浪費してしまった
- 開催日までにアイデアに対する認識に誤差がないか擦り合わせておくべきだった
参考にさせていただいた記事
画像のアップロード-> APIGateway -> lambda -> S3 -> DynamoDB
難しいポイント
画像のアップロードからレビュー画面に遷移させる
↓
zustandでいまアップロードした画像のurlをグローバルで管理。
それを元に共通のレビューページで表示
データベースの構造にミスがあることが発覚していく
バックアップ大事
S3に画像をランダムな文字列の名前で保
アップロードした時のファイルの名前を保存
S3に保存orローカルストレージに保存
認証はCognitoでやる
lambda + APIGateway + DynamoDBでバックエンド作成
IAM ポリシーの追加
lambdaの設定→インラインポリシーを作成→lambda関数に許可を与えてあげる
今晩のTODO
バックエンド
- Cognitoによるアカウント認証
- GraphQLまわり全然わからんし頑張る
- lambdaでCRUD操作できるように
Cognito関連
amplifyのビルド設定
team-provider-infoはgitから外すといいらしい
CognitoとDynamoDBのユーザを連携させたい
→CognitoでSignUp時にトリガーでlambdaを起動してDynamoDBにユーザー情報をコピーする
参考記事↓
認証画面はこれでカスタマイズ
バックエンドの機能
アカウント登録
・Cognitoで認証したらDynamoDBにユーザーデータをコピー
自分がプレイしているビンゴ
- ビンゴをランダムに生成する
- ビンゴの構成と達成具合を取得
- BingoIdからビンゴの情報を取得
・他の人が見れるようにする
- BingoIdからビンゴの情報を取得
タイムライン
・ランダムにビンゴを取得
・ビンゴの詳細な情報を取得
・保存
・いいね
マイページ
・自分が作成したビンゴを取得
・自分が達成したビンゴを取得
・保存したビンゴを取得
・id、メールアドレス、パスワード、アイコン、生年月日、ランクを登録
・idを使えるか確認
(ビンゴのマスを押したら)そのお店の情報を見れる画面
・お店の情報を取得
レビュー登録画面
・写真をアップロード
・星を登録
・コメントを登録
コミットする前にtsのチェック走らせた方が良さそう
BINGOのflag
0->プレイ中のBINGO
1->保存したBINGO
2->作成したBINGO
3->投稿したBINGO
pythonでscanメソッドを使用すると、テーブル全体をスキャンするため、テーブルが大きい場合は非効率になる可能性があります。その場合は、別の方法でランダムなアイテムを取得する必要があるかもしれません。
get_mybingoの仕様
入力
- userId
return
- プレイ中のビンゴがあるなら
→ プレイ中のビンゴを返す - プレイ中のビンゴがないなら
→ 新しいビンゴをランダムな9個のお店から作る
post_reviewの仕様
BINGOSTATEテーブルのレビューの部分を更新する
入力
- userId
- bingo_id
- Image
- caption
- star_taste
- star_atmosphere
- star_CP
戻り値
なし
S3に画像のアップロードをしてURLを返して、URL,ランダムな文字列の画像の名前,本当の画像の名前をDBに保存したいけど権限もないし、わからんことばかりでむずそうなので明日メンターさんに手伝ってもらいながら実装する
明日になったらメンバーに聞きたいこと&頼みたいこと
- ACCOUNTテーブルでなんでidとuser_idで分かれているのか
- BINGOSTATEテーブルはaccountIDとbingoIDで検索できるのか
- imageテーブルを作ってBINGOSTSATEテーブルと紐付けて欲しい
- BINGO完成のフラグをもつのか
- 発表スライドを綺麗に作って欲しい <- これ結構大事 (変なテンプレートは使わない)
post_reviewの動作
- eventからユーザーID、ビンゴID、レビュー情報(キャプション、味の評価、雰囲気の評価、コストパフォーマンスの評価)を取得する。
- BINGOSTATEテーブルからユーザーIDとビンゴIDに一致するアイテムを取得する
- アイテムが存在しない場合はエラーを返す
- アイテムが存在する場合は、以下のフィールドを更新する
- review: レビューのキャプション
- star_taste: 味の評価
- star_atmosphere: 雰囲気の評価
- star_cp: コストパフォーマンスの評価
- 更新されたアイテムをput_itemメソッドを使って保存する
- 成功時には適切なレスポンスを返す
発展↓
評価を個別のフィールドで持っているのでソートしやすいし、評価で絞り込みとかもできそう
完成時にデモを見せる順番とそれぞれバックエンドで実装すべき機能
- ログイン
- 余裕があれば(アカウント登録->フラグ発動(SAM?)->アカウント情報をDBにコピー)を実装
- タイムライン
- とくにない
- MyBingo
- S3を使って画像のアップロードとURLを返してDBに保存し、フロントにURLを返す
- 画像用のテーブルを作る
- プロフィール
- ある程度のプロフィールの情報をGETできるようにする
S3を使って画像のアップロードとURLを返してDBに保存し、フロントにURLを返す
どんな動作?
eventから画像ファイルのバイナリデータ、ビンゴID、ストアID、ユーザーIDを取得します。
一意のキー(bingo-images/{uuid}.jpg)を生成し、そのキーでS3にアップロードした画像のURLを生成します。
BINGOテーブルに、ビンゴID、ストアID、ユーザーID、画像ID、画像URLを含むアイテムを追加します。
成功時には、画像URLと画像IDを返します。
この実装では、画像ファイルをS3にアップロードし、その画像URLとユーザー情報などをBINGOテーブルに保存しています。
ポイントは以下の通りです:
画像ファイルのバイナリデータを直接Lambdaに渡す必要があります。通常、APIゲートウェイではバイナリデータを直接受け取ることはできないので、別の方法(例えばフォームデータやBase64エンコーディングなど)で画像データを渡す必要があります。
S3バケットの名前とリージョンが適切に設定されていることを確認してください。必要に応じて、アクセス権限の設定なども行ってください。
画像URLの生成方法は環境によって変わる可能性があるので、適宜調整が必要かもしれません。
BINGOテーブルにアイテムを追加する際、ビンゴID、ストアID、ユーザーIDをキーとして使用しています。必要に応じてキーの構造を変更してください。
画像テーブルの構造
- id
- image_url
- image_name
時間が結構迫ってきたから一回タスク整理する
自分がやるタスク
- 画像をアップロードするAPIを作る
- S3の設定をする 15min
- 画像をどうバイナリデータで送るか考える←メンターさんと相談 10min
- axiosでフロントからAPIを叩けるようにする
- hooksでそれぞれのAPIを定義する 40min
- 画像をバイナリデータに変換する 30min