mitai-jinkendo/.claude/docs/working/gitea-close-2026-07-23/comment-37.md
Lars 79ec249bc3
Some checks failed
Deploy Development / deploy (push) Successful in 1m9s
Build Test / pytest-backend (push) Failing after 5s
Build Test / lint-backend (push) Successful in 0s
Build Test / build-frontend (push) Successful in 24s
feat: feature enforcement imports (#37/#38) and Universal CSV validation (#71)
Activity and nutrition legacy CSV imports enforce tier limits with UsageBadge UI; Universal CSV gets mapping validation on copy/import, format-check parity, and structured error_details.

version: 0.9u
module: activity 1.2.1, nutrition 1.0.3, csv_import 0.4.0
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-24 16:59:12 +02:00

1.2 KiB

Umsetzung 2026-07-23 (nach Architektur-Abgleich)

Architektur-Check vor Implementierung

  • Phase C (Schreibpfad): laut ACTIVITY_PRODUCTION_ARCHITECTURE_AND_PHASES.md bereits erledigt (Sync abgestellt, Orchestrator als SSoT, keine Aufrufer von sync_column_backed_session_metrics). Keine Doppel-Implementierung.
  • Feature-ID: Issue-Vorgabe activity_entries (nicht separates activity_import) — konsistent mit create_activity und Universal-CSV-Modul-Check in csv_import.py.
  • Legacy-Endpoint bleibt: Frontend nutzt weiterhin POST /api/activity/import-csv (ActivityPage Apple-Health-Panel); Universal-Pfad ist parallel (ARCH §8.2).

Änderungen

Backend (routers/activity.py):

  • check_feature_access(pid, "activity_entries") vor Legacy-Import
  • HTTP 403 bei Limit (wie nutrition/import-csv)
  • increment_feature_usage pro neu eingefügter Zeile (inserted)

Frontend (ActivityPage.jsx ImportPanel):

  • UsageBadge am Import-Titel
  • Drop-Zone deaktiviert bei Limit
  • Usage-Reload nach Import

Tests: tests/test_activity_import_feature_enforcement.py (403 + Increment)

Regression INSERT-SQL: tests/test_activity_insert_sql.py (grün)