refactor(backend/api): extract VVTService (Step 4 — file 5 of 18)

compliance/api/vvt_routes.py (550 LOC) -> 225 LOC thin routes + 475-line
VVTService. Covers the organization header, processing activities CRUD,
audit log, JSON/CSV export, stats, and version lookups for the Art. 30
DSGVO Verzeichnis.

Single-service split: organization + activities + audit + stats all
revolve around the same tenant's VVT document, and the existing test
suite (tests/test_vvt_routes.py — 768 LOC, tests/test_vvt_tenant_isolation.py
— 205 LOC) exercises them together.

Module-level helpers (_activity_to_response, _log_audit, _export_csv)
stay module-level in compliance.services.vvt_service and are re-exported
from compliance.api.vvt_routes so the two test files keep importing
from the old path.

Pydantic schemas already live in compliance.schemas.vvt from Step 3 —
no new schema file needed this round.

mypy.ini flips compliance.api.vvt_routes from ignore_errors=True to
False. Two SQLAlchemy Column[str] vs str dict-index errors fixed with
explicit str() casts on status/business_function in the stats loop.

Verified:
  - 242/242 pytest (173 core + 69 VVT integration) pass
  - OpenAPI 360/484 unchanged
  - mypy compliance/ -> Success on 128 source files
  - vvt_routes.py 550 -> 225 LOC
  - vvt_service.py 475 LOC (under 500 hard cap)
  - Hard-cap violations: 14 -> 13

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sharang Parnerkar
2026-04-07 19:50:40 +02:00
parent f39c7ca40c
commit 4fa0dd6f6d
4 changed files with 587 additions and 425 deletions

View File

@@ -44708,7 +44708,11 @@
"200": {
"content": {
"application/json": {
"schema": {}
"schema": {
"additionalProperties": true,
"title": "Response Delete Activity Api Compliance Vvt Activities Activity Id Delete",
"type": "object"
}
}
},
"description": "Successful Response"
@@ -44940,7 +44944,9 @@
"200": {
"content": {
"application/json": {
"schema": {}
"schema": {
"title": "Response List Activity Versions Api Compliance Vvt Activities Activity Id Versions Get"
}
}
},
"description": "Successful Response"
@@ -45023,7 +45029,9 @@
"200": {
"content": {
"application/json": {
"schema": {}
"schema": {
"title": "Response Get Activity Version Api Compliance Vvt Activities Activity Id Versions Version Number Get"
}
}
},
"description": "Successful Response"
@@ -45193,7 +45201,9 @@
"200": {
"content": {
"application/json": {
"schema": {}
"schema": {
"title": "Response Export Activities Api Compliance Vvt Export Get"
}
}
},
"description": "Successful Response"