4.7 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Development Commands
- Start development server:
./mvnw(runs Spring Boot with Vaadin dev mode) - Build for production:
./mvnw -Pproduction package - Clean build:
./mvnw clean compile - Format code:
./mvnw spotless:apply(applies Eclipse formatter for Java, Prettier for TypeScript) - Check formatting:
./mvnw spotless:check
Architecture Overview
This is a Vaadin Spring Boot application for job/task management with real-time mobile app communication via a pluggable messaging transport layer. The system manages logistics jobs with tasks that mobile app users complete.
Core Architecture Layers
Frontend: Vaadin Flow views (server-side rendered)
src/main/java/de/assecutor/votianlt/pages/view/- Main UI viewssrc/main/java/de/assecutor/votianlt/pages/base/ui/- Shared UI components
Backend Services:
src/main/java/de/assecutor/votianlt/service/- Business logicsrc/main/java/de/assecutor/votianlt/controller/- Message handling (routes inbound messages to processors)src/main/java/de/assecutor/votianlt/repository/- MongoDB data access
Messaging Layer (src/main/java/de/assecutor/votianlt/messaging/):
plugin/- Transport plugin interface and implementations (MQTT, extensible for WebSocket, gRPC)delivery/- Reliable message delivery with acknowledgment tracking, retries, and expirymodel/- Message envelopes, delivery status, pending deliveriesconfig/- Messaging configuration and wiring
Models:
src/main/java/de/assecutor/votianlt/model/- Domain entities- Task hierarchy:
BaseTaskwith subtypes (PhotoTask,BarcodeTask,SignatureTask, etc.)
Key Architectural Patterns
Job-Task Relationship: Jobs contain multiple ordered tasks. Tasks have completion states and can store completion data (photos, barcodes, signatures).
User Hierarchy:
User- Web interface users (job managers)AppUser- Mobile app users (task executors)AppUser.ownerfield links toUserfor notifications
Messaging Plugin Architecture:
MessagingPlugininterface abstracts transport protocols (currently MQTT via HiveMQ)MessageDeliveryServiceprovides guaranteed delivery with acknowledgment trackingAcknowledgmentHandlerprocesses ACKs and updates delivery status- Plugins are responsible for topic/channel structure; delivery layer uses
clientIdandmessageType
Client Connection Monitoring:
ClientConnectionServicetracks connected mobile clients via ping/pong mechanism- Server sends ping to
/client/{clientId}/ping, client responds on/server/{clientId}/pong
History Tracking: JobHistoryService logs all job/task changes with detailed audit trail displayed in JobHistoryView.
Email Notifications: EmailService sends notifications for job creation, task completion, and job completion using Spring Mail with SMTP.
Data Storage
MongoDB Collections:
jobs- Main job entities with status trackingtasks- Polymorphic task storage (discriminated bytaskType)job_history- Audit trail for all job changespending_deliveries- Message delivery tracking for retriesphotos,barcodes,signatures- Task completion datausers- Web interface usersapp_user- Mobile app userscargo_item- Job cargo/delivery items
Configuration
Database: MongoDB (configurable via spring.data.mongodb.uri)
Messaging: Plugin-based, currently MQTT via HiveMQ (app.messaging.plugin.* properties)
Email: SMTP via Spring Boot mail auto-configuration
Development Environment
Java 21 with Spring Boot 3.4.3 and Vaadin 24.7.0
Security: Spring Security with role-based access (USER role required)
Formatting: Spotless Maven plugin with Eclipse formatter (Java) and Prettier (TypeScript)
Profiles: production profile for optimized builds, integration-test profile for failsafe plugin
Key Integration Points
When adding new task types:
- Extend
BaseTaskand add to@JsonSubTypes - Add completion logic in
MessageController.handleTaskCompleted() - Update
JobHistoryViewfor task-specific previews if needed
When modifying job status flow:
- Update
JobStatusenum - Modify
EmailService.updateJobStatusToCompleted()logic - Consider email notification templates
When adding new messaging transports:
- Implement
MessagingPlugininterface - Register in
PluginMessagingConfig - Add configuration properties under
app.messaging.plugin.<type>.*
Message routing follows pattern: MessageController receives messages via MessageDeliveryService, extracts taskType/messageType from payload, routes to appropriate processor method.