Files
cannamanage/docs/sprint-14/cannamanage-sprint14-plan-review.md
Patrick Plate dad798a904
Deploy to TrueNAS / deploy (push) Failing after 33s
feat: Sprint 14 — Marketing & Monetization
- Landing page with hero, feature grid, trust signals
- Split-layout login redesign (admin + portal)
- Pricing page with storage tiers (5GB/50GB/unlimited)
- StorageQuotaService backend (V36 migration, 402 on exceeded)
- Frontend storage integration + 402 error handling
- StorageController uses TenantContext for tenant isolation
- onTierChange() hook for subscription tier updates
2026-06-18 20:28:35 +02:00

87 lines
4.6 KiB
Markdown

# Plan Review: Sprint 14 — Marketing & Monetization
**Date:** 2026-06-18
**Module:** cannamanage (full-stack)
**Reviewer:** Lumen (Plan Reviewer)
**Documents:** analysis v1, plan v2, testplan v2
**Verdict:** ✅ APPROVED
---
## Summary
Re-review after v1 findings were addressed. All 4 findings (1 blocker, 3 warnings) from the v1 review have been properly resolved in v2. The plan is complete, correct, and ready for implementation.
## v1 Finding Resolution
| # | v1 Finding | Resolution in v2 | Status |
|---|-----------|------------------|--------|
| 1 | ❌ `QuotaExceededException` naming conflict | Renamed to `StorageQuotaExceededException` in Step 4.4 with explicit note about existing class | ✅ Fixed |
| 2 | ⚠️ No sync for `storage_limit_bytes` on tier change | Added Step 4.9 `onTierChange()` hook in `SubscriptionService` | ✅ Fixed |
| 3 | ⚠️ English i18n keys not specified | Step 1.3 now states both `de.json` and `en.json` must receive equivalent keys; T-32 tests both | ✅ Fixed |
| 4 | ⚠️ `extractClubId(user)` not defined | Step 4.5 now has full implementation with Javadoc referencing `DocumentController` pattern | ✅ Fixed |
## Reviewed Documents
| Document | Version | Assessment |
|----------|---------|-----------|
| Analysis | v1 | ✅ |
| Plan | v2 | ✅ |
| Testplan | v2 | ✅ |
## Checklist
### Assessment
| # | Check | Result | Note |
|---|-------|--------|------|
| 1 | Problem statement complete | ✅ | Clear: no landing page, no quota enforcement, basic login UI |
| 2 | Affected components identified | ✅ | 15 components listed (was 14, +1 for new `StorageQuotaExceededException`) |
| 3 | Current state accurate | ✅ | Confirmed: no `(marketing)/page.tsx`, nav is hardcoded, V35 is latest migration |
| 4 | Risk assessment realistic | ✅ | 5 risks with appropriate mitigations |
| 5 | Solution options evaluated | ✅ | 3 options with effort estimates, Option A justified |
### Implementation Plan
| # | Check | Result | Note |
|---|-------|--------|------|
| 6 | All requirements covered | ✅ | All 4 areas: landing, login, pricing, storage quota |
| 7 | Correct patterns referenced | ✅ | `NextIntlClientProvider`, Spring `@Service`, `@PreAuthorize`, `CustomUserDetails` cast pattern |
| 8 | File paths correct | ✅ | All verified against codebase |
| 9 | Implementation order logical | ✅ | Frontend (phases 1-3) → backend (phase 4) → integration (phase 5) |
| 10 | No gaps in steps | ✅ | Migration → entity → service → controller → exception → security config → tier-sync — complete chain |
| 11 | Flyway migrations planned | ✅ | V36 correct next number, H2-only appropriate for this project |
| 12 | Error handling planned | ✅ | 402 with RFC 9457 ProblemDetail, floor-at-zero for decrements |
| 13 | No scope creep | ✅ | Explicitly defers overage billing and email notifications |
### Testplan
| # | Check | Result | Note |
|---|-------|--------|------|
| 14 | Coverage complete | ✅ | Every plan step has ≥1 test. 32 tests across 4 areas. |
| 15 | Test types appropriate | ✅ | E2E for UI (Playwright), Unit for service logic, Integration for controllers |
| 16 | Edge cases covered | ✅ | Floor-at-zero (T-19), exactly-at-limit (T-15c, T-16b), near-limit thresholds |
| 17 | Test class naming correct | ✅ | `StorageQuotaServiceTest`, `StorageControllerTest`, `DocumentServiceTest` |
| 18 | Test method naming correct | ✅ | `testGetUsage_calculatesCorrectly()`, `testCheckQuota_overLimit_throwsQuotaExceeded()` |
| 19 | Test data defined | ✅ | Explicit UUIDs, byte values, and preconditions documented |
| 20 | SSH/manual tests identified | N/A | Not a PAISY project |
## Traceability Matrix
| Acceptance Criterion | Plan Step | Test Case(s) | Status |
|---------------------|-----------|-------------|--------|
| AC1: Landing page renders | Step 1.1 | T-01 | ✅ Covered |
| AC2: Landing responsive + dark/light | Step 1.1 | T-02, T-03 | ✅ Covered |
| AC3: Admin login split layout | Steps 2.1, 2.2 | T-06, T-07, T-08 | ✅ Covered |
| AC4: Portal login member-themed | Step 2.3 | T-09, T-10 | ✅ Covered |
| AC5: Pricing shows storage | Steps 3.1-3.3 | T-11, T-12 | ✅ Covered |
| AC6: Pricing FAQ storage | Step 3.4 | T-13 | ✅ Covered |
| AC7: GET /api/v1/storage/usage | Steps 4.3, 4.5 | T-23, T-24, T-25 | ✅ Covered |
| AC8: Upload rejected 402 | Steps 4.3, 4.6, 4.7 | T-16, T-27, T-31 | ✅ Covered |
| AC9: Delete decrements counter | Step 4.6 | T-18, T-28 | ✅ Covered |
| AC10: Backfill on migration | Step 4.1 | T-29, T-30 | ✅ Covered |
## Verdict
**✅ APPROVED** — All 20 checklist items pass. All 4 v1 findings resolved. Plan is complete, correct, and ready for implementation. Recommend GO.