Last updated: 2026-02-23
Clearfolio Viewer is an MVP backend that accepts document uploads, processes conversion asynchronously, exposes conversion status, and serves viewer bootstrap metadata when conversion succeeds.
Runtime stance: Spring WebFlux is adopted as the current non-blocking web runtime (Servlet/MVC path is not the selected implementation for this repo).
S2S chain (target integration path): Clearfolio Viewer <-> internal WAS -> Azure On-premise Gateway -> Power Platform -> mobile/tablet.
Current state: viewer/state API is implemented in this repository; downstream S2S orchestration remains planned and documented.
ConversionController(src/main/java/com/clearfolio/viewer/controller/ConversionController.java)POST /api/v1/convert/jobs: async submit contract.POST /api/v1/convert/jobs/{jobId}/retry: operator retry for dead-lettered jobs.GET /api/v1/convert/jobs/{jobId}: status polling.GET /api/v1/viewer/{docId}(+ alias): viewer bootstrap JSON/state-gated responses.
ViewerUiController(src/main/java/com/clearfolio/viewer/controller/ViewerUiController.java)GET /viewer/{docId}: HTML viewer UI entrypoint (loading/failed/ready) that embeds PDF.js.
ArtifactController(src/main/java/com/clearfolio/viewer/controller/ArtifactController.java)GET /artifacts/{docId}.pdf: serves PDF bytes for SUCCEEDED jobs with basic HTTP Range support.
DefaultDocumentConversionService(src/main/java/com/clearfolio/viewer/service/DefaultDocumentConversionService.java)- Validation, content hash generation, dedupe lookup, repository persistence, worker enqueue.
- PDF passthrough: uploads that declare PDF (extension/content type) and carry the
%PDF-magic header are seeded into the artifact store as-is, so the original bytes are served instead of a generated placeholder.
DefaultDocumentValidationService(src/main/java/com/clearfolio/viewer/service/DefaultDocumentValidationService.java)- Enforces extension blocklist and size limits, including auditable policy-override exception lane.
DefaultConversionWorker(src/main/java/com/clearfolio/viewer/service/DefaultConversionWorker.java)- Runs conversion on a bounded executor with retry scheduling and dead-letter fallback.
ArtifactStore(src/main/java/com/clearfolio/viewer/artifact/ArtifactStore.java)- Stores converted PDF bytes by docId.
FileSystemArtifactStore(src/main/java/com/clearfolio/viewer/artifact/FileSystemArtifactStore.java)- Default disk-backed artifact store; persists bytes plus minimal metadata under
clearfolio.artifact-store.root-dir(defaultdata/artifacts) so artifacts survive restarts, with an in-memory cache on the read path.
- Default disk-backed artifact store; persists bytes plus minimal metadata under
InMemoryArtifactStore(src/main/java/com/clearfolio/viewer/artifact/InMemoryArtifactStore.java)- In-memory artifact store implementation used by tests and
clearfolio.artifact-store.mode=in-memory.
- In-memory artifact store implementation used by tests and
ArtifactStoreConfig(src/main/java/com/clearfolio/viewer/config/ArtifactStoreConfig.java)- Selects the artifact store implementation from
ArtifactStoreProperties.
- Selects the artifact store implementation from
PdfBoxArtifactGenerator(src/main/java/com/clearfolio/viewer/artifact/PdfBoxArtifactGenerator.java)- Generates a placeholder one-page PDF via PDFBox for non-PDF sources; real docx/hwp conversion remains future work.
InMemoryConversionJobRepository(src/main/java/com/clearfolio/viewer/repository/InMemoryConversionJobRepository.java)- In-memory job store and content-hash dedupe index.
ConversionJob(src/main/java/com/clearfolio/viewer/model/ConversionJob.java)- Domain lifecycle and retry metadata (
attemptCount,maxAttempts,retryAt,deadLettered) plus manual dead-letter retry transition.
- Domain lifecycle and retry metadata (
ViewerBootstrapResponse(src/main/java/com/clearfolio/viewer/api/ViewerBootstrapResponse.java)- Includes deterministic
sourceExtensionandrendererAdaptermetadata for viewer adapter bootstrap.
- Includes deterministic
- Status values:
SUBMITTED,PROCESSING,SUCCEEDED,FAILED. - Retry-exhausted terminal state remains
FAILEDand is identified bydeadLettered=true.
- Build and test gates are defined in
AGENTS.mdand include:mvn -DskipTests compilemvn test- JaCoCo line/branch 100% for
com.clearfolio.viewer.* - JavaDoc gate:
mvn -q -DskipTests javadoc:javadoc - Markdown lint for changed docs
Mandatory AC list (exact):
- coverage
- docstring
- non-blocking web
- lightweight queue
- warning 0
- deprecated 0
- 1-day schedule+security verification
Optional tracks:
- client DB pooler
- PostgreSQL 17
docs/architecture.mddocs/prd-integrated-document-viewer-platform.mddocs/trd-integrated-document-viewer-platform.mddocs/diagrams/submit-flow.mddocs/diagrams/submit-policy-adapter-flow.mddocs/diagrams/status-flow.mddocs/diagrams/preview-flow.mddocs/diagrams/retry-deadletter-flow.mddocs/engineering/acceptance-criteria.mddocs/workflow/one-day-delivery-plan.md