- App Name: MonaCube
- Key Features
- モナコインによるtipができる画像作品の投稿プラットフォーム
- Passkeyから生成したモナコインウォレットによってユーザを認証する
- スパムや人気工作への対策としてモナコインウォレットの残高(MONA高)を参照する
- MONA高によってアップロードできる作品の総数と総サイズをアンロック
- 投稿者のMONA高を人気の指標として扱う
- 作品へのtip額などは工作可能なので指標としては使わない
project-root/
sst.config.ts # サーバレスアーキテクチャ管理: SST
package.json
apps/
web/
nuxt.config.ts # フロントエンド: Nuxt SPA
package.json
app/
app.vue
lib/
pages/
components/
composables/
assets/
css/
packages/
functions/ # バックエンド: Lambda
package.json
src/
lib/
api/
batch/
users/
<userId>/
icon.webp (128x128)
icon@2x.webp (256×256)
works/
<workId>/
original (ユーザがアップロードした画像を EXIF削除, カラープロファイルをsRGBに変換 してから保存)
large.webp (長辺 1920px, 想定サイズ 300KB〜1MB)
medium.webp (長辺 960px, 想定サイズ 100KB〜300KB)
thumb.webp (square crop 320x320, 想定サイズ 20KB〜60KB)
uploads/
<uploadId>/
tmp
- init API でtmpへのアップロードURLを発行
- クライアントが画像をtmpにアップロード
- finalize API で
- tmpにアップロードされた画像のサイズなどをチェック
- 画像のバリエーションを生成して保存
- DB更新
- original が一定サイズ以下ならアートワーク詳細で original を表示 / 一定サイズ以上なら large.webp を表示
- blurHash, thumbBHash でロード時間をつなぐ
- API Interface: shared/apiInterface.ts
- DynamoDB Record: shared/ddbRecord.ts
- blurHash表示
- MONA高の手動更新の実装
- Tip機能
- Tip履歴表示
- 作品ごとにOGP設定
- 利用規約 v1.0
- プライバシーポリシー v1.0
- Adminアカウントの定義と専用UI追加
- プロフィール編集機能
- プロフィールアイコンアップロード
- アートワーク編集機能
- クォータ超過時の削除処理