Başlangıç
Flutter Mimari
ChatCal mobil uygulama katmanları, kritik akışlar ve backend eşlemesi.
ChatCal Flutter uygulaması Provider state, go_router navigasyon ve *ApiService HTTP katmanı üzerinden NestJS backend ile konuşur.
Tam referans (mermaid diyagramları dahil): monorepo docs/architecture.md
Katman özeti
screens/ + widgets/ → providers/ → services/*ApiService → ApiService → BACKEND_URL| Katman | Dizin | Rol |
|---|---|---|
| UI | chatcalmobile/lib/screens/, chatcalmobile/lib/widgets/ | Ekranlar ve bileşenler |
| State | chatcalmobile/lib/providers/ | AppProvider, SubscriptionProvider, UsageQuotaProvider, … |
| API | chatcalmobile/lib/services/ | HTTP, auth, platform SDK |
| Model | chatcalmobile/lib/models/ | Domain tipleri |
| Routing | chatcalmobile/lib/router/app_router.dart | Auth redirect + shell layout |
Provider'lar
| Provider | Sorumluluk |
|---|---|
AppProvider | Profil, öğün/egzersiz, chat, tarih, Apple Health, streak, AI mesaj |
SubscriptionProvider | RevenueCat Plus, paywall |
UsageQuotaProvider | Günlük mesaj/foto/ses kotası |
NetworkStatusProvider | Bağlantı banner'ı |
AppProvider geniş bir sınıftır (~2700 satır). Yeni özelliklerde mümkünse ilgili *ApiService + dar state değişikliği tercih edin.
Route'lar
| Path | Ekran |
|---|---|
/onboarding | İlk kurulum |
/dashboard, /chat | Shell (HomeScreen altında) |
/profile, /settings | Profil ve ayarlar |
/settings/appearance, /settings/apple-health | Alt ayarlar |
/settings/legal/:type | Yasal metinler |
Kritik akışlar
Auth
AuthService.signInWithApple()/signInWithGoogle()POST /api/auth/apple/loginveyagoogle/login- Token'lar
FlutterSecureStorage'a yazılır ApiServiceisteklerde Bearer token kullanır; süre doluncaPOST /api/auth/refresh
Chat / AI
ChatScreen→AppProvider.handleSendMessage()UsageLimitsService— kota kontrolü- Optimistic user message (temp id)
- Metin mesajı:
OpenAIApiService.sendMessageToAIStream()→POST /api/responses/send-message/stream(SSE) - Foto / tool:
sendMessageToAI()→POST /api/responses/send-message - Stream event'leri:
AIStreamTextDelta,AIStreamFinal,AIStreamError
Öğün / egzersiz proposal
- AI yanıtında
MealProposalCard/ExerciseProposalCard - Onay:
handleConfirmMeal()/handleConfirmExercise() POST /api/food-eventsveya/api/exercise-events- Chat geçmişi ve dashboard verisi backend'den yeniden yüklenir
Abonelik ve limitler
- RevenueCat →
SubscriptionProvider→ paywall UI - Backend
/api/usage/*→UsageLimitsService→UsageQuotaProvider - Chat gönderimi öncesi
_ensureCanSendAiRequest()kota kontrolü yapar
i18n
app_tr.arb + app_en.arb + app_es.arb → flutter gen-l10n → AppLocalizations
Backend eşlemesi
Base URL: BACKEND_URL env → ApiService.baseUrl
| Flutter servis | Backend |
|---|---|
AuthService | /api/auth/* |
OpenAIApiService | /api/responses/* |
ChatApiService | /api/chat-messages |
MealsApiService | /api/food-events |
ExercisesApiService | /api/exercise-events |
UserApiService | /api/users/* |
UsageApiService | /api/usage/* |
SpeechApiService | /api/speech/* |
HealthSummaryApiService | /api/health/summaries |
LegalPolicyApiService | /api/legal/policies/:type |
LiveActivityService | /api/notifications/live-activities/register |
Endpoint detayları ve deneme: API Reference
OpenAPI spec sync:
npm run docs:syncAppProvider sorumluluk alanları
| Alan | Örnek metodlar |
|---|---|
| Startup | init(), _initialize(), reloadFromBackend() |
| Profil | setUserProfile(), handleOnboardingComplete() |
| Chat | handleSendMessage(), submitMessageFeedback() |
| Öğün / egzersiz | handleConfirmMeal(), handleUpdateExercise(), … |
| Apple Health | syncAppleHealthForSelectedDate() |
| Oturum | logout(), resetAllData() |
Yeni özellik checklist
- Backend endpoint var mı? → ilgili
*ApiService - UI string → üç ARB dosyası
- Cross-screen state → dar
AppProvidermetodu veya yeni provider - Route değişikliği →
app_router.dart - Mimari değişiklik →
docs/architecture.mdgüncelle
Test
flutter test