@trailmix-cms/db 0.1.2 → 0.2.1

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.
@@ -0,0 +1,24 @@
1
+ import { Filter, Collection, ClientSession, FindOptions, ObjectId, UpdateFilter, Document, WithId, OptionalUnlessRequiredId } from 'mongodb';
2
+ import { Base } from '@trailmix-cms/models';
3
+ import { Creatable } from './utils';
4
+ import { InternalCollectionName } from './constants';
5
+ import { DatabaseService } from './database.service';
6
+ import { ZodType } from 'zod';
7
+ export declare abstract class BaseCollection<T extends Base.BaseEntity & Document> {
8
+ protected readonly collection: Collection<T>;
9
+ protected readonly databaseService: DatabaseService;
10
+ protected abstract readonly collectionName: InternalCollectionName | string;
11
+ protected abstract readonly entitySchema: ZodType<OptionalUnlessRequiredId<T>>;
12
+ constructor(collection: Collection<T>, databaseService: DatabaseService);
13
+ get(id: ObjectId): Promise<WithId<T> | null>;
14
+ find(filter: Filter<T>, options?: FindOptions): Promise<WithId<T>[]>;
15
+ findOne(query: Filter<T>): Promise<WithId<T> | null>;
16
+ findOneAndUpdate(query: Filter<T>, update: UpdateFilter<T>, session?: ClientSession): Promise<WithId<T>>;
17
+ deleteMany(query: Filter<T>, session?: ClientSession): Promise<import("mongodb").DeleteResult>;
18
+ deleteOne(entityId: ObjectId, session?: ClientSession): Promise<import("mongodb").DeleteResult>;
19
+ insertOne(params: Creatable<T>, session?: ClientSession): Promise<OptionalUnlessRequiredId<T> & {
20
+ _id: import("mongodb").InferIdType<T>;
21
+ }>;
22
+ upsertOne(query: Filter<T>, update: UpdateFilter<T>, session?: ClientSession): Promise<WithId<T>>;
23
+ }
24
+ //# sourceMappingURL=base.base-collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.base-collection.d.ts","sourceRoot":"","sources":["../src/base.base-collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,wBAAwB,EAA2B,MAAM,SAAS,CAAC;AACtK,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAiB,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAG9B,8BAAsB,cAAc,CAAC,CAAC,SAAS,IAAI,CAAC,UAAU,GAAG,QAAQ;IAKjE,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5C,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,eAAe;IALvD,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,sBAAsB,GAAG,MAAM,CAAC;IAC5E,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC;gBAGxD,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,eAAe,EAAE,eAAe;IAGvD,GAAG,CAAC,EAAE,EAAE,QAAQ;IAIhB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW;IAI7C,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAIlB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa;IAiBnF,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa;IAWpD,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,aAAa;IAUrD,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa;;;IAgBvD,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa;CAerF"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BaseCollection = void 0;
7
+ const utils_1 = require("./utils");
8
+ const lodash_merge_1 = __importDefault(require("lodash.merge"));
9
+ class BaseCollection {
10
+ collection;
11
+ databaseService;
12
+ constructor(collection, databaseService) {
13
+ this.collection = collection;
14
+ this.databaseService = databaseService;
15
+ }
16
+ get(id) {
17
+ return this.collection.findOne({ _id: id });
18
+ }
19
+ find(filter, options) {
20
+ return this.collection.find(filter, options).toArray();
21
+ }
22
+ findOne(query) {
23
+ return this.collection.findOne(query);
24
+ }
25
+ async findOneAndUpdate(query, update, session) {
26
+ return this.databaseService.withTransaction({ session }, async (session) => {
27
+ const result = await this.collection.findOneAndUpdate(query, (0, lodash_merge_1.default)(update, {
28
+ $set: {
29
+ updated_at: new Date(),
30
+ }
31
+ }), {
32
+ session,
33
+ returnDocument: 'after'
34
+ });
35
+ if (!result) {
36
+ throw new Error(`Failed to find and update "${this.collectionName}" with query ${JSON.stringify(query)}`);
37
+ }
38
+ return result;
39
+ });
40
+ }
41
+ async deleteMany(query, session) {
42
+ return this.databaseService.withTransaction({ session }, async (session) => {
43
+ const items = await this.collection.find(query, { session }).toArray();
44
+ const result = await this.collection.deleteMany({ _id: { $in: items.map(item => item._id) } }, { session });
45
+ if (result.deletedCount !== items.length) {
46
+ throw new Error(`Failed to delete ${items.length} of ${items.length} "${this.collectionName}" items with query ${JSON.stringify(query)}`);
47
+ }
48
+ return result;
49
+ });
50
+ }
51
+ async deleteOne(entityId, session) {
52
+ return this.databaseService.withTransaction({ session }, async (session) => {
53
+ const result = await this.collection.deleteOne({ _id: entityId }, { session });
54
+ if (result.deletedCount === 0) {
55
+ throw new Error(`Failed to delete "${this.collectionName}" with id ${entityId}`);
56
+ }
57
+ return result;
58
+ });
59
+ }
60
+ async insertOne(params, session) {
61
+ return this.databaseService.withTransaction({ session }, async (session) => {
62
+ const entity = (0, utils_1.ensureCreated)(params);
63
+ const encoded = !!this.entitySchema.encode(entity);
64
+ if (!encoded) {
65
+ throw new Error('Failed to encode entity');
66
+ }
67
+ const { insertedId } = await this.collection.insertOne(entity, session);
68
+ const result = {
69
+ ...entity,
70
+ _id: insertedId
71
+ };
72
+ return result;
73
+ });
74
+ }
75
+ async upsertOne(query, update, session) {
76
+ return this.databaseService.withTransaction({ session }, async (session) => {
77
+ const updateFilter = (0, lodash_merge_1.default)(update, {
78
+ $setOnInsert: {
79
+ created_at: new Date(),
80
+ }
81
+ });
82
+ const result = await this.collection.findOneAndUpdate(query, updateFilter, { upsert: true, session, returnDocument: 'after' });
83
+ if (!result) {
84
+ throw new Error('Failed to upsert record');
85
+ }
86
+ return result;
87
+ });
88
+ }
89
+ }
90
+ exports.BaseCollection = BaseCollection;
91
+ //# sourceMappingURL=base.base-collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.base-collection.js","sourceRoot":"","sources":["../src/base.base-collection.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './database.module';
2
2
  export * from './database.service';
