# Del 5–6 – Arkitektur & repostruktur ## Systemöversikt ```text ┌──────────────┐ HTTPS/JSON ┌─────────────────────────────┐ │ iOS/Android │ ──────────────▶ │ Food API │ │ (Expo RN) │ ◀────────────── │ (Fastify) │ └──────────────┘ │ auth · inventory · recipes │ │ presigned PUT │ meals · plan · shopping │ ▼ │ recs · memory · subs · adm │ ┌──────────────┐ └──────┬──────────┬───────────┘ │ S3 (bilder) │ ◀── presigned ──────────┘ │ enqueue └──────┬───────┘ ▼ │ läs-URL ┌──────────────────┐ │ │ Redis / BullMQ │ ▼ └────────┬─────────┘ ┌──────────────┐ typade kontrakt │ konsumerar │ AAMOS │ ◀───────────────────────┌─────────▼─────────┐ │ (befintlig │ ─────────────────────▶ │ Worker │ │ AI-plattform)│ validerade svar │ bildanalys·kvitto │ └──────────────┘ │ plan·minne·notiser│ └─────────┬─────────┘ ┌────────────┐ │ │ PostgreSQL │ ◀───────────────┘ │ (app) │ ◀── Adminpanel (Vite/React) via /admin/v1 └────────────┘ ``` Regler som bär arkitekturen (spec §31, §61): mobilen pratar **endast** med Food API; AAMOS nås **endast** från API/worker via `@app/ai-contracts` (Zod-validerad input och output – brutet kontrakt är ett fel, aldrig data); alla säkerhetskritiska beräkningar (nutrition, allergener, saldo, entitlements) är deterministiska paket; AI-resultat blir aldrig lagerdata utan användarbekräftelse. ## Centrala dataflöden **Skanning (spec §50):** App → `POST /v1/scans` (kvot + presign) → PUT bild → `POST /scans/:id/start` → kö → worker → AAMOS → validerat resultat → `awaiting_confirmation` → app granskar → `POST /scans/:id/confirm` → inventory- transaktioner + events + ai_corrections (samtyckessnapshot). **"Vad ska vi äta?":** API läser lager+medlemsbegränsningar+dagsläge+säsong → deterministisk säkerhetsfiltrering → täckning (recipe-engine) → poäng+förklaring (recommendation-engine) → ev. AAMOS-omrankning (flagga) → matlådor först. **Events (spec §55):** skrivs i outbox-tabellen i samma transaktion som affärsdata; worker publicerar var 30:e sekund; minnesjobbet konsumerar veckans events per användare med samtycke → AAMOS UPDATE_USER_MEMORY → förslag till `memory_items`. ## Repostruktur och ansvar per paket ```text apps/ mobile/ Expo-app. Får ALDRIG innehålla AI-nycklar eller premiumlogik (§61.13–14). api/ Enda ingången. Routes per domän, plugins (auth/core/storage), tunna handlers. worker/ BullMQ-processorer för spec §54-jobben + schemalagda jobb. admin/ Vite/React-panel mot /admin/v1 (§57). packages/ shared-types/ Enums, entiteter, konstanter. Noll beroenden. Allas sanning. validation/ Zod-scheman för API-kontrakt (in-DTO:er). database/ Drizzle-schema (54 tabeller), klient, migrationer, seed. nutrition-engine/ §21: enheter, per-100-beräkning, BMR/TDEE, dagsmål. Rent. inventory-engine/ §8/§13: saldo, FEFO, bäst före-klassning, dubbletter, forecast. recipe-engine/ §17/§20: säkerhet (allergi/diet/religion), täckning, skalning, substitution, kostnad. recommendation-engine/ §18–19/§28: poängvikter, förklaringar (sv), craving-parser, säsongsalgoritmer. ai-contracts/ §31: AAMOS task-typer, Zod-kuvert, HttpAamosClient + MockAamosClient. memory-client/ §32: minnesförslag via AAMOS, "Vad appen vet"-vy, pseudonymisering. subscriptions/ §44–47: entitlements, signerad offline-token, StoreVerifier. connectors/ §43: interface + Livsmedelsverket, Open Food Facts, hälso-stubs. events/ §55: typade payloads + makeEvent. feature-flags/ DB+env-flaggor med rollout-procent. infrastructure/ Docker, compose (dev+prod), migrations (genererad SQL), deployment (DB-bootstrap, deploy.sh), monitoring, security. docs/ Denna dokumentation (Del 1–20). ``` Beroenderiktning: `apps → packages`, `packages → shared-types`, aldrig tvärtom och aldrig paket ↔ paket-cykler. Motorerna är rena funktioner (inga DB-anrop) → triviala att testa och att flytta till egen tjänst vid skalning (§59 steg 2–3 kräver inga kodändringar i motorerna, bara i apps/). ## Service-to-service (§59) API↔AAMOS: HTTPS, Bearer-nyckel, timeout+exponentiell retry, correlation-id-header, versionerat kontrakt (`x-contract-version`). Circuit breaker läggs i HttpAamosClient när trafik finns att kalibrera mot. Samma API-domän behålls genom alla skalningssteg.