Database Repository
@esengine/database is ESEngine’s database operation layer, providing type-safe CRUD operations based on the Repository pattern.
Features
Section titled “Features”- Repository Pattern - Generic CRUD operations with type safety
- Pagination - Built-in pagination support
- Soft Delete - Optional soft delete with restore
- User Management - Ready-to-use UserRepository
- Password Security - Secure password hashing with scrypt
Installation
Section titled “Installation”npminstall@esengine/database@esengine/database-driversQuick Start
Section titled “Quick Start”Basic Repository
Section titled “Basic Repository”import { createMongoConnection } from'@esengine/database-drivers'import { Repository, createRepository } from'@esengine/database'// Define entityinterface Player {id:stringname:stringscore:numbercreatedAt:DateupdatedAt:Date}// Create connectionconst mongo = createMongoConnection({uri: 'mongodb://localhost:27017',database: 'game'})await mongo.connect()// Create repositoryconst playerRepo = createRepository<Player>(mongo, 'players')// CRUD operationsconst player = await playerRepo.create({name: 'John',score: 0})const found = await playerRepo.findById(player.id)await playerRepo.update(player.id, { score: 100 })await playerRepo.delete(player.id)Custom Repository
Section titled “Custom Repository”import { Repository, BaseEntity } from'@esengine/database'importtype { IMongoConnection } from'@esengine/database-drivers'interface Player extendsBaseEntity {name:stringscore:numberrank?:string}classPlayerRepositoryextendsRepository<Player> {constructor(connection:IMongoConnection) {super(connection, 'players')}asyncfindTopPlayers(limit:number=10):Promise<Player[]> {returnthis.findMany({sort: { score: 'desc' },limit})}asyncfindByRank(rank:string):Promise<Player[]> {returnthis.findMany({where: { rank }})}}// Usageconst playerRepo = newPlayerRepository(mongo)const topPlayers = await playerRepo.findTopPlayers(5)User Repository
Section titled “User Repository”import { UserRepository } from'@esengine/database'const userRepo = newUserRepository(mongo)// Register new userconst user = await userRepo.register({username: 'john',password: 'securePassword123',email: 'john@example.com'})// Authenticateconst authenticated = await userRepo.authenticate('john', 'securePassword123')if (authenticated) {console.log('Login successful:', authenticated.username)}// Change passwordawait userRepo.changePassword(user.id, 'securePassword123', 'newPassword456')// Role managementawait userRepo.addRole(user.id, 'admin')await userRepo.removeRole(user.id, 'admin')// Find usersconst admins = await userRepo.findByRole('admin')const john = await userRepo.findByUsername('john')Pagination
Section titled “Pagination”const result = await playerRepo.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 pageSoft Delete
Section titled “Soft Delete”// Enable soft deleteconst playerRepo = createRepository<Player>(mongo, 'players', true)// Delete (marks as deleted)await playerRepo.delete(playerId)// Find excludes soft-deleted by defaultconst players = await playerRepo.findMany()// Include soft-deleted recordsconst allPlayers = await playerRepo.findMany({includeSoftDeleted: true})// Restore soft-deleted recordawait playerRepo.restore(playerId)Query Options
Section titled “Query Options”// Complex queriesconst players = await playerRepo.findMany({where: {score: { $gte: 100 },rank: { $in: ['gold', 'platinum'] },name: { $like: 'John%' }},sort: {score: 'desc',name: 'asc'},limit: 10,offset: 0})// OR conditionsconst players = await playerRepo.findMany({where: {$or: [{ score: { $gte: 1000 } },{ rank: 'legendary' }]}})Query Operators
Section titled “Query Operators”| Operator | Description | Example |
|---|---|---|
$eq | Equal | { score: { $eq: 100 } } |
$ne | Not equal | { status: { $ne: 'banned' } } |
$gt | Greater than | { score: { $gt: 50 } } |
$gte | Greater or equal | { level: { $gte: 10 } } |
$lt | Less than | { age: { $lt: 18 } } |
$lte | Less or equal | { price: { $lte: 100 } } |
$in | In array | { rank: { $in: ['gold', 'platinum'] } } |
$nin | Not in array | { status: { $nin: ['banned'] } } |
$like | Pattern match | { name: { $like: '%john%' } } |
$regex | Regex match | { email: { $regex: '@gmail.com$' } } |
Documentation
Section titled “Documentation”- Repository API - Repository detailed API
- User Management - UserRepository usage
- Query Syntax - Query condition syntax