Backend (Go): - Project structure with chi router, pgxpool, goose migrations - JWT auth (access/refresh tokens) with Firebase token verification - NoopTokenVerifier for local dev without Firebase credentials - PostgreSQL user repository with atomic profile updates (transactions) - Mifflin-St Jeor calorie calculation based on profile data - REST API: POST /auth/login, /auth/refresh, /auth/logout, GET/PUT /profile, GET /health - Middleware: auth, CORS (localhost wildcard), logging, recovery, request_id - Unit tests (51 passing) and integration tests (testcontainers) - Docker Compose setup with postgres healthcheck and graceful shutdown Flutter client: - Riverpod state management with GoRouter navigation - Firebase Auth (email/password + Google sign-in with web popup support) - Platform-aware API URLs (web/Android/iOS) - Dio HTTP client with JWT auth interceptor and concurrent refresh handling - Secure token storage - Screens: Login, Register, Home (tabs: Menu, Recipes, Products, Profile) - Unit tests (17 passing) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
123 lines
2.5 KiB
JSON
123 lines
2.5 KiB
JSON
{
|
|
"images" : [
|
|
{
|
|
"size" : "20x20",
|
|
"idiom" : "iphone",
|
|
"filename" : "Icon-App-20x20@2x.png",
|
|
"scale" : "2x"
|
|
},
|
|
{
|
|
"size" : "20x20",
|
|
"idiom" : "iphone",
|
|
"filename" : "Icon-App-20x20@3x.png",
|
|
"scale" : "3x"
|
|
},
|
|
{
|
|
"size" : "29x29",
|
|
"idiom" : "iphone",
|
|
"filename" : "Icon-App-29x29@1x.png",
|
|
"scale" : "1x"
|
|
},
|
|
{
|
|
"size" : "29x29",
|
|
"idiom" : "iphone",
|
|
"filename" : "Icon-App-29x29@2x.png",
|
|
"scale" : "2x"
|
|
},
|
|
{
|
|
"size" : "29x29",
|
|
"idiom" : "iphone",
|
|
"filename" : "Icon-App-29x29@3x.png",
|
|
"scale" : "3x"
|
|
},
|
|
{
|
|
"size" : "40x40",
|
|
"idiom" : "iphone",
|
|
"filename" : "Icon-App-40x40@2x.png",
|
|
"scale" : "2x"
|
|
},
|
|
{
|
|
"size" : "40x40",
|
|
"idiom" : "iphone",
|
|
"filename" : "Icon-App-40x40@3x.png",
|
|
"scale" : "3x"
|
|
},
|
|
{
|
|
"size" : "60x60",
|
|
"idiom" : "iphone",
|
|
"filename" : "Icon-App-60x60@2x.png",
|
|
"scale" : "2x"
|
|
},
|
|
{
|
|
"size" : "60x60",
|
|
"idiom" : "iphone",
|
|
"filename" : "Icon-App-60x60@3x.png",
|
|
"scale" : "3x"
|
|
},
|
|
{
|
|
"size" : "20x20",
|
|
"idiom" : "ipad",
|
|
"filename" : "Icon-App-20x20@1x.png",
|
|
"scale" : "1x"
|
|
},
|
|
{
|
|
"size" : "20x20",
|
|
"idiom" : "ipad",
|
|
"filename" : "Icon-App-20x20@2x.png",
|
|
"scale" : "2x"
|
|
},
|
|
{
|
|
"size" : "29x29",
|
|
"idiom" : "ipad",
|
|
"filename" : "Icon-App-29x29@1x.png",
|
|
"scale" : "1x"
|
|
},
|
|
{
|
|
"size" : "29x29",
|
|
"idiom" : "ipad",
|
|
"filename" : "Icon-App-29x29@2x.png",
|
|
"scale" : "2x"
|
|
},
|
|
{
|
|
"size" : "40x40",
|
|
"idiom" : "ipad",
|
|
"filename" : "Icon-App-40x40@1x.png",
|
|
"scale" : "1x"
|
|
},
|
|
{
|
|
"size" : "40x40",
|
|
"idiom" : "ipad",
|
|
"filename" : "Icon-App-40x40@2x.png",
|
|
"scale" : "2x"
|
|
},
|
|
{
|
|
"size" : "76x76",
|
|
"idiom" : "ipad",
|
|
"filename" : "Icon-App-76x76@1x.png",
|
|
"scale" : "1x"
|
|
},
|
|
{
|
|
"size" : "76x76",
|
|
"idiom" : "ipad",
|
|
"filename" : "Icon-App-76x76@2x.png",
|
|
"scale" : "2x"
|
|
},
|
|
{
|
|
"size" : "83.5x83.5",
|
|
"idiom" : "ipad",
|
|
"filename" : "Icon-App-83.5x83.5@2x.png",
|
|
"scale" : "2x"
|
|
},
|
|
{
|
|
"size" : "1024x1024",
|
|
"idiom" : "ios-marketing",
|
|
"filename" : "Icon-App-1024x1024@1x.png",
|
|
"scale" : "1x"
|
|
}
|
|
],
|
|
"info" : {
|
|
"version" : 1,
|
|
"author" : "xcode"
|
|
}
|
|
}
|