Skip to main content
Glama
repository.interface.ts3.27 kB
/** * @fileoverview Base repository interface for domain-driven design * * This module provides the base interface for all repositories in the domain layer. * Repositories provide an abstraction over data access and act as in-memory collections * of aggregate roots. */ import { AggregateRoot } from './aggregate-root.js'; /** * Base repository interface for aggregate roots * * Repositories encapsulate the logic needed to access aggregate roots. * They provide an illusion of an in-memory collection of objects while * hiding the complexities of data access. * * @template T - The type of aggregate root * @template TId - The type of the aggregate's identifier * * @example * ```typescript * interface IOrderRepository extends IRepository<Order, string> { * findByCustomerId(customerId: string): Promise<Order[]>; * findPendingOrders(): Promise<Order[]>; * } * * class OrderRepository implements IOrderRepository { * async findById(id: string): Promise<Order | null> { * // Implementation * } * * async save(order: Order): Promise<void> { * // Implementation * } * * async delete(id: string): Promise<void> { * // Implementation * } * } * ``` */ export interface IRepository<T extends AggregateRoot<TId>, TId> { /** * Finds an aggregate by its unique identifier * * @param id - The unique identifier of the aggregate * @returns The aggregate if found, null otherwise */ findById(_id: TId): Promise<T | null>; /** * Persists an aggregate * * This method should handle both creating new aggregates and updating existing ones. * It should also dispatch any domain events after successful persistence. * * @param aggregate - The aggregate to persist */ save(_aggregate: T): Promise<void>; /** * Deletes an aggregate * * @param id - The unique identifier of the aggregate to delete */ delete(_id: TId): Promise<void>; } /** * Extended repository interface with pagination support * * This interface extends the base repository with methods that support * pagination for retrieving collections of aggregates. */ export interface IPaginatedRepository<T extends AggregateRoot<TId>, TId> extends IRepository<T, TId> { /** * Finds all aggregates with pagination * * @param options - Pagination options * @returns A paginated result containing the aggregates */ findAll(_options: PaginationOptions): Promise<PaginatedResult<T>>; } /** * Pagination options for repository queries */ export interface PaginationOptions { /** The page number (1-based) */ page: number; /** The number of items per page */ pageSize: number; /** Optional sorting field */ sortBy?: string; /** Sort direction */ sortDirection?: 'asc' | 'desc'; } /** * Paginated result container */ export interface PaginatedResult<T> { /** The items in the current page */ items: T[]; /** The current page number */ page: number; /** The number of items per page */ pageSize: number; /** The total number of items */ totalCount: number; /** The total number of pages */ totalPages: number; /** Whether there is a next page */ hasNextPage: boolean; /** Whether there is a previous page */ hasPreviousPage: boolean; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/sapientpants/deepsource-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server