From 64e1602874f0851b9cbeaa400f52f302472c1d6b Mon Sep 17 00:00:00 2001 From: liuyi Date: Sun, 18 May 2025 23:26:25 +0800 Subject: [PATCH] add helpers --- src/app.module.ts | 6 +----- src/modules/core/core.module.ts | 13 ++++++++++-- src/modules/core/helpers/index.ts | 1 + src/modules/core/helpers/utils.ts | 34 +++++++++++++++++++++++++++++++ src/modules/database/types.ts | 23 +++++++++++++++++++++ 5 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 src/modules/core/helpers/index.ts create mode 100644 src/modules/core/helpers/utils.ts create mode 100644 src/modules/database/types.ts diff --git a/src/app.module.ts b/src/app.module.ts index 9bc84e9..f1274f8 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,14 +1,10 @@ import { Module } from '@nestjs/common'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; import { ContentModule } from './modules/content/content.module'; import { CoreModule } from './modules/core/core.module'; import { DatabaseModule } from './modules/database/database.module'; @Module({ - imports: [ContentModule, CoreModule, DatabaseModule], - controllers: [AppController], - providers: [AppService], + imports: [ContentModule, CoreModule.forRoot(), DatabaseModule], }) export class AppModule {} diff --git a/src/modules/core/core.module.ts b/src/modules/core/core.module.ts index 56a4d78..0caf892 100644 --- a/src/modules/core/core.module.ts +++ b/src/modules/core/core.module.ts @@ -1,4 +1,13 @@ -import { Module } from '@nestjs/common'; +import { DynamicModule, Module } from '@nestjs/common'; @Module({}) -export class CoreModule {} +export class CoreModule { + static forRoot(): DynamicModule { + return { + module: CoreModule, + global: true, + providers: [], + exports: [], + }; + } +} diff --git a/src/modules/core/helpers/index.ts b/src/modules/core/helpers/index.ts new file mode 100644 index 0000000..04bca77 --- /dev/null +++ b/src/modules/core/helpers/index.ts @@ -0,0 +1 @@ +export * from './utils'; diff --git a/src/modules/core/helpers/utils.ts b/src/modules/core/helpers/utils.ts new file mode 100644 index 0000000..0723492 --- /dev/null +++ b/src/modules/core/helpers/utils.ts @@ -0,0 +1,34 @@ +import deepmerge from 'deepmerge'; +import { isNil } from 'lodash'; + +export function toBoolean(value?: string | boolean): boolean { + if (isNil(value)) { + return false; + } + if (typeof value === 'boolean') { + return value; + } + try { + return JSON.parse(value.toLowerCase()); + } catch (error) { + return value as unknown as boolean; + } +} + +export function toNull(value?: string | null): string | null | undefined { + return value === null ? null : value; +} + +export const deepMerge = ( + x: Partial, + y: Partial

, + arrayMode: 'replace' | 'merge' = 'merge', +) => { + const options: deepmerge.Options = {}; + if (arrayMode === 'replace') { + options.arrayMerge = (_d, s, _o) => s; + } else if (arrayMode === 'merge') { + options.arrayMerge = (_d, s, _o) => Array.from(new Set([..._d, ...s])); + } + return deepmerge(x, y, options) as P extends T ? T : T & P; +}; diff --git a/src/modules/database/types.ts b/src/modules/database/types.ts new file mode 100644 index 0000000..d061c35 --- /dev/null +++ b/src/modules/database/types.ts @@ -0,0 +1,23 @@ +import { ObjectLiteral, SelectQueryBuilder } from 'typeorm'; + +export type QueryHook = ( + qb: SelectQueryBuilder, +) => Promise>; + +export interface PaginateMeta { + itemCount: number; + totalItems?: number; + perPage: number; + totalPages?: number; + currentPage: number; +} + +export interface PaginateOptions { + page?: number; + limit?: number; +} + +export interface PaginateReturn { + meta: PaginateMeta; + items: E[]; +}