Comprehensive guides and references for the OpenFrame platform
The Data Mongo Repositories module provides the MongoDB persistence layer for OpenFrame services. It implements both blocking and reactive repository patterns on top of Spring Data MongoDB and MongoTemplate, offering:
This module sits on top of the document models defined in the Data Mongo Core and Documents module and is consumed by API services, Authorization Server components, and domain services.
The Data Mongo Repositories module acts as the bridge between domain services and MongoDB collections.
flowchart TD
ApiLayer["API Service / Authorization Server"] --> DomainServices["Domain Services"]
DomainServices --> Repositories["Data Mongo Repositories"]
Repositories --> MongoTemplate["MongoTemplate / Spring Data"]
MongoTemplate --> MongoDB[("MongoDB")]
MongoRepository and ReactiveMongoRepositoryMongoTemplate_id (ObjectId)Used for simple CRUD and indexed lookups.
Examples:
OAuthTokenRepositoryExternalApplicationEventRepositoryReactiveOAuthClientRepositoryThese extend:
MongoRepository<T, ID> (blocking)ReactiveMongoRepository<T, ID> (reactive)To support both blocking and reactive stacks, base interfaces define generic contracts.
Examples:
BaseUserRepository<T, B, ID>BaseApiKeyRepository<T, B, L, ID>BaseTenantRepository<T, B, ID>BaseIntegratedToolRepository<T, B, ID>flowchart LR
BaseUserRepo["BaseUserRepository<T,B,ID>"] --> ReactiveUserRepo["ReactiveUserRepository"]
BaseApiKeyRepo["BaseApiKeyRepository<T,B,L,ID>"] --> ApiKeyImpl["Concrete Mongo Repository"]
BaseTenantRepo["BaseTenantRepository<T,B,ID>"] --> TenantImpl["Concrete Mongo Repository"]
This design ensures:
For advanced filtering, search, sorting, and cursor pagination, custom implementations use MongoTemplate.
Examples:
CustomMachineRepositoryImplCustomEventRepositoryImplCustomOrganizationRepositoryImplCustomIntegratedToolRepositoryImplThese repositories:
Query objectsCriteria treesComponent: ReactiveOAuthClientRepository
ReactiveMongoRepository<OAuthClient, String>findByClientId(String clientId)Mono<OAuthClient>Used in reactive security and OAuth flows where non-blocking I/O is required.
Component: ReactiveUserRepository
ReactiveMongoRepository<User, String>BaseUserRepository<Mono<User>, Mono<Boolean>, String>findByEmailexistsByEmailexistsByEmailAndStatusflowchart TD
ReactiveUserRepo["ReactiveUserRepository"] --> MongoReactive["ReactiveMongoRepository"]
ReactiveUserRepo --> BaseUserRepo["BaseUserRepository"]
MongoReactive --> MongoDB[("MongoDB")]
This repository is conditionally enabled for reactive web applications.
Component: OAuthTokenRepository
MongoRepository<OAuthToken, String>findByAccessTokenfindByRefreshTokenUsed by:
Supports client lookup by clientId for dynamic or reactive OAuth configurations.
Component: ExternalApplicationEventRepository
MongoRepositoryfindByUserIdAndTimestampBetweenfindByTypeAndTags (custom @Query)Supports audit and integration-related event retrieval.
Component: CustomEventRepositoryImpl
Provides:
EventQueryFilterflowchart TD
Filter["EventQueryFilter"] --> BuildQuery["buildEventQuery()"]
BuildQuery --> ApplyCursor["apply ObjectId cursor"]
ApplyCursor --> Sort["apply validated sorting"]
Sort --> MongoTemplateFind["mongoTemplate.find(Event)"]
_id (ObjectId) as a cursorlt or gt depending on sort direction_idquery.limit(limit)Component: CustomMachineRepositoryImpl
Responsibilities:
MachineQueryFilterflowchart TD
DeviceFilter["MachineQueryFilter"] --> CriteriaBuilder["Criteria.where(...)"]
Search["Search String"] --> RegexCriteria["regex search"]
CriteriaBuilder --> Query
RegexCriteria --> Query
Query --> CursorLogic["ObjectId < cursor"]
CursorLogic --> SortLogic["Validated Sort"]
SortLogic --> MongoExec["mongoTemplate.find(Machine)"]
Each custom repository defines:
SORTABLE_FIELDSDEFAULT_SORT_FIELDisSortableField(String field)This prevents:
Component: CustomOrganizationRepositoryImpl
Advanced capabilities:
LocalDate$and criteria compositionflowchart TD
OrgFilter["OrganizationQueryFilter"] --> CriteriaList["Collect Criteria List"]
CriteriaList --> AndOperator["andOperator(...) "]
Search["Search String"] --> OrSearch["name or organizationId or category"]
AndOperator --> Query
OrSearch --> Query
Query --> MongoFind["mongoTemplate.find(Organization)"]
This repository ensures database-level filtering for performance and avoids in-memory post-processing.
Defines generic contract:
findByType(String type)Component: CustomIntegratedToolRepositoryImpl
Supports:
findDistinctTypes()findDistinctCategories()findDistinctPlatformCategories()flowchart LR
ToolFilter["ToolQueryFilter"] --> BuildToolQuery
BuildToolQuery --> SortValidation
SortValidation --> MongoFind
MongoFind --> Result["List<IntegratedTool>"]
Defines:
findByDomainexistsByDomainSupports both:
Optional, boolean)Mono<T>, Mono<Boolean>)Defines common operations:
findByIdAndUserIdfindByUserIdfindExpiredKeysGeneric parameters allow reuse for:
Optional, List)Mono, Flux)flowchart TD
DomainService["Domain Service"] --> BaseApiKeyRepo["BaseApiKeyRepository Contract"]
BaseApiKeyRepo --> BlockingImpl["MongoRepository Implementation"]
BaseApiKeyRepo --> ReactiveImpl["ReactiveMongoRepository Implementation"]
Several repositories implement a consistent cursor model:
ObjectId_id comparison (lt or gt)_id sortlimitflowchart TD
Input["cursor, limit, sortField, sortDirection"] --> ValidateCursor
ValidateCursor --> AddIdCriteria["_id < or > cursor"]
AddIdCriteria --> ValidateSortField
ValidateSortField --> ApplySort
ApplySort --> Limit
Limit --> ExecuteQuery
skipThe Data Mongo Repositories module is a foundational persistence layer used by:
It ensures:
In the OpenFrame architecture, this module is the MongoDB abstraction layer that enables higher-level modules to remain persistence-agnostic while leveraging advanced MongoDB capabilities.
The Data Mongo Repositories module provides a robust, scalable, and extensible MongoDB persistence strategy tailored for multi-tenant, security-sensitive, and event-driven workloads in the OpenFrame platform.