@pixmason/nest-cloudbase-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,240 @@
1
+ # @pixmason/nest-cloudbase-sdk
2
+
3
+ 一个面向 NestJS 的 CloudBase SDK 封装模块,支持动态配置注入(`forRoot` / `forRootAsync`)、基础 CRUD、批量操作、聚合查询、存在性判断与 Repository 模式。
4
+
5
+ ## 特性
6
+
7
+ - 支持 Nest 动态模块:`CloudbaseModule.forRoot`、`CloudbaseModule.forRootAsync`
8
+ - 统一数据能力:`findOne/createData/updateData/removeData`
9
+ - 批量能力:`findMany/updateMany/removeMany/updateByIds`
10
+ - 统计与存在性:`countTotal/isExistData/findExistData/findExistIds`
11
+ - 高级聚合:`findManyByPipeline`
12
+ - Repository 模式:按集合创建仓储,减少重复传参
13
+ - 中文错误提示 + 错误码,便于全局异常拦截
14
+
15
+ ## 安装
16
+
17
+ ### npm
18
+
19
+ ```bash
20
+ npm i @pixmason/nest-cloudbase-sdk
21
+ ```
22
+
23
+ ### pnpm
24
+
25
+ ```bash
26
+ pnpm add @pixmason/nest-cloudbase-sdk
27
+ ```
28
+
29
+ ### yarn
30
+
31
+ ```bash
32
+ yarn add @pixmason/nest-cloudbase-sdk
33
+ ```
34
+
35
+ ## 快速开始
36
+
37
+ ### 1) 在 AppModule 注册(同步配置)
38
+
39
+ ```ts
40
+ import { Module } from '@nestjs/common'
41
+ import { CloudbaseModule } from '@pixmason/nest-cloudbase-sdk'
42
+
43
+ @Module({
44
+ imports: [
45
+ CloudbaseModule.forRoot({
46
+ env: '你的环境ID',
47
+ secretId: '你的SecretId',
48
+ secretKey: '你的SecretKey',
49
+ batchLimit: 100, // 可选,默认 100
50
+ }),
51
+ ],
52
+ })
53
+ export class AppModule {}
54
+ ```
55
+
56
+ ### 2) 在服务中注入并调用
57
+
58
+ ```ts
59
+ import { Injectable } from '@nestjs/common'
60
+ import { CloudbaseService } from '@pixmason/nest-cloudbase-sdk'
61
+
62
+ @Injectable()
63
+ export class UserService {
64
+ constructor(private readonly cloudbaseService: CloudbaseService) {}
65
+
66
+ async getUserList() {
67
+ return this.cloudbaseService.findMany('users', {
68
+ currentPage: 1,
69
+ pageSize: 20,
70
+ where: { status: 'active' },
71
+ sort: { _id: -1 },
72
+ withTotal: true, // 默认就是 true
73
+ })
74
+ }
75
+ }
76
+ ```
77
+
78
+ ## 支持的调用方式
79
+
80
+ ### 模块初始化
81
+
82
+ - `CloudbaseModule.forRoot(options)`
83
+ - `CloudbaseModule.forRootAsync({ imports, inject, useFactory })`
84
+
85
+ ### CloudbaseService 方法
86
+
87
+ - `findOne(collection, where)`
88
+ - `createData(collection, data)`(支持单条和批量)
89
+ - `updateData(collection, where, data)`
90
+ - `removeData(collection, where)`
91
+ - `findMany(collection, params)`
92
+ - `findManyByPipeline(collection, pipeline)`
93
+ - `updateMany(collection, where, data)`
94
+ - `updateByIds(collection, items)`
95
+ - `removeMany(collection, where)`
96
+ - `countTotal(collection, where?)`
97
+ - `findExistData(collection, ids, field?)`
98
+ - `isExistData(collection, ids, options?)`
99
+ - `findExistIds(collection, ids)`
100
+ - `repository(collection)`
101
+
102
+ ### Repository 调用方式
103
+
104
+ ```ts
105
+ const userRepo = cloudbaseService.repository<{ _id: string; name: string }>('users')
106
+
107
+ await userRepo.findOne({ _id: 'xxx' })
108
+ await userRepo.findMany({ currentPage: 1, pageSize: 10 })
109
+ await userRepo.createData({ name: 'Tom' })
110
+ await userRepo.isExistData(['id1', 'id2'], { allMustExist: true })
111
+ ```
112
+
113
+ ## 完整接入示例(forRootAsync)
114
+
115
+ ### 1) AppModule
116
+
117
+ ```ts
118
+ import { Module } from '@nestjs/common'
119
+ import { ConfigModule, ConfigService } from '@nestjs/config'
120
+ import { CloudbaseModule } from '@pixmason/nest-cloudbase-sdk'
121
+
122
+ @Module({
123
+ imports: [
124
+ ConfigModule.forRoot({ isGlobal: true }),
125
+ CloudbaseModule.forRootAsync({
126
+ imports: [ConfigModule],
127
+ inject: [ConfigService],
128
+ useFactory: (configService: ConfigService) => ({
129
+ env: configService.get<string>('ENV_ID'),
130
+ secretId: configService.get<string>('SECRET_ID'),
131
+ secretKey: configService.get<string>('SECRET_KEY'),
132
+ batchLimit: Number(configService.get<string>('BATCH_LIMIT') ?? 100),
133
+ }),
134
+ }),
135
+ ],
136
+ })
137
+ export class AppModule {}
138
+ ```
139
+
140
+ ### 2) 业务 Service
141
+
142
+ ```ts
143
+ import { Injectable } from '@nestjs/common'
144
+ import { CloudbaseService } from '@pixmason/nest-cloudbase-sdk'
145
+
146
+ @Injectable()
147
+ export class DemoService {
148
+ constructor(private readonly cloudbaseService: CloudbaseService) {}
149
+
150
+ async demo(collection: string) {
151
+ const created = await this.cloudbaseService.createData(collection, [{ name: 'A' }, { name: 'B' }])
152
+
153
+ const page = await this.cloudbaseService.findMany(collection, {
154
+ currentPage: 1,
155
+ pageSize: 20,
156
+ where: {},
157
+ sort: { _id: 1 },
158
+ })
159
+
160
+ const existAny = await this.cloudbaseService.isExistData(collection, created.ids)
161
+ const existAll = await this.cloudbaseService.isExistData(collection, created.ids, {
162
+ allMustExist: true,
163
+ })
164
+
165
+ return {
166
+ created,
167
+ page,
168
+ existAny,
169
+ existAll,
170
+ }
171
+ }
172
+ }
173
+ ```
174
+
175
+ ## 常用返回结构
176
+
177
+ ### findMany
178
+
179
+ ```ts
180
+ {
181
+ data: T[];
182
+ currentPage: number;
183
+ pageSize: number;
184
+ total?: number;
185
+ }
186
+ ```
187
+
188
+ - 默认 `withTotal = true`
189
+
190
+ ### createData
191
+
192
+ ```ts
193
+ {
194
+ id?: string; // 单条创建时返回
195
+ ids: string[]; // 单条/批量统一返回
196
+ total: number; // 创建成功条数
197
+ }
198
+ ```
199
+
200
+ ## isExistData 说明
201
+
202
+ `isExistData(collection, ids, { allMustExist })`
203
+
204
+ - `allMustExist = false`(默认):存在任意一条即返回 `true`
205
+ - `allMustExist = true`:只有全部存在才返回 `true`
206
+
207
+ ## 错误处理
208
+
209
+ SDK 抛出的错误类型为 `CloudbaseSdkError`,可通过 `code` 统一处理:
210
+
211
+ - `CLOUDBASE_INIT_FAILED`:初始化失败
212
+ - `CLOUDBASE_QUERY_FAILED`:查询/写入等数据库操作失败
213
+ - `CLOUDBASE_INVALID_PARAM`:参数不合法
214
+
215
+ 示例:
216
+
217
+ ```ts
218
+ try {
219
+ await cloudbaseService.findMany('users', { currentPage: 1, pageSize: 10 })
220
+ } catch (error) {
221
+ if (error instanceof CloudbaseSdkError) {
222
+ console.log(error.code, error.message)
223
+ }
224
+ }
225
+ ```
226
+
227
+ ## 配置项说明
228
+
229
+ `CloudbaseModuleOptions`:
230
+
231
+ - `env?: string`
232
+ - `accessKey?: string`
233
+ - `secretId?: string`
234
+ - `secretKey?: string`
235
+ - `sessionToken?: string`
236
+ - `context?: unknown`
237
+ - `timeout?: number`
238
+ - `proxy?: string`
239
+ - `version?: string`
240
+ - `batchLimit?: number`(可选,默认 100)
@@ -0,0 +1,6 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import { CloudbaseModuleAsyncOptions, CloudbaseModuleOptions } from './interfaces/cloudbase-module-options.interface';
3
+ export declare class CloudbaseModule {
4
+ static forRoot(options: CloudbaseModuleOptions): DynamicModule;
5
+ static forRootAsync(options: CloudbaseModuleAsyncOptions): DynamicModule;
6
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var CloudbaseModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.CloudbaseModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const constants_1 = require("./constants");
13
+ const cloudbase_service_1 = require("./cloudbase.service");
14
+ let CloudbaseModule = CloudbaseModule_1 = class CloudbaseModule {
15
+ static forRoot(options) {
16
+ return {
17
+ module: CloudbaseModule_1,
18
+ providers: [
19
+ {
20
+ provide: constants_1.CLOUDBASE_MODULE_OPTIONS,
21
+ useValue: options,
22
+ },
23
+ cloudbase_service_1.CloudbaseService,
24
+ ],
25
+ exports: [cloudbase_service_1.CloudbaseService],
26
+ };
27
+ }
28
+ static forRootAsync(options) {
29
+ const asyncOptionsProvider = {
30
+ provide: constants_1.CLOUDBASE_MODULE_OPTIONS,
31
+ useFactory: options.useFactory,
32
+ inject: options.inject ?? [],
33
+ };
34
+ return {
35
+ module: CloudbaseModule_1,
36
+ imports: options.imports ?? [],
37
+ providers: [asyncOptionsProvider, cloudbase_service_1.CloudbaseService],
38
+ exports: [cloudbase_service_1.CloudbaseService],
39
+ };
40
+ }
41
+ };
42
+ exports.CloudbaseModule = CloudbaseModule;
43
+ exports.CloudbaseModule = CloudbaseModule = CloudbaseModule_1 = __decorate([
44
+ (0, common_1.Module)({})
45
+ ], CloudbaseModule);
46
+ //# sourceMappingURL=cloudbase.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudbase.module.js","sourceRoot":"","sources":["../src/cloudbase.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAiE;AACjE,2CAAuD;AAKvD,2DAAuD;AAGhD,IAAM,eAAe,uBAArB,MAAM,eAAe;IAC1B,MAAM,CAAC,OAAO,CAAC,OAA+B;QAC5C,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,oCAAwB;oBACjC,QAAQ,EAAE,OAAO;iBAClB;gBACD,oCAAgB;aACjB;YACD,OAAO,EAAE,CAAC,oCAAgB,CAAC;SAC5B,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAoC;QACtD,MAAM,oBAAoB,GAAa;YACrC,OAAO,EAAE,oCAAwB;YACjC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;SAC7B,CAAC;QAEF,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,SAAS,EAAE,CAAC,oBAAoB,EAAE,oCAAgB,CAAC;YACnD,OAAO,EAAE,CAAC,oCAAgB,CAAC;SAC5B,CAAC;IACJ,CAAC;CACF,CAAA;AA7BY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,eAAe,CA6B3B"}
@@ -0,0 +1,23 @@
1
+ import type { CloudbaseService } from './cloudbase.service';
2
+ import type { CreateDataResult, DifferentialUpdateItem, ExistDataOptions, FindManyParams, FindManyResult } from './interfaces/cloudbase-query.interface';
3
+ export declare class CloudbaseRepository<T extends Record<string, unknown> = Record<string, unknown>> {
4
+ private readonly service;
5
+ private readonly collection;
6
+ constructor(service: CloudbaseService, collection: string);
7
+ findOne(where: Record<string, unknown>): Promise<T | null>;
8
+ createData(data: T | T[]): Promise<CreateDataResult>;
9
+ updateData(where: Record<string, unknown>, data: Partial<T>): Promise<number>;
10
+ removeData(where: Record<string, unknown>): Promise<number>;
11
+ findMany(params?: FindManyParams): Promise<FindManyResult<T>>;
12
+ findManyByPipeline(pipeline: Array<Record<string, unknown>> | ((aggregate: any) => any)): Promise<T[]>;
13
+ updateMany(where: Record<string, unknown>, data: Partial<T>): Promise<number>;
14
+ updateByIds(items: Array<DifferentialUpdateItem<T>>): Promise<number>;
15
+ removeMany(where: Record<string, unknown>): Promise<number>;
16
+ countTotal(where?: Record<string, unknown>): Promise<number>;
17
+ findExistData(ids: string[], field?: Record<string, boolean | 0 | 1>): Promise<Array<Record<string, unknown>>>;
18
+ isExistData(ids: string[], options?: ExistDataOptions): Promise<boolean>;
19
+ findExistIds(ids: string[]): Promise<{
20
+ foundIds: string[];
21
+ missingIds: string[];
22
+ }>;
23
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CloudbaseRepository = void 0;
4
+ class CloudbaseRepository {
5
+ constructor(service, collection) {
6
+ this.service = service;
7
+ this.collection = collection;
8
+ }
9
+ findOne(where) {
10
+ return this.service.findOne(this.collection, where);
11
+ }
12
+ createData(data) {
13
+ return this.service.createData(this.collection, data);
14
+ }
15
+ updateData(where, data) {
16
+ return this.service.updateData(this.collection, where, data);
17
+ }
18
+ removeData(where) {
19
+ return this.service.removeData(this.collection, where);
20
+ }
21
+ findMany(params = {}) {
22
+ return this.service.findMany(this.collection, params);
23
+ }
24
+ findManyByPipeline(pipeline) {
25
+ return this.service.findManyByPipeline(this.collection, pipeline);
26
+ }
27
+ updateMany(where, data) {
28
+ return this.service.updateMany(this.collection, where, data);
29
+ }
30
+ updateByIds(items) {
31
+ return this.service.updateByIds(this.collection, items);
32
+ }
33
+ removeMany(where) {
34
+ return this.service.removeMany(this.collection, where);
35
+ }
36
+ countTotal(where = {}) {
37
+ return this.service.countTotal(this.collection, where);
38
+ }
39
+ findExistData(ids, field = { _id: true }) {
40
+ return this.service.findExistData(this.collection, ids, field);
41
+ }
42
+ isExistData(ids, options = {}) {
43
+ return this.service.isExistData(this.collection, ids, options);
44
+ }
45
+ findExistIds(ids) {
46
+ return this.service.findExistIds(this.collection, ids);
47
+ }
48
+ }
49
+ exports.CloudbaseRepository = CloudbaseRepository;
50
+ //# sourceMappingURL=cloudbase.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudbase.repository.js","sourceRoot":"","sources":["../src/cloudbase.repository.ts"],"names":[],"mappings":";;;AASA,MAAa,mBAAmB;IAC9B,YACmB,OAAyB,EACzB,UAAkB;QADlB,YAAO,GAAP,OAAO,CAAkB;QACzB,eAAU,GAAV,UAAU,CAAQ;IAClC,CAAC;IAEJ,OAAO,CAAC,KAA8B;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAI,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,UAAU,CAAC,IAAa;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAI,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,UAAU,CAAC,KAA8B,EAAE,IAAgB;QACzD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAI,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,UAAU,CAAC,KAA8B;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,QAAQ,CAAC,SAAyB,EAAE;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAI,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED,kBAAkB,CAChB,QAAoE;QAEpE,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAI,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACvE,CAAC;IAED,UAAU,CAAC,KAA8B,EAAE,IAAgB;QACzD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAI,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,WAAW,CAAC,KAAuC;QACjD,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAI,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED,UAAU,CAAC,KAA8B;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,UAAU,CAAC,QAAiC,EAAE;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,aAAa,CACX,GAAa,EACb,QAAyC,EAAE,GAAG,EAAE,IAAI,EAAE;QAEtD,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC;IAED,WAAW,CAAC,GAAa,EAAE,UAA4B,EAAE;QACvD,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,YAAY,CAAC,GAAa;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACzD,CAAC;CACF;AA9DD,kDA8DC"}
@@ -0,0 +1,35 @@
1
+ import { CloudbaseRepository } from './cloudbase.repository';
2
+ import { CloudbaseModuleOptions } from './interfaces/cloudbase-module-options.interface';
3
+ import { CreateDataResult, DifferentialUpdateItem, ExistDataOptions, FindManyParams, FindManyResult } from './interfaces/cloudbase-query.interface';
4
+ export declare class CloudbaseService {
5
+ private readonly options;
6
+ private readonly app;
7
+ private readonly db;
8
+ private readonly command;
9
+ private readonly batchLimit;
10
+ constructor(options: CloudbaseModuleOptions);
11
+ repository<T extends Record<string, unknown> = Record<string, unknown>>(collection: string): CloudbaseRepository<T>;
12
+ findOne<T>(collection: string, where: Record<string, unknown>): Promise<T | null>;
13
+ createData<T extends Record<string, unknown>>(collection: string, data: T | T[]): Promise<CreateDataResult>;
14
+ updateData<T extends Record<string, unknown>>(collection: string, where: Record<string, unknown>, data: Partial<T>): Promise<number>;
15
+ removeData(collection: string, where: Record<string, unknown>): Promise<number>;
16
+ findMany<T>(collection: string, params?: FindManyParams): Promise<FindManyResult<T>>;
17
+ findManyByPipeline<T>(collection: string, pipeline: Array<Record<string, unknown>> | ((aggregate: any) => any)): Promise<T[]>;
18
+ updateMany<T extends Record<string, unknown>>(collection: string, where: Record<string, unknown>, data: Partial<T>): Promise<number>;
19
+ updateByIds<T extends Record<string, unknown>>(collection: string, items: Array<DifferentialUpdateItem<T>>): Promise<number>;
20
+ removeMany(collection: string, where: Record<string, unknown>): Promise<number>;
21
+ countTotal(collection: string, where?: Record<string, unknown>): Promise<number>;
22
+ findExistData(collection: string, ids: string[], field?: Record<string, boolean | 0 | 1>): Promise<Array<Record<string, unknown>>>;
23
+ isExistData(collection: string, ids: string[], options?: ExistDataOptions): Promise<boolean>;
24
+ findExistIds(collection: string, ids: string[]): Promise<{
25
+ foundIds: string[];
26
+ missingIds: string[];
27
+ }>;
28
+ private col;
29
+ private applySort;
30
+ private chunk;
31
+ private unique;
32
+ private sanitizeBatchLimit;
33
+ private extractCreatedIds;
34
+ private wrapError;
35
+ }
@@ -0,0 +1,287 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.CloudbaseService = void 0;
19
+ const common_1 = require("@nestjs/common");
20
+ const p_map_1 = __importDefault(require("p-map"));
21
+ const cloudbase_repository_1 = require("./cloudbase.repository");
22
+ const constants_1 = require("./constants");
23
+ const cloudbase_sdk_error_1 = require("./errors/cloudbase-sdk.error");
24
+ const DEFAULT_BATCH_LIMIT = 100;
25
+ const MAX_PAGE_SIZE = 1000;
26
+ let CloudbaseService = class CloudbaseService {
27
+ constructor(options) {
28
+ this.options = options;
29
+ try {
30
+ const cloudbase = require('@cloudbase/node-sdk');
31
+ const { batchLimit, ...initOptions } = options;
32
+ this.batchLimit = this.sanitizeBatchLimit(batchLimit);
33
+ this.app = cloudbase.init(initOptions);
34
+ this.db = this.app.database();
35
+ this.command = this.db.command;
36
+ }
37
+ catch (error) {
38
+ const message = error instanceof Error ? error.message : String(error);
39
+ throw new cloudbase_sdk_error_1.CloudbaseSdkError(cloudbase_sdk_error_1.CLOUDBASE_ERROR_CODE.INIT_FAILED, `CloudBase 初始化失败:${message}`);
40
+ }
41
+ }
42
+ repository(collection) {
43
+ return new cloudbase_repository_1.CloudbaseRepository(this, collection);
44
+ }
45
+ async findOne(collection, where) {
46
+ return this.wrapError('查询单条数据', async () => {
47
+ const res = (await this.col(collection)
48
+ .where(where)
49
+ .limit(1)
50
+ .get());
51
+ return res.data?.[0] ?? null;
52
+ });
53
+ }
54
+ async createData(collection, data) {
55
+ return this.wrapError('创建数据', async () => {
56
+ if (Array.isArray(data) && data.length === 0) {
57
+ throw new cloudbase_sdk_error_1.CloudbaseSdkError(cloudbase_sdk_error_1.CLOUDBASE_ERROR_CODE.INVALID_PARAM, '创建数据不能为空数组');
58
+ }
59
+ const res = (await this.col(collection).add(data));
60
+ const ids = this.extractCreatedIds(res);
61
+ const isArrayInput = Array.isArray(data);
62
+ return {
63
+ id: isArrayInput ? undefined : ids[0],
64
+ ids,
65
+ total: ids.length,
66
+ };
67
+ });
68
+ }
69
+ async updateData(collection, where, data) {
70
+ return this.wrapError('更新单条数据', async () => {
71
+ const target = await this.findOne(collection, where);
72
+ if (!target?._id) {
73
+ return 0;
74
+ }
75
+ const res = (await this.col(collection).doc(target._id).update(data));
76
+ return Number(res.updated ?? 0);
77
+ });
78
+ }
79
+ async removeData(collection, where) {
80
+ return this.wrapError('删除单条数据', async () => {
81
+ const target = await this.findOne(collection, where);
82
+ if (!target?._id) {
83
+ return 0;
84
+ }
85
+ const res = (await this.col(collection).doc(target._id).remove());
86
+ return Number(res.deleted ?? 0);
87
+ });
88
+ }
89
+ async findMany(collection, params = {}) {
90
+ return this.wrapError('查询多条数据', async () => {
91
+ const { currentPage = 1, pageSize = DEFAULT_BATCH_LIMIT, where = {}, sort = { _id: 1 }, field, withTotal = true, } = params;
92
+ const safePage = Math.max(Number(currentPage) || 1, 1);
93
+ const safeSize = Math.min(Math.max(Number(pageSize) || DEFAULT_BATCH_LIMIT, 1), MAX_PAGE_SIZE);
94
+ const skip = (safePage - 1) * safeSize;
95
+ let query = this.col(collection).where(where);
96
+ if (field && Object.keys(field).length > 0) {
97
+ query = query.field(field);
98
+ }
99
+ query = this.applySort(query, sort).skip(skip).limit(safeSize);
100
+ const res = (await query.get());
101
+ const result = {
102
+ data: res.data ?? [],
103
+ currentPage: safePage,
104
+ pageSize: safeSize,
105
+ };
106
+ if (withTotal) {
107
+ const countRes = (await this.col(collection).where(where).count());
108
+ result.total = Number(countRes.total ?? 0);
109
+ }
110
+ return result;
111
+ });
112
+ }
113
+ async findManyByPipeline(collection, pipeline) {
114
+ return this.wrapError('聚合查询', async () => {
115
+ const aggregate = this.col(collection).aggregate();
116
+ if (typeof pipeline === 'function') {
117
+ const cursor = pipeline(aggregate);
118
+ const res = (await cursor.end());
119
+ return res.data ?? [];
120
+ }
121
+ let cursor = aggregate;
122
+ for (const stage of pipeline) {
123
+ const entries = Object.entries(stage);
124
+ if (entries.length === 0) {
125
+ continue;
126
+ }
127
+ if (entries.length > 1) {
128
+ throw new cloudbase_sdk_error_1.CloudbaseSdkError(cloudbase_sdk_error_1.CLOUDBASE_ERROR_CODE.INVALID_PARAM, '每个聚合阶段仅允许一个操作符');
129
+ }
130
+ const [[rawOperator, rawPayload]] = entries;
131
+ if (!rawOperator) {
132
+ continue;
133
+ }
134
+ const operator = rawOperator.startsWith('$') ? rawOperator.slice(1) : rawOperator;
135
+ if (typeof cursor[operator] !== 'function') {
136
+ throw new cloudbase_sdk_error_1.CloudbaseSdkError(cloudbase_sdk_error_1.CLOUDBASE_ERROR_CODE.INVALID_PARAM, `不支持的聚合操作符:${rawOperator}`);
137
+ }
138
+ cursor = cursor[operator](rawPayload);
139
+ }
140
+ const res = (await cursor.end());
141
+ return res.data ?? [];
142
+ });
143
+ }
144
+ async updateMany(collection, where, data) {
145
+ return this.wrapError('批量更新数据', async () => {
146
+ const res = (await this.col(collection).where(where).update(data));
147
+ return Number(res.updated ?? 0);
148
+ });
149
+ }
150
+ async updateByIds(collection, items) {
151
+ return this.wrapError('按 ID 差异化批量更新数据', async () => {
152
+ const validItems = items.filter((item) => item.id && Object.keys(item.data).length > 0);
153
+ const chunks = this.chunk(validItems, this.batchLimit);
154
+ let affected = 0;
155
+ for (const chunk of chunks) {
156
+ const results = await (0, p_map_1.default)(chunk, async (item) => {
157
+ const res = (await this.col(collection).doc(item.id).update(item.data));
158
+ return Number(res.updated ?? 0);
159
+ }, {
160
+ concurrency: this.batchLimit,
161
+ stopOnError: false,
162
+ });
163
+ affected += results.reduce((sum, cur) => sum + cur, 0);
164
+ }
165
+ return affected;
166
+ });
167
+ }
168
+ async removeMany(collection, where) {
169
+ return this.wrapError('批量删除数据', async () => {
170
+ const res = (await this.col(collection).where(where).remove());
171
+ return Number(res.deleted ?? 0);
172
+ });
173
+ }
174
+ async countTotal(collection, where = {}) {
175
+ return this.wrapError('统计数据总数', async () => {
176
+ const res = (await this.col(collection).where(where).count());
177
+ return Number(res.total ?? 0);
178
+ });
179
+ }
180
+ async findExistData(collection, ids, field = { _id: true }) {
181
+ return this.wrapError('查询存在数据', async () => {
182
+ const uniqueIds = this.unique(ids);
183
+ if (uniqueIds.length === 0) {
184
+ return [];
185
+ }
186
+ const chunks = this.chunk(uniqueIds, this.batchLimit);
187
+ const results = await (0, p_map_1.default)(chunks, async (idChunk) => {
188
+ const res = (await this.col(collection)
189
+ .where({ _id: this.command.in(idChunk) })
190
+ .field(field)
191
+ .get());
192
+ return res.data ?? [];
193
+ }, {
194
+ concurrency: Math.min(chunks.length, this.batchLimit),
195
+ stopOnError: false,
196
+ });
197
+ return results.flat();
198
+ });
199
+ }
200
+ async isExistData(collection, ids, options = {}) {
201
+ return this.wrapError('判断数据是否存在', async () => {
202
+ const { allMustExist = false } = options;
203
+ const uniqueIds = this.unique(ids);
204
+ if (uniqueIds.length === 0) {
205
+ return false;
206
+ }
207
+ const { foundIds } = await this.findExistIds(collection, uniqueIds);
208
+ return allMustExist ? foundIds.length === uniqueIds.length : foundIds.length > 0;
209
+ });
210
+ }
211
+ async findExistIds(collection, ids) {
212
+ return this.wrapError('查询存在 ID', async () => {
213
+ const uniqueIds = this.unique(ids);
214
+ const existing = await this.findExistData(collection, uniqueIds, { _id: true });
215
+ const foundSet = new Set(existing
216
+ .map((item) => String(item._id ?? ''))
217
+ .filter((id) => id.length > 0));
218
+ const foundIds = uniqueIds.filter((id) => foundSet.has(id));
219
+ const missingIds = uniqueIds.filter((id) => !foundSet.has(id));
220
+ return { foundIds, missingIds };
221
+ });
222
+ }
223
+ col(collection) {
224
+ if (!collection || typeof collection !== 'string') {
225
+ throw new cloudbase_sdk_error_1.CloudbaseSdkError(cloudbase_sdk_error_1.CLOUDBASE_ERROR_CODE.INVALID_PARAM, '集合名称不能为空');
226
+ }
227
+ return this.db.collection(collection);
228
+ }
229
+ applySort(query, sort) {
230
+ let chained = query;
231
+ for (const [field, order] of Object.entries(sort)) {
232
+ const normalized = order === -1 || order === 'desc' ? 'desc' : 'asc';
233
+ chained = chained.orderBy(field, normalized);
234
+ }
235
+ return chained;
236
+ }
237
+ chunk(list, size) {
238
+ if (list.length === 0) {
239
+ return [];
240
+ }
241
+ const chunks = [];
242
+ for (let index = 0; index < list.length; index += size) {
243
+ chunks.push(list.slice(index, index + size));
244
+ }
245
+ return chunks;
246
+ }
247
+ unique(list) {
248
+ return [...new Set(list.filter((item) => typeof item === 'string' && item.length > 0))];
249
+ }
250
+ sanitizeBatchLimit(value) {
251
+ const parsed = Number(value);
252
+ if (!Number.isFinite(parsed) || parsed <= 0) {
253
+ return DEFAULT_BATCH_LIMIT;
254
+ }
255
+ return Math.floor(parsed);
256
+ }
257
+ extractCreatedIds(res) {
258
+ const fromArray = Array.isArray(res.ids)
259
+ ? res.ids
260
+ : Array.isArray(res.idList)
261
+ ? res.idList
262
+ : [];
263
+ const fromSingle = res.id ? [res.id] : [];
264
+ return [...fromSingle, ...fromArray]
265
+ .map((item) => String(item))
266
+ .filter((item) => item.length > 0);
267
+ }
268
+ async wrapError(actionName, handler) {
269
+ try {
270
+ return await handler();
271
+ }
272
+ catch (error) {
273
+ if (error instanceof cloudbase_sdk_error_1.CloudbaseSdkError) {
274
+ throw error;
275
+ }
276
+ const message = error instanceof Error ? error.message : String(error);
277
+ throw new cloudbase_sdk_error_1.CloudbaseSdkError(cloudbase_sdk_error_1.CLOUDBASE_ERROR_CODE.QUERY_FAILED, `${actionName}失败:${message}`);
278
+ }
279
+ }
280
+ };
281
+ exports.CloudbaseService = CloudbaseService;
282
+ exports.CloudbaseService = CloudbaseService = __decorate([
283
+ (0, common_1.Injectable)(),
284
+ __param(0, (0, common_1.Inject)(constants_1.CLOUDBASE_MODULE_OPTIONS)),
285
+ __metadata("design:paramtypes", [Object])
286
+ ], CloudbaseService);
287
+ //# sourceMappingURL=cloudbase.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudbase.service.js","sourceRoot":"","sources":["../src/cloudbase.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const CLOUDBASE_MODULE_OPTIONS = "CLOUDBASE_MODULE_OPTIONS";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CLOUDBASE_MODULE_OPTIONS = void 0;
4
+ exports.CLOUDBASE_MODULE_OPTIONS = 'CLOUDBASE_MODULE_OPTIONS';
5
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,wBAAwB,GAAG,0BAA0B,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare const CLOUDBASE_ERROR_CODE: {
2
+ readonly INIT_FAILED: "CLOUDBASE_INIT_FAILED";
3
+ readonly QUERY_FAILED: "CLOUDBASE_QUERY_FAILED";
4
+ readonly INVALID_PARAM: "CLOUDBASE_INVALID_PARAM";
5
+ };
6
+ export type CloudbaseErrorCode = (typeof CLOUDBASE_ERROR_CODE)[keyof typeof CLOUDBASE_ERROR_CODE];
7
+ export declare class CloudbaseSdkError extends Error {
8
+ readonly code: CloudbaseErrorCode;
9
+ constructor(code: CloudbaseErrorCode, message: string);
10
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CloudbaseSdkError = exports.CLOUDBASE_ERROR_CODE = void 0;
4
+ exports.CLOUDBASE_ERROR_CODE = {
5
+ INIT_FAILED: 'CLOUDBASE_INIT_FAILED',
6
+ QUERY_FAILED: 'CLOUDBASE_QUERY_FAILED',
7
+ INVALID_PARAM: 'CLOUDBASE_INVALID_PARAM',
8
+ };
9
+ class CloudbaseSdkError extends Error {
10
+ constructor(code, message) {
11
+ super(message);
12
+ this.name = 'CloudbaseSdkError';
13
+ this.code = code;
14
+ }
15
+ }
16
+ exports.CloudbaseSdkError = CloudbaseSdkError;
17
+ //# sourceMappingURL=cloudbase-sdk.error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudbase-sdk.error.js","sourceRoot":"","sources":["../../src/errors/cloudbase-sdk.error.ts"],"names":[],"mappings":";;;AAAa,QAAA,oBAAoB,GAAG;IAClC,WAAW,EAAE,uBAAuB;IACpC,YAAY,EAAE,wBAAwB;IACtC,aAAa,EAAE,yBAAyB;CAChC,CAAC;AAKX,MAAa,iBAAkB,SAAQ,KAAK;IAG1C,YAAY,IAAwB,EAAE,OAAe;QACnD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AARD,8CAQC"}
@@ -0,0 +1,6 @@
1
+ export * from './cloudbase.repository';
2
+ export * from './cloudbase.module';
3
+ export * from './cloudbase.service';
4
+ export * from './errors/cloudbase-sdk.error';
5
+ export * from './interfaces/cloudbase-module-options.interface';
6
+ export * from './interfaces/cloudbase-query.interface';
package/dist/index.js ADDED
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./cloudbase.repository"), exports);
18
+ __exportStar(require("./cloudbase.module"), exports);
19
+ __exportStar(require("./cloudbase.service"), exports);
20
+ __exportStar(require("./errors/cloudbase-sdk.error"), exports);
21
+ __exportStar(require("./interfaces/cloudbase-module-options.interface"), exports);
22
+ __exportStar(require("./interfaces/cloudbase-query.interface"), exports);
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC;AACvC,qDAAmC;AACnC,sDAAoC;AACpC,+DAA6C;AAC7C,kFAAgE;AAChE,yEAAuD"}
@@ -0,0 +1,17 @@
1
+ import { ModuleMetadata } from '@nestjs/common';
2
+ export interface CloudbaseModuleOptions {
3
+ env?: string;
4
+ accessKey?: string;
5
+ secretId?: string;
6
+ secretKey?: string;
7
+ sessionToken?: string;
8
+ context?: unknown;
9
+ timeout?: number;
10
+ proxy?: string;
11
+ version?: string;
12
+ batchLimit?: number;
13
+ }
14
+ export interface CloudbaseModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
15
+ inject?: any[];
16
+ useFactory: (...args: unknown[]) => Promise<CloudbaseModuleOptions> | CloudbaseModuleOptions;
17
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=cloudbase-module-options.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudbase-module-options.interface.js","sourceRoot":"","sources":["../../src/interfaces/cloudbase-module-options.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ export type SortOrder = 1 | -1 | 'asc' | 'desc';
2
+ export interface FindManyParams {
3
+ currentPage?: number;
4
+ pageSize?: number;
5
+ where?: Record<string, unknown>;
6
+ sort?: Record<string, SortOrder>;
7
+ field?: Record<string, boolean | 0 | 1>;
8
+ withTotal?: boolean;
9
+ }
10
+ export interface FindManyResult<T> {
11
+ data: T[];
12
+ currentPage: number;
13
+ pageSize: number;
14
+ total?: number;
15
+ }
16
+ export interface DifferentialUpdateItem<T extends Record<string, unknown>> {
17
+ id: string;
18
+ data: Partial<T>;
19
+ }
20
+ export interface CreateDataResult {
21
+ id?: string;
22
+ ids: string[];
23
+ total: number;
24
+ }
25
+ export interface ExistDataOptions {
26
+ allMustExist?: boolean;
27
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=cloudbase-query.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudbase-query.interface.js","sourceRoot":"","sources":["../../src/interfaces/cloudbase-query.interface.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@pixmason/nest-cloudbase-sdk",
3
+ "version": "0.1.0",
4
+ "description": "NestJS CloudBase module with dynamic initialization and CRUD helpers",
5
+ "license": "MIT",
6
+ "author": "PixMason",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc -p tsconfig.build.json",
15
+ "clean": "rm -rf dist",
16
+ "prepublishOnly": "npm run clean && npm run build"
17
+ },
18
+ "peerDependencies": {
19
+ "@nestjs/common": "^11.0.0",
20
+ "@nestjs/core": "^11.0.0"
21
+ },
22
+ "dependencies": {
23
+ "@cloudbase/node-sdk": "^3.8.4",
24
+ "p-map": "^7.0.3"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^24.0.0",
28
+ "typescript": "^5.7.3"
29
+ }
30
+ }