Architecture Overview
Firmiana follows a layered architecture pattern typical of Micronaut applications.
Layer Diagram
Key Components
Controllers
Controllers are organised by feature area under com.firmiana.matrix.controller:
Services
Services contain business logic. The most significant:
Repositories
All repositories are Micronaut Data JDBC interfaces annotated with @JdbcRepository(dialect = Dialect.H2). They follow Micronaut Data naming conventions for query derivation.
Entities
Entities use Lombok @Data / @Getter / @Setter annotations mapped to H2 tables via @MappedEntity. Key entities: User, Room, Event, RoomMember, UserAccessToken, MediaMetadata, EventRelations, DeviceInbox.
Request Lifecycle
- HTTP request arrives at Netty
- Micronaut routes to the appropriate controller method
MatrixAccessTokenValidatorvalidates the bearer token againstuser_access_tokenstableCurrentUserServiceextracts user identity into request context- Controller delegates to service layer
- Service performs business logic, calls repositories
- Repository queries H2 via Micronaut Data JDBC
- Response serialized as JSON per Matrix spec
Cross-Cutting Concerns
- Error handling:
MatrixExceptionHandlerconverts exceptions to Matrix error responses - Rate limiting:
RateLimiterwith sliding window per-IP limiting - Logging: Logback with console + rolling file appender (
logs/app.log) - Security headers: CSP, nosniff, DENY frame, HSTS
- CORS: Configurable per-origin (permissive in development)