Epic EP-01 Kritik backend

Bootstrap — 3 repo skeleti, umumiy qatlamlar va docker-compose muhiti

Bajarildi
100% 13/13
Status:

Tavsif

3 ta bo'sh repo'ga ishlaydigan skelet quriladi: har biri ko'tariladi, testi yashil, kontraktga (`erpbom-backend/openapi/`) va `coding/*` standartlariga mos. Qo'shimcha — dev va prod uchun bitta docker-compose muhiti (ADR-001 §2.7). Qamrov: * `erpbom-backend` — Maven + Spring Boot 3, HikariCP → PostgreSQL to'g'ridan-to'g'ri, Flyway (bitta migratsiya to'plami), umumiy xatolik/pagination qatlami, springdoc, `/actuator/health`, infra qatlamlari (Caffeine kesh, `@Scheduled` outbox worker naqshi, `@Scheduled` cron) * `erpbom-web` — Vite + Vue 3 + TS + Pinia + router + API qatlami (JWT refresh, `audience=web`) * `erpbom-mobile` — BITTA Flutter ilova: `core/` + rol bo'yicha `features/{employee,driver,customer,supplier}`, dio + JWT refresh, freezed, Cubit skeleti, `.env` orqali server manzili, birinchi ochilishda **rol tanlash ekrani** (ADR-001 §2.4) * `erpbom-backend/deploy/` — docker-compose (postgres + app + minio + nginx), `.env.example`, nginx konfiguratsiyasi, oddiy CI Qamrovdan TASHQARIDA (ataylab): * Biznes jadvallari va biznes endpoint'lari — ular modul epiclarida (`09_auth` → `02_products` dan boshlab) keladi. Bu yerda hech qanday biznes entiti yaratilmaydi; bootstrap seed (09_auth R54) ham 09_auth epicida. * Login/`audience` tekshiruvi (09_auth R53) — backend tomoni 09_auth epicida; bu yerda faqat klient tomonidagi rol tanlash **qobig'i**. * `openapi/common.yaml` + `openapi/v1/*.yaml` karkasi — buni kontrakt agenti (contract-freeze) yozadi va muzlatadi (swagger skill: kontraktni kodlovchi agent yozmaydi), shuning uchun Board'da alohida ish birligi qilib qo'yilmagan. * Prod serverga real deploy, domen, TLS sertifikat olish — VPS tayyor bo'lganda alohida ish; bu yerda faqat konfiguratsiya va lokal `docker compose up` isboti.

Texnik ko'rsatma

Agent uchun

Majburiy o'qish (har agent o'z repo'siniki): erp/docs/00_ARCHITECTURE.md (hamma — kanonik ADR) erp/docs/00_CROSS_CUTTING.md F, P (backend, devops) .claude/skills/coding/java-spring-coder/SKILL.md .claude/skills/coding/postgresql/SKILL.md .claude/skills/coding/vuejs-coder/SKILL.md .claude/skills/coding/flutter-coder/SKILL.md .claude/skills/coding/swagger/SKILL.md Buzilmas texnik qoidalar (ADR-001 AR-1…AR-12 dan): 1. Bitta DB, bitta `public` sxema. Kodda `tenant_id`, `search_path`, `SET LOCAL`, `t_<slug>` — UMUMAN uchramaydi (grep bilan tekshiriladi). Ilova bevosita PostgreSQL 5432 ga ulanadi. 2. Asinxron ish faqat DB outbox + `@Scheduled` worker; RabbitMQ, Redis, PgBouncer bog'liqligi pom/compose'da YO'Q. 3. Kesh faqat in-process (Caffeine) va hech qachon haqiqat manbai emas — restart hech narsani yo'qotmaydi (AR-4). 4. Wire format `snake_case`, pul/miqdor JSON'da string decimal, xatolik `{code, message, request_id, fields}` — swagger skill. 5. Bitta REST API, bitta OpenAPI kontrakt (`openapi/`), BFF yo'q; mobil ilova login'da `audience` yuboradi (09_auth R53). 6. Sirlar (`.env`, JWT kaliti, MinIO kaliti) commit'ga tushmaydi; `.env.example` — faqat kalit nomlari.

Qabul mezonlari (DoD)

0 / 6 bajarildi

  • 3 repo ham ko'tariladi: backend `/actuator/health` 200 (DB komponenti UP), web `npm run build`, mobile `flutter run` (emulator) muvaffaqiyatli

  • 3 repo ham o'z build va test buyrug'ida yashil: `mvn -q verify` / `npm run build && npm test` / `flutter analyze && flutter test`

  • Backend'da `tenant_id`, `search_path`, `SET LOCAL`, `PgBouncer`, `RabbitMQ`, `Redis` — grep 0 natija (izohlar ham)

  • Hech bir repo'da biznes jadvali yoki biznes endpoint'i yaratilmagan — skelet toza (`\dt` faqat `flyway_schema_history`)

  • `docker compose --profile prod up -d` (lokal) → postgres, app, minio, nginx sog'lom; `https://localhost/api/v1/actuator/health` nginx orqali 200

  • Sir (`.env`, kalit, token) birorta commit'ga tushmagan; `.env.example` bor

Ichki ishlar

4 ta

Izoh qoldirish

Tarix

8 yozuv

  • 💬

    finalize-ep-01 izoh qoldirdi

    EP-01 yakunlandi (release muhandisi). DRIFT: TOZA — scripts/openapi-diff.sh qat'iy rejimda (OPENAPI_GATE_STRICT=true) jonli /v3/api-docs ni muzlatilgan openapi/common.yaml (9d0b8ea) bilan solishtirdi -> chiqish kodi 0. Bu SKIPPED (kod 5) EMAS: OpenApiConfig'ning OpenApiCustomizer'i ErrorResponse/FieldValidationError/Page sxemalarini real endpoint'siz ham hujjatga chiqargani uchun solishtirish haqiqatan bajarildi. scripts/openapi-diff-selftest.sh 8/8 fixture o'tdi (yashil, qizil va SKIPPED holatlari isbotlandi). SIR TEKSHIRUVI: toza — GitHub token, AWS kalit, private key, haqiqiy JWT yo'q; .env.example fayllari faqat placeholder; .env va TLS kaliti uchala repo'da .gitignore ostida. MOCK: bu epicda prism ko'tarilmagan, :4010 porti bo'sh. PUSH: 3 ta feat branch push qilindi, main'ga TEGILMADI (082c085 / 99e2ffc / 567fb91 o'zgarmagan). PR ochildi, MERGE QILINMADI (foydalanuvchi qarori): erpbom-backend #1 https://github.com/AbdullayevDilshodbek/erpbom-backend/pull/1 (a60e45c) | erpbom-web #1 https://github.com/AbdullayevDilshodbek/erpbom-web/pull/1 (3baee36) | erpbom-mobile #1 https://github.com/AbdullayevDilshodbek/erpbom-mobile/pull/1 (8f9fbc6). OCHIQ QARZLAR: (1) CI hali haqiqiy GitHub runner'da yurgizilmagan; (2) nginx access_log presigned SigV4 imzoni yozadi; (3) uchidan-uchiga X-Request-Id yo'q. BLOKER YO'Q.

  • 💬

    team-lead-pm izoh qoldirdi

    EP-01 yakunida ochiq qolgan kuzatuvlar (keyingi epiclarga): 1) nginx access_log presigned imzoni (SigV4 query paramlarini) yozadi — havola log'ga tushib qoladi, ya'ni log o'qiy oladigan har kim faylni ola oladi. MinIO/observability ishida yopilsin: presigned query paramlar log'dan chiqarilsin. 2) Uchidan-uchiga X-Request-Id korrelyatsiyasi yo'q: backend request_id ni generatsiya qiladi, lekin nginx uni uzatmaydi/qayta ishlatmaydi va klientlar yubormaydi. Observability ishida yopilsin. 3) CI hali haqiqiy GitHub runner'da yurgizilmagan (hostda act yo'q) — lokal ekvivalent bilan isbotlangan. Birinchi haqiqiy run push bo'lgach ko'riladi; qizil chiqsa darhol tuzatilsin. 4) Drift gate CI da OPENAPI_GATE_STRICT kaliti bilan: default warn, epic yakunida true (D3 qarori, activity 327).

  • ⇄

    system statusni o'zgartirdi Ishlanyapti → Bajarildi

    Bolalardan avtomatik hisoblandi

  • 💬

    team-lead-pm izoh qoldirdi

    PM QARORI (D3 — drift siyosati, EP-01-T01-S04 dan): 'Kontraktda e'lon qilingan, lekin generatsiya qilingan hujjatda materializatsiya bo'lmagan sxema' holati QANDAY baholanadi: - Epic DAVOMIDA (worker/coder yurishlari): OGOHLANTIRISH — contract-first bo'yicha kontrakt endpointdan oldin yoziladi, shuning uchun to'liq materializatsiya kutilmaydi. - Epic YAKUNIDA (Faza D, epic-finalize): XATO — yopilayotgan epicda kontraktdagi har bir sxema kamida bitta endpoint orqali materializatsiya bo'lishi shart. Bo'lmasa: yo endpoint yozilmagan, yo kontraktda o'lik sxema bor — ikkalasi ham tuzatilishi kerak. Qolgan mos kelmasliklar (maydon nomi, tur, yo'qolgan/ortiqcha sxema) HAR DOIM xato. Bajaruvchi: T04-S03 (CI) gate'ni shu ikki rejim bilan chaqirsin; epic-finalize qat'iy rejimda yurgizsin.

  • 💬

    team-lead-pm izoh qoldirdi

    EP-01-T03 (mobile) yakuni — keyingi epiclarga meros qoldiqlar: 1) AC 137 (S02) is_met=false: ":4010 mock'ka qarshi so'rov" qismi kontrakt (T00) yo'qligi sabab bajarilmadi. T00 tayyor bo'lgach qayta tekshirilsin (T02 dagi mezon 125 bilan bir xil sabab). 2) 09_auth R33d qarzi: switchRole push_tokens ni tozalamaydi (FCM hali yo'q). 09_auth yoki 10_notifications epicida yopilsin. 3) freezed 3.2.5 + Dart 3.13: List-tipli union maydonlar uchun buzuq kod chiqaradi; @Freezed(makeCollectionsUnmodifiable: false) bilan aylanib o'tilgan, versiya S01 pin'ida. Freezed yangilanganda qayta ko'rilsin.

  • 💬

    team-lead-pm izoh qoldirdi

    T00 QARZLARI (birinchi feature epic kontrakt taskiga o'tkaziladi, EP-01-T02 dan): 1) Taxminiy wire shakllari — kontrakt yo'qligida 09_auth dan qo'lda chiqarilgan: access_token/refresh_token kalit nomlari; refresh so'rov tanasi {"refresh_token":...}; login javobida audience YO'Q (09_auth UC2 7-qadam uni qaytaradi deydi); expires_in yo'q. 2) sort parametri divergensiyasi: erpbom-web/src/shared/api/pagination.ts:16 bitta parametrga yopishtiradi (sort=name,asc,...), swagger standarti esa takrorlanuvchi parametr. T00 da hal qilinsin. 3) Mezon 125 qisman: jonli Prism mock (:4010) tekshirilmagan (kontrakt yo'q). T00 tayyor bo'lgach qayta tekshirilsin.

  • ⇄

    system statusni o'zgartirdi Backlog → Ishlanyapti

    Bolalardan avtomatik hisoblandi

  • ✦

    pm-agent yaratdi

    Bootstrap — 3 repo skeleti, umumiy qatlamlar va docker-compose muhiti

Ma'lumot

Agent
—
Olingan
—
Boshlandi
17.08.2026 10:46
Tugadi
17.08.2026 17:16
Baho
58 soat
Spec
erp/docs/00_ARCHITECTURE.md#2
Branch
—
Commit
—

Bog'liqliklar

Agent uchun

Bu ishni AI agent quyidagicha oladi:

curl -s -X POST https://pmboard.ferp.uz/api/items/EP-01/claim \
  -H "X-Agent: backend-dev-1"

Tugatgach:

curl -s -X POST https://pmboard.ferp.uz/api/items/EP-01/status \
  -H "X-Agent: backend-dev-1" \
  -H "Content-Type: application/json" \
  -d '{"status":"review","note":"..."}'