3
+ export * from './base.base-collection';
3
4
  export * from './audited.base-collection';
4
5
  export * from './collection.decorator';
5
6
  export * from './collection.factory';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AAEnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AAErC,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AAEnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AAErC,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -39,6 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.Utils = exports.Collections = void 0;
40
40
  __exportStar(require("./database.module"), exports);
41
41
  __exportStar(require("./database.service"), exports);
42
+ __exportStar(require("./base.base-collection"), exports);
42
43
  __exportStar(require("./audited.base-collection"), exports);
43
44
  __exportStar(require("./collection.decorator"), exports);
44
45
  __exportStar(require("./collection.factory"), exports);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,oDAAkC;AAClC,qDAAmC;AAEnC,4DAA0C;AAC1C,yDAAuC;AACvC,uDAAqC;AAErC,6DAA6C;AAC7C,iDAAiC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,oDAAkC;AAClC,qDAAmC;AAEnC,yDAAuC;AACvC,4DAA0C;AAC1C,yDAAuC;AACvC,uDAAqC;AAErC,6DAA6C;AAC7C,iDAAiC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trailmix-cms/db",
3
- "version": "0.1.2",
3
+ "version": "0.2.1",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "scripts": {
@@ -11,7 +11,7 @@
11
11
  "dependencies": {
12
12
  "@nestjs/common": "^11.1.9",
13
13
  "@nestjs/config": "^4.0.2",
14
- "@trailmix-cms/models": "0.1.2",
14
+ "@trailmix-cms/models": "0.2.1",
15
15
  "envalid": "^8.1.1",
16
16
  "lodash.merge": "^4.6.2",
17
17
  "mongodb": "^7.0.0",
@@ -27,7 +27,7 @@
27
27
  "peerDependencies": {
28
28
  "@nestjs/common": "^11.1.9",
29
29
  "@nestjs/config": "^4.0.2",
30
- "@trailmix-cms/models": "0.1.2",
30
+ "@trailmix-cms/models": "0.2.1",
31
31
  "mongodb": "^7.0.0",
32
32
  "reflect-metadata": "^0.2.2",
33
33
  "rxjs": "^7.8.2",