Repository API
Creating a Repository
Section titled “Creating a Repository”Using Factory Function
Section titled “Using Factory Function”import { createRepository } from '@esengine/database'
const playerRepo = createRepository<Player>(mongo, 'players')
// Enable soft deleteconst playerRepo = createRepository<Player>(mongo, 'players', true)Extending Repository
Section titled “Extending Repository”import { Repository, BaseEntity } from '@esengine/database'
interface Player extends BaseEntity { name: string score: number}
class PlayerRepository extends Repository<Player> { constructor(connection: IMongoConnection) { super(connection, 'players', false) // Third param: enable soft delete }
// Add custom methods async findTopPlayers(limit: number): Promise<Player[]> { return this.findMany({ sort: { score: 'desc' }, limit }) }}BaseEntity Interface
Section titled “BaseEntity Interface”All entities must extend BaseEntity:
interface BaseEntity { id: string createdAt: Date updatedAt: Date deletedAt?: Date // Used for soft delete}Query Methods
Section titled “Query Methods”findById
Section titled “findById”const player = await repo.findById('player-123')findOne
Section titled “findOne”const player = await repo.findOne({ where: { name: 'John' }})
const topPlayer = await repo.findOne({ sort: { score: 'desc' }})findMany
Section titled “findMany”// Simple queryconst players = await repo.findMany({ where: { rank: 'gold' }})
// Complex queryconst players = await repo.findMany({ where: { score: { $gte: 100 }, rank: { $in: ['gold', 'platinum'] } }, sort: { score: 'desc', name: 'asc' }, limit: 10, offset: 0})findPaginated
Section titled “findPaginated”const result = await repo.findPaginated( { page: 1, pageSize: 20 }, { where: { rank: 'gold' }, sort: { score: 'desc' } })
console.log(result.data) // Player[]console.log(result.total) // Total countconsole.log(result.totalPages) // Total pagesconsole.log(result.hasNext) // Has next pageconsole.log(result.hasPrev) // Has previous pageconst count = await repo.count({ where: { rank: 'gold' }})exists
Section titled “exists”const exists = await repo.exists({ where: { email: 'john@example.com' }})Create Methods
Section titled “Create Methods”create
Section titled “create”const player = await repo.create({ name: 'John', score: 0})// Automatically generates id, createdAt, updatedAtcreateMany
Section titled “createMany”const players = await repo.createMany([ { name: 'Alice', score: 100 }, { name: 'Bob', score: 200 }, { name: 'Carol', score: 150 }])Update Methods
Section titled “Update Methods”update
Section titled “update”const updated = await repo.update('player-123', { score: 200, rank: 'gold'})// Automatically updates updatedAtDelete Methods
Section titled “Delete Methods”delete
Section titled “delete”// Hard deleteawait repo.delete('player-123')
// Soft delete (if enabled)// Actually sets the deletedAt fielddeleteMany
Section titled “deleteMany”const count = await repo.deleteMany({ where: { score: { $lt: 10 } }})Soft Delete
Section titled “Soft Delete”Enabling Soft Delete
Section titled “Enabling Soft Delete”const repo = createRepository<Player>(mongo, 'players', true)Query Behavior
Section titled “Query Behavior”// Excludes soft-deleted records by defaultconst players = await repo.findMany()
// Include soft-deleted recordsconst allPlayers = await repo.findMany({ includeSoftDeleted: true})Restore Records
Section titled “Restore Records”await repo.restore('player-123')QueryOptions
Section titled “QueryOptions”interface QueryOptions<T> { /** Query conditions */ where?: WhereCondition<T>
/** Sorting */ sort?: Partial<Record<keyof T, 'asc' | 'desc'>>
/** Limit count */ limit?: number
/** Offset */ offset?: number
/** Include soft-deleted records (only when soft delete is enabled) */ includeSoftDeleted?: boolean}PaginatedResult
Section titled “PaginatedResult”interface PaginatedResult<T> { data: T[] total: number page: number pageSize: number totalPages: number hasNext: boolean hasPrev: boolean}