From 823046e94aac8a14b9ce77d548ec5fa326779d5a Mon Sep 17 00:00:00 2001 From: liuyi Date: Mon, 2 Jun 2025 18:52:53 +0800 Subject: [PATCH] add base repository --- src/modules/database/base/repository.ts | 25 +++++++++++++++++++++++++ src/modules/database/constants.ts | 5 +++++ src/modules/database/types.ts | 7 +++++++ src/modules/database/utils.ts | 24 +++++++++++++++++++++++- 4 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/modules/database/base/repository.ts diff --git a/src/modules/database/base/repository.ts b/src/modules/database/base/repository.ts new file mode 100644 index 0000000..7579d7d --- /dev/null +++ b/src/modules/database/base/repository.ts @@ -0,0 +1,25 @@ +import { isNil } from 'lodash'; +import { ObjectLiteral, Repository, SelectQueryBuilder } from 'typeorm'; + +import { OrderType } from '@/modules/database/constants'; +import { OrderQueryType } from '@/modules/database/types'; +import { getOrderByQuery } from '@/modules/database/utils'; + +export abstract class BaseRepository extends Repository { + protected abstract _qbName: string; + + protected orderBy?: string | { name: string; order: `${OrderType}` }; + + get qbName() { + return this._qbName; + } + + buildBaseQB() { + return this.createQueryBuilder(this.qbName); + } + + addOrderByQuery(qb: SelectQueryBuilder, orderBy?: OrderQueryType) { + const orderByQuery = orderBy ?? this.orderBy; + return isNil(orderByQuery) ? qb : getOrderByQuery(qb, this.qbName, orderByQuery); + } +} diff --git a/src/modules/database/constants.ts b/src/modules/database/constants.ts index 395d6a1..1ca733b 100644 --- a/src/modules/database/constants.ts +++ b/src/modules/database/constants.ts @@ -8,3 +8,8 @@ export enum SelectTrashMode { // NONE: 只包含未软删除的数据 (只查询正常数据) NONE = 'none', } + +export enum OrderType { + ASC = 'ASC', + DESC = 'DESC', +} diff --git a/src/modules/database/types.ts b/src/modules/database/types.ts index d061c35..10bb10d 100644 --- a/src/modules/database/types.ts +++ b/src/modules/database/types.ts @@ -1,5 +1,7 @@ import { ObjectLiteral, SelectQueryBuilder } from 'typeorm'; +import { OrderType } from '@/modules/database/constants'; + export type QueryHook = ( qb: SelectQueryBuilder, ) => Promise>; @@ -21,3 +23,8 @@ export interface PaginateReturn { meta: PaginateMeta; items: E[]; } + +export type OrderQueryType = + | string + | { name: string; order: `${OrderType}` } + | Array; diff --git a/src/modules/database/utils.ts b/src/modules/database/utils.ts index 365201c..cf3879d 100644 --- a/src/modules/database/utils.ts +++ b/src/modules/database/utils.ts @@ -1,4 +1,4 @@ -import { isNil } from 'lodash'; +import { isArray, isNil } from 'lodash'; import { ObjectLiteral, SelectQueryBuilder } from 'typeorm'; import { PaginateOptions, PaginateReturn } from '@/modules/database/types'; @@ -58,3 +58,25 @@ export function treePaginate( items, }; } + +export const getOrderByQuery = ( + qb: SelectQueryBuilder, + alias: string, + orderBy?: OrderQueryType, +) => { + if (isNil(orderBy)) { + return qb; + } + if (typeof orderBy === 'string') { + return qb.orderBy(`${alias}.${orderBy}`, 'DESC'); + } + if (isArray(orderBy)) { + for (const item of orderBy) { + typeof item === 'string' + ? qb.addOrderBy(`${alias}.${item}`, 'DESC') + : qb.addOrderBy(`${alias}.${item.name}`, item.order); + } + return qb; + } + return qb.orderBy(`${alias}.${(orderBy as any).name}`, (orderBy as any).order); +};