- l3-backend-3b: extend DocumentController description to include the per-month density aggregation endpoint. - l3-frontend-3b: add /documents/+page.ts (client-side gated loader) and TimelineDensityFilter component, plus relationships to the density endpoint and the search dashboard. Per Markus' follow-up §5: both diagrams are mandatory before merge. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
41 lines
3.3 KiB
Plaintext
41 lines
3.3 KiB
Plaintext
@startuml
|
|
!include <C4/C4_Component>
|
|
|
|
title Component Diagram: API Backend — Document Management & Import
|
|
|
|
Container(frontend, "Web Frontend", "SvelteKit")
|
|
ContainerDb(db, "PostgreSQL", "PostgreSQL 16")
|
|
ContainerDb(minio, "Object Storage", "MinIO (S3-compatible)")
|
|
|
|
System_Boundary(backend, "API Backend (Spring Boot)") {
|
|
Component(docCtrl, "DocumentController", "Spring MVC — /api/documents", "CRUD for documents: search, get by ID, update metadata, upload/download file, conversation thread, batch metadata updates, and per-month density aggregation for the timeline filter widget.")
|
|
Component(adminCtrl, "AdminController", "Spring MVC — /api/admin", "Triggers asynchronous Excel/ODS mass import (requires ADMIN permission). Reports import state (IDLE/RUNNING/DONE/FAILED).")
|
|
Component(docSvc, "DocumentService", "Spring Service", "Core document business logic: store, update, search. Resolves persons and tags, delegates file I/O to FileService, builds dynamic JPA Specifications, and integrates with audit logging.")
|
|
Component(fileSvc, "FileService", "Spring Service", "Wraps AWS SDK v2 S3Client. Uploads files with UUID-keyed paths, computes SHA-256 hash, downloads with content-type detection, and generates presigned URLs for OCR access.")
|
|
Component(massImport, "MassImportService", "Spring Service — @Async", "Reads Excel/ODS files from /import mount. Tracks import state (IDLE/RUNNING/DONE/FAILED) and delegates to ExcelService. Returns immediately; processing runs asynchronously.")
|
|
Component(excelSvc, "ExcelService", "Spring Service", "Parses Excel/ODS workbooks (Apache POI). Column indices configurable via application.properties. Creates/updates document records per row.")
|
|
Component(minioConf, "MinioConfig", "Spring @Configuration", "Creates the S3Client and S3Presigner beans with path-style access for MinIO. Validates MinIO connectivity on startup.")
|
|
Component(docRepo, "DocumentRepository", "Spring Data JPA", "Queries documents with Specification-based dynamic search, bidirectional conversation thread queries, full-text search with ranking and match highlighting, and transcription pipeline queue projections.")
|
|
Component(docSpec, "DocumentSpecifications", "JPA Criteria API", "Factory for composable predicates: hasText (full-text), hasSender, hasReceiver, isBetween (date range), hasTags (subquery AND/OR logic).")
|
|
}
|
|
|
|
Component(personSvc, "PersonService", "Spring Service", "See diagram 3e. Called by DocumentService to resolve sender / receiver persons by ID.")
|
|
Component(tagSvc, "TagService", "Spring Service", "See diagram 3d. Called by DocumentService to find or create tags by name.")
|
|
|
|
Rel(frontend, docCtrl, "Document requests", "HTTP / JSON")
|
|
Rel(frontend, adminCtrl, "Trigger import", "HTTP / JSON")
|
|
Rel(docCtrl, docSvc, "Delegates to")
|
|
Rel(adminCtrl, massImport, "Triggers")
|
|
Rel(docSvc, fileSvc, "Upload / download files")
|
|
Rel(docSvc, docRepo, "Reads / writes documents")
|
|
Rel(docSvc, docSpec, "Builds search predicates")
|
|
Rel(docSvc, personSvc, "Resolves sender / receivers")
|
|
Rel(docSvc, tagSvc, "Finds or creates tags")
|
|
Rel(massImport, excelSvc, "Parses Excel/ODS file")
|
|
Rel(excelSvc, docSvc, "Creates / updates documents")
|
|
Rel(minioConf, fileSvc, "Provides S3Client and S3Presigner beans")
|
|
Rel(fileSvc, minio, "PUT / GET / presigned URL objects", "S3 API / HTTP")
|
|
Rel(docRepo, db, "SQL queries", "JDBC")
|
|
|
|
@enduml
|