Skip to content

QueryRepository

Defined in: packages/ddd-core/persistence/query-repository.abstract.ts:75

Base class for read-side (query) repositories.

Resolves a query via the abstract find method and receives an ICache instance. Subclasses annotate find() with the @FromCache decorator to serve cached results, bypass cache, or rehydrate snapshots into domain entities.

Creating a query repository with the FromCache decorator

@Injectable()
export class GetUserQueryRepository extends QueryRepository<GetUserQuery, User | null> {
constructor(
@Inject(CACHE_TOKEN) protected readonly cache: ICache<UserSnapshot>,
@Inject(MIKRO_ORM_CLIENT) private readonly store: MikroOrmStore,
) {
super(cache);
}
@FromCache<GetUserQuery, User | null>({
keyFn: (query) => cacheKey('user', { id: query.userId }),
hydrateFn: (cached) => User.fromJSON(cached as UserSnapshot),
alwaysHydrate: true,
})
async find(query: GetUserQuery): Promise<User | null> {
return this.store.em.findOne(User, { id: query.userId });
}
}

Declaring rehydration once for the whole repository

@Injectable()
export class GetRoleQueryRepository extends QueryRepository<GetRoleQuery, Role | null> {
constructor(
@Inject(CACHE_TOKEN) cache: ICache<RoleSnapshot>,
@Inject(MIKRO_ORM_CLIENT) private readonly store: MikroOrmStore,
) {
super(cache, { hydrateFn: (cached) => Role.fromJSON(cached as RoleSnapshot) });
}
@FromCache<GetRoleQuery, Role | null>({
keyFn: (query) => cacheKey(Role.aggregateName, { id: query.roleId }),
})
async find(query: GetRoleQuery): Promise<Role | null> { ... }
}

A method that declares hydrateFn (including null) or serializeFn uses its own value instead of the repository default.

TQuery = IQueryOptions

The query/options type accepted by find.

TResult = unknown

The result type returned by find.

new QueryRepository<TQuery, TResult>(cache, hydration?): QueryRepository<TQuery, TResult>

Defined in: packages/ddd-core/persistence/query-repository.abstract.ts:78

ICache<unknown>

QueryRepositoryHydration<TResult>

QueryRepository<TQuery, TResult>

protected readonly cache: ICache<unknown>

Defined in: packages/ddd-core/persistence/query-repository.abstract.ts:79


protected readonly optional hydration?: QueryRepositoryHydration<TResult>

Defined in: packages/ddd-core/persistence/query-repository.abstract.ts:80

abstract find(query): Promise<TResult>

Defined in: packages/ddd-core/persistence/query-repository.abstract.ts:83

Resolves one application query.

TQuery

Promise<TResult>

IQueryRepository.find