Internal ID: #51
Imported from ISSUES.md via scripts/import-issues.mjs.
Problem Statement. backend/src/progress/progress.service.ts:
const percentComplete = (progress.completedPuzzles / progress.totalPuzzles) * 100;
progress.percentComplete = parseFloat(percentComplete.toFixed(2));
await this.progressRepo.save(progress);
Every read is also a write. Under load this multiplies DB traffic.
Expected Outcome.
- Percent is computed inline at read time (it's a derived field); remove
percentComplete from persistence or compute via DB computed column.
- Or: maintain
lastUpdated from totals change.
Acceptance Criteria.
- No write on read. Load test confirms.
Implementation Notes.
- Add
@AfterLoad hook (progress.percentComplete = compute(...)).
Files / modules affected.
backend/src/progress/progress.service.ts
backend/src/progress/progress.entity.ts
Dependencies. None.
Difficulty / Effort. Easy / S (≈ 2 hours).
Labels. area:backend, performance, tech-debt
Problem Statement.
backend/src/progress/progress.service.ts:Every read is also a write. Under load this multiplies DB traffic.
Expected Outcome.
percentCompletefrom persistence or compute via DB computed column.lastUpdatedfromtotalschange.Acceptance Criteria.
Implementation Notes.
@AfterLoadhook (progress.percentComplete = compute(...)).Files / modules affected.
backend/src/progress/progress.service.tsbackend/src/progress/progress.entity.tsDependencies. None.
Difficulty / Effort. Easy / S (≈ 2 hours).
Labels.
area:backend,performance,tech-debt