Sub-task EP-04-T12-S01 Yuqori 09_auth erpbom-backend

Markaziy mexanizm — ownership deny uchun sinxron audit yo'li

Bajarildi
Status:

Tavsif

Egalik tekshiruvi rad etganda `auth_logs` ga `deny` yozadigan YAGONA yo'l qurilsin — har servisda qo'lda `AuditService` chaqirish emas. Tavsiya etilgan yechim (coder tanlashi mumkin, lekin markazlashgan bo'lishi shart): ownership tekshiruvlari umumiy istisno turini (`OwnershipDeniedException` yoki mavjud `AccessDeniedException` ning maxsus turi) otsin, uni BITTA `@ExceptionHandler` ushlab, amal tranzaksiyasi bilan birga sinxron audit yozuvi qilsin va so'ngra mavjud HTTP kodini qaytarsin. Majburiy: R30(4) fail-loud — audit yozuvining O'ZI istisno bilan tugasa so'rov `500` bilan tugaydi, `403`/`404` qaytarilmaydi. DIQQAT: HTTP javob kodlari o'zgarmasin. `GET /purchase-receipts/{id}` begona ta'minotchiga hozir `404` qaytaradi (mavjudlikni oshkor qilmaslik uchun, kontrakt warehouse.yaml:989-990) — bu saqlanadi; audit yozuvi qo'shiladi, javob emas.

Qabul mezonlari (DoD)

5 / 5 bajarildi

  • Egalik rad etilganda `auth_logs` ga `result='deny'` qatori SINXRON yoziladi (amal tranzaksiyasi bilan birga) — integratsiya testi qatorni DB dan o'qib tekshiradi

    qa-ep-04-t12-s01 · 1 о аввал

  • Yozuvda R30 taqiqlagan maydonlar YO'Q: parol, `password_hash`, `refresh_token_hash`, token, `Authorization` header (AC18)

    qa-ep-04-t12-s01 · 1 о аввал

  • R30(4) fail-loud: audit yozuvi istisno bersa so'rov `500` bilan tugaydi va `403`/`404` QAYTARILMAYDI — test buni aniq tekshiradi

    qa-ep-04-t12-s01 · 1 о аввал

  • HTTP javob kodlari o'zgarmagan: `GET /purchase-receipts/{id}` begona ta'minotchiga hamon `404`, kontraktga (warehouse.yaml:989-990) mos

    qa-ep-04-t12-s01 · 1 о аввал

  • Mexanizm markazlashgan: yangi ownership tekshiruvi qo'shilganda qo'shimcha audit kodi YOZILMASDAN jurnalga tushadi — mutatsiya bilan tasdiqlanadi (markaziy handler o'chirilsa test qizaradi)

    qa-ep-04-t12-s01 · 1 о аввал

O'zgargan fayllar

6 ta

  • modified src/test/java/uz/erpbom/common/storage/FileDownloadServiceTest.java
  • modified src/test/java/uz/erpbom/auth/service/LoginRateLimitServiceTest.java
  • modified src/test/java/uz/erpbom/common/exception/OwnershipDeniedExceptionIntegrationTest.java
  • modified src/test/java/uz/erpbom/common/exception/OwnershipDeniedTestController.java
  • modified src/main/java/uz/erpbom/common/exception/GlobalExceptionHandler.java
  • modified src/main/java/uz/erpbom/common/exception/OwnershipDeniedException.java

Izoh qoldirish

Tarix

19 yozuv

  • ✎

    finalize-ep-04 yangiladi

    Yangilandi: commit_sha, pr_url

  • 💬

    qa-ep-04-t12-s01 izoh qoldirdi

    QA (mustaqil tekshiruv, commit a8b24df): 5/5 mezon TASDIQLANDI, testlar yashil. - 2575: GlobalExceptionHandler.java:136 auditService.log(...) SINXRON — AuditServiceImpl hech qanday @Async/REQUIRES_NEW ochmaydi, to'g'ridan-to'g'ri AuthLogRepository.insert. Integratsiya testi qatorni HAQIQATAN DB dan o'qiydi (JDBC "SELECT * FROM auth_logs"), mock EMAS. - 2576/AC18: test row'ning HAMMA ustunini regexp bilan skanerlaydi. Tautologik EMAS — mutatsiya bilan tekshirildi: handlerga .userAgent("Authorization: Bearer ...") qo'yilganda test QIZARDI ("ustun user_agent qiymati maxfiy ko'ringan qism tutadi"). - 2577: fail-loud haqiqiy HTTP orqali — user_id=999999 (mavjud emas) fk_auth_logs_user ni buzadi; javob 500 INTERNAL_ERROR, tanada NOT_FOUND YO'Q, va auth_logs da qator commit BO'LMAGAN. try/catch + handleUnexpected(...) yo'li to'g'ri (ExceptionHandlerExceptionResolver ichki istisnoni yutishi haqiqatan mavjud nozik joy). - 2578: PurchaseReceiptSelfControllerIntegrationTest#foreignPartnerCannotSeeOrConfirmAnotherSuppliersReceipt qayta yurgizildi — 404 o'zgarishsiz (warehouse.yaml:989-990 ga mos). Bu subtask PurchaseReceiptService ga TEGMAGAN (S02 zonasi saqlangan). - 2579: MUTATSIYA TAJRIBASI — markaziy @ExceptionHandler dagi auditService.log(...) o'chirildi ("if (false) ..."): 4/4 test QIZARDI. javap bilan tasdiqlandi: target/classes ichida handleOwnershipDenied da AuditService.log chaqiruvi 0 marta (mutatsiya haqiqatan kompilyatsiya qilingan — soxta "survived" EMAS). git checkout bilan tiklandi, fayl commit bilan bayt-bayt bir xil, qayta yurgizishda 4/4 yashil. Qo'shimcha: - Testcontainers OGOHLANTIRISHI NOTO'G'RI edi: repo'da Testcontainers 1.21.4 BOR (pom.xml:141-155) va ishlaydi — test EFEMER postgres:16 konteyner ko'taradi + Flyway migratsiyalari to'liq yuriladi; jonli erpbom-dev-postgres ga URMAYDI. Ya'ni 2575 da'vosi real DB ustida asosli. - new GlobalExceptionHandler(null): ZARARSIZ, maskirovka qilingan defekt EMAS. Bu ikki test faqat handleAccountLocked(...) / handleFileMissing(...) ni chaqiradi — ular auditService ga umuman tegmaydi. Audit yo'li esa real Spring kontekstda, real AuditService bean bilan qoplangan. Har ikkala test yashil (8 + 5). - Markazlashganlik kod bilan ham tasdiqlandi: main'da AuditService.log ning yagona boshqa chaqiruv joyi — RequirePermissionAspect.java:51 (RULE darajasi, EP-09); ownership uchun hech bir servisda qo'lda audit YO'Q. Kichik kuzatuv (defekt EMAS, bloklamaydi): handleOwnershipDenied javadoc'i (GlobalExceptionHandler.java ~104-106) yozuv "ambient tranzaksiya kontekstida" bajariladi deydi — aslida @ExceptionHandler ishga tushganda amal tranzaksiyasi allaqachon tugagan/rollback bo'lgan, shu sabab deny qatori o'z auto-commit tranzaksiyasida yoziladi. Bu AYNAN to'g'ri xatti-harakat (aks holda deny yozuvi rollback bilan yo'qolardi) va R30(1) "sinxron" talabini buzmaydi — faqat javadoc formulirovkasi noaniq.

  • ⇄

    qa-ep-04-t12-s01 statusni o'zgartirdi Review → Bajarildi

  • ✓

    qa-ep-04-t12-s01 qabul mezonini belgiladi

    ✓ Mexanizm markazlashgan: yangi ownership tekshiruvi qo'shilganda qo'shimcha audit kodi YOZILMASDAN jurnalga tushadi — mutatsiya bilan tasdiqlanadi (markaziy handler o'chirilsa test qizaradi)

  • ✓

    qa-ep-04-t12-s01 qabul mezonini belgiladi

    ✓ HTTP javob kodlari o'zgarmagan: `GET /purchase-receipts/{id}` begona ta'minotchiga hamon `404`, kontraktga (warehouse.yaml:989-990) mos

  • ✓

    qa-ep-04-t12-s01 qabul mezonini belgiladi

    ✓ R30(4) fail-loud: audit yozuvi istisno bersa so'rov `500` bilan tugaydi va `403`/`404` QAYTARILMAYDI — test buni aniq tekshiradi

  • ✓

    qa-ep-04-t12-s01 qabul mezonini belgiladi

    ✓ Yozuvda R30 taqiqlagan maydonlar YO'Q: parol, `password_hash`, `refresh_token_hash`, token, `Authorization` header (AC18)

  • ✓

    qa-ep-04-t12-s01 qabul mezonini belgiladi

    ✓ Egalik rad etilganda `auth_logs` ga `result='deny'` qatori SINXRON yoziladi (amal tranzaksiyasi bilan birga) — integratsiya testi qatorni DB dan o'qib tekshiradi

  • ⇄

    coder-ep-04-t12-s01 statusni o'zgartirdi Ishlanyapti → Review

  • ✎

    coder-ep-04-t12-s01 yangiladi

    Yangilandi: branch, commit_sha

  • ✓

    coder-ep-04-t12-s01 qabul mezonini belgiladi

    ✓ Mexanizm markazlashgan: yangi ownership tekshiruvi qo'shilganda qo'shimcha audit kodi YOZILMASDAN jurnalga tushadi — mutatsiya bilan tasdiqlanadi (markaziy handler o'chirilsa test qizaradi)

  • ✓

    coder-ep-04-t12-s01 qabul mezonini belgiladi

    ✓ HTTP javob kodlari o'zgarmagan: `GET /purchase-receipts/{id}` begona ta'minotchiga hamon `404`, kontraktga (warehouse.yaml:989-990) mos

  • ✓

    coder-ep-04-t12-s01 qabul mezonini belgiladi

    ✓ R30(4) fail-loud: audit yozuvi istisno bersa so'rov `500` bilan tugaydi va `403`/`404` QAYTARILMAYDI — test buni aniq tekshiradi

  • ✓

    coder-ep-04-t12-s01 qabul mezonini belgiladi

    ✓ Yozuvda R30 taqiqlagan maydonlar YO'Q: parol, `password_hash`, `refresh_token_hash`, token, `Authorization` header (AC18)

  • ✓

    coder-ep-04-t12-s01 qabul mezonini belgiladi

    ✓ Egalik rad etilganda `auth_logs` ga `result='deny'` qatori SINXRON yoziladi (amal tranzaksiyasi bilan birga) — integratsiya testi qatorni DB dan o'qib tekshiradi

  • 📄

    coder-ep-04-t12-s01 fayllarni qayd etdi

    6 ta fayl qayd etildi

  • ⇄

    coder-ep-04-t12-s01 statusni o'zgartirdi Backlog → Ishlanyapti

    Agent ishni boshladi

  • ⚑

    coder-ep-04-t12-s01 ishga oldi

  • ✦

    team-lead yaratdi

    Markaziy mexanizm — ownership deny uchun sinxron audit yo'li

Ma'lumot

Agent
coder-ep-04-t12-s01
Olingan
1 о аввал
Boshlandi
21.08.2026 05:38
Tugadi
21.08.2026 06:18
Baho
4 soat
Spec
docs/modules/09_auth.md — R30 (1)/(4)
Branch
feat/EP-04-erpbom-backend
Commit
b6685d9b9b72

Bog'liqliklar

Bundan oldin tugashi kerak

Yo'q — bu ish mustaqil.

Agent uchun

Bu ishni AI agent quyidagicha oladi:

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

Tugatgach:

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