feat(database): add database layer architecture (#410)
- Add @esengine/database-drivers for MongoDB/Redis connection management - Add @esengine/database for Repository pattern with CRUD, pagination, soft delete - Refactor @esengine/transaction MongoStorage to use shared connection - Add comprehensive documentation in Chinese and English
This commit is contained in:
152
packages/framework/database/src/index.ts
Normal file
152
packages/framework/database/src/index.ts
Normal file
@@ -0,0 +1,152 @@
|
||||
/**
|
||||
* @zh @esengine/database 数据库操作层
|
||||
* @en @esengine/database Database Operations Layer
|
||||
*
|
||||
* @zh 提供通用的数据库 CRUD 操作、仓库模式、用户管理等功能
|
||||
* @en Provides generic database CRUD operations, repository pattern, user management
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* import { createMongoConnection } from '@esengine/database-drivers'
|
||||
* import {
|
||||
* Repository,
|
||||
* UserRepository,
|
||||
* createUserRepository,
|
||||
* hashPassword,
|
||||
* verifyPassword,
|
||||
* } from '@esengine/database'
|
||||
*
|
||||
* // 1. 创建连接(来自 database-drivers)
|
||||
* const mongo = createMongoConnection({
|
||||
* uri: 'mongodb://localhost:27017',
|
||||
* database: 'game',
|
||||
* })
|
||||
* await mongo.connect()
|
||||
*
|
||||
* // 2. 使用用户仓库
|
||||
* const userRepo = createUserRepository(mongo)
|
||||
*
|
||||
* // 注册
|
||||
* const user = await userRepo.register({
|
||||
* username: 'player1',
|
||||
* password: 'securePassword123',
|
||||
* })
|
||||
*
|
||||
* // 登录
|
||||
* const authUser = await userRepo.authenticate('player1', 'securePassword123')
|
||||
*
|
||||
* // 3. 自定义仓库
|
||||
* interface Player extends BaseEntity {
|
||||
* name: string
|
||||
* score: number
|
||||
* level: number
|
||||
* }
|
||||
*
|
||||
* class PlayerRepository extends Repository<Player> {
|
||||
* constructor(connection: IMongoConnection) {
|
||||
* super(connection, 'players')
|
||||
* }
|
||||
*
|
||||
* async findTopPlayers(limit = 10): Promise<Player[]> {
|
||||
* return this.findMany({
|
||||
* sort: { score: 'desc' },
|
||||
* limit,
|
||||
* })
|
||||
* }
|
||||
*
|
||||
* async addScore(playerId: string, points: number): Promise<Player | null> {
|
||||
* const player = await this.findById(playerId)
|
||||
* if (!player) return null
|
||||
* return this.update(playerId, { score: player.score + points })
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* // 4. 分页查询
|
||||
* const result = await userRepo.findPaginated(
|
||||
* { page: 1, pageSize: 20 },
|
||||
* { where: { isActive: true }, sort: { createdAt: 'desc' } }
|
||||
* )
|
||||
* console.log(`第 ${result.page}/${result.totalPages} 页,共 ${result.total} 条`)
|
||||
* ```
|
||||
*/
|
||||
|
||||
// =============================================================================
|
||||
// Types | 类型
|
||||
// =============================================================================
|
||||
|
||||
export type {
|
||||
BaseEntity,
|
||||
SoftDeleteEntity,
|
||||
ComparisonOperators,
|
||||
WhereCondition,
|
||||
SortDirection,
|
||||
SortCondition,
|
||||
QueryOptions,
|
||||
PaginationParams,
|
||||
PaginatedResult,
|
||||
IRepository,
|
||||
UserEntity
|
||||
} from './types.js'
|
||||
|
||||
// =============================================================================
|
||||
// Repository | 仓库
|
||||
// =============================================================================
|
||||
|
||||
export { Repository, createRepository } from './Repository.js'
|
||||
|
||||
// =============================================================================
|
||||
// User Repository | 用户仓库
|
||||
// =============================================================================
|
||||
|
||||
export {
|
||||
UserRepository,
|
||||
createUserRepository,
|
||||
type CreateUserParams,
|
||||
type SafeUser
|
||||
} from './UserRepository.js'
|
||||
|
||||
// =============================================================================
|
||||
// Password | 密码工具
|
||||
// =============================================================================
|
||||
|
||||
export {
|
||||
hashPassword,
|
||||
verifyPassword,
|
||||
checkPasswordStrength,
|
||||
type PasswordHashConfig,
|
||||
type PasswordStrength,
|
||||
type PasswordStrengthResult
|
||||
} from './password.js'
|
||||
|
||||
// =============================================================================
|
||||
// Tokens | 服务令牌
|
||||
// =============================================================================
|
||||
|
||||
export {
|
||||
MongoConnectionToken,
|
||||
RedisConnectionToken,
|
||||
UserRepositoryToken,
|
||||
createServiceToken,
|
||||
type ServiceToken
|
||||
} from './tokens.js'
|
||||
|
||||
// =============================================================================
|
||||
// Re-exports from database-drivers | 从 database-drivers 重新导出
|
||||
// =============================================================================
|
||||
|
||||
export type {
|
||||
IMongoConnection,
|
||||
IRedisConnection,
|
||||
MongoConnectionConfig,
|
||||
RedisConnectionConfig,
|
||||
ConnectionState,
|
||||
DatabaseErrorCode
|
||||
} from '@esengine/database-drivers'
|
||||
|
||||
export {
|
||||
createMongoConnection,
|
||||
createRedisConnection,
|
||||
DatabaseError,
|
||||
ConnectionError,
|
||||
DuplicateKeyError
|
||||
} from '@esengine/database-drivers'
|
||||
Reference in New Issue
Block a user