bloko 0.0.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.
- package/dist/cascade/manager.d.ts +21 -0
- package/dist/cascade/manager.d.ts.map +1 -0
- package/dist/cascade/manager.js +282 -0
- package/dist/cascade/manager.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +145 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client.d.ts +55 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +146 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +29 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -0
- package/dist/db/mongo.d.ts +15 -0
- package/dist/db/mongo.d.ts.map +1 -0
- package/dist/db/mongo.js +99 -0
- package/dist/db/mongo.js.map +1 -0
- package/dist/entities/base.d.ts +25 -0
- package/dist/entities/base.d.ts.map +1 -0
- package/dist/entities/base.js +71 -0
- package/dist/entities/base.js.map +1 -0
- package/dist/entities/blocks.d.ts +80 -0
- package/dist/entities/blocks.d.ts.map +1 -0
- package/dist/entities/blocks.js +152 -0
- package/dist/entities/blocks.js.map +1 -0
- package/dist/entities/collections.d.ts +40 -0
- package/dist/entities/collections.d.ts.map +1 -0
- package/dist/entities/collections.js +55 -0
- package/dist/entities/collections.js.map +1 -0
- package/dist/entities/contents.d.ts +60 -0
- package/dist/entities/contents.d.ts.map +1 -0
- package/dist/entities/contents.js +169 -0
- package/dist/entities/contents.js.map +1 -0
- package/dist/entities/image-variants.d.ts +95 -0
- package/dist/entities/image-variants.d.ts.map +1 -0
- package/dist/entities/image-variants.js +146 -0
- package/dist/entities/image-variants.js.map +1 -0
- package/dist/entities/images.d.ts +99 -0
- package/dist/entities/images.d.ts.map +1 -0
- package/dist/entities/images.js +128 -0
- package/dist/entities/images.js.map +1 -0
- package/dist/entities/languages.d.ts +25 -0
- package/dist/entities/languages.d.ts.map +1 -0
- package/dist/entities/languages.js +123 -0
- package/dist/entities/languages.js.map +1 -0
- package/dist/entities/node-relation-types.d.ts +60 -0
- package/dist/entities/node-relation-types.d.ts.map +1 -0
- package/dist/entities/node-relation-types.js +85 -0
- package/dist/entities/node-relation-types.js.map +1 -0
- package/dist/entities/node-relations.d.ts +61 -0
- package/dist/entities/node-relations.d.ts.map +1 -0
- package/dist/entities/node-relations.js +95 -0
- package/dist/entities/node-relations.js.map +1 -0
- package/dist/entities/node-types.d.ts +52 -0
- package/dist/entities/node-types.d.ts.map +1 -0
- package/dist/entities/node-types.js +67 -0
- package/dist/entities/node-types.js.map +1 -0
- package/dist/entities/nodes.d.ts +159 -0
- package/dist/entities/nodes.d.ts.map +1 -0
- package/dist/entities/nodes.js +265 -0
- package/dist/entities/nodes.js.map +1 -0
- package/dist/entities/templates.d.ts +60 -0
- package/dist/entities/templates.d.ts.map +1 -0
- package/dist/entities/templates.js +84 -0
- package/dist/entities/templates.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/storage/s3.d.ts +23 -0
- package/dist/storage/s3.d.ts.map +1 -0
- package/dist/storage/s3.js +98 -0
- package/dist/storage/s3.js.map +1 -0
- package/dist/types.d.ts +113 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +51 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/image.d.ts +46 -0
- package/dist/utils/image.d.ts.map +1 -0
- package/dist/utils/image.js +117 -0
- package/dist/utils/image.js.map +1 -0
- package/dist/utils/multilang.d.ts +50 -0
- package/dist/utils/multilang.d.ts.map +1 -0
- package/dist/utils/multilang.js +124 -0
- package/dist/utils/multilang.js.map +1 -0
- package/dist/utils/slug.d.ts +25 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +80 -0
- package/dist/utils/slug.js.map +1 -0
- package/dist/validation/schemas.d.ts +728 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +164 -0
- package/dist/validation/schemas.js.map +1 -0
- package/package.json +48 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Bloko = void 0;
|
|
4
|
+
const mongodb_1 = require("mongodb");
|
|
5
|
+
const mongo_js_1 = require("./db/mongo.js");
|
|
6
|
+
const s3_js_1 = require("./storage/s3.js");
|
|
7
|
+
const manager_js_1 = require("./cascade/manager.js");
|
|
8
|
+
// Entity imports
|
|
9
|
+
const collections_js_1 = require("./entities/collections.js");
|
|
10
|
+
const languages_js_1 = require("./entities/languages.js");
|
|
11
|
+
const node_types_js_1 = require("./entities/node-types.js");
|
|
12
|
+
const templates_js_1 = require("./entities/templates.js");
|
|
13
|
+
const blocks_js_1 = require("./entities/blocks.js");
|
|
14
|
+
const nodes_js_1 = require("./entities/nodes.js");
|
|
15
|
+
const contents_js_1 = require("./entities/contents.js");
|
|
16
|
+
const images_js_1 = require("./entities/images.js");
|
|
17
|
+
const image_variants_js_1 = require("./entities/image-variants.js");
|
|
18
|
+
const node_relation_types_js_1 = require("./entities/node-relation-types.js");
|
|
19
|
+
const node_relations_js_1 = require("./entities/node-relations.js");
|
|
20
|
+
class Bloko {
|
|
21
|
+
mongo;
|
|
22
|
+
s3;
|
|
23
|
+
cascade;
|
|
24
|
+
db;
|
|
25
|
+
_connected = false;
|
|
26
|
+
// Entity instances
|
|
27
|
+
collections;
|
|
28
|
+
languages;
|
|
29
|
+
nodeTypes;
|
|
30
|
+
templates;
|
|
31
|
+
blocks;
|
|
32
|
+
nodes;
|
|
33
|
+
contents;
|
|
34
|
+
images;
|
|
35
|
+
imageVariants;
|
|
36
|
+
nodeRelationTypes;
|
|
37
|
+
nodeRelations;
|
|
38
|
+
constructor(config) {
|
|
39
|
+
this.mongo = new mongo_js_1.MongoConnection(config);
|
|
40
|
+
this.s3 = new s3_js_1.S3Storage(config.s3);
|
|
41
|
+
}
|
|
42
|
+
async connect() {
|
|
43
|
+
if (this._connected) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Connect to MongoDB and ensure indexes
|
|
47
|
+
this.db = await this.mongo.connect();
|
|
48
|
+
// Ensure S3 bucket exists
|
|
49
|
+
await this.s3.ensureBucket();
|
|
50
|
+
this.cascade = new manager_js_1.CascadeManager(this.db, this.s3);
|
|
51
|
+
this.initializeEntities();
|
|
52
|
+
this._connected = true;
|
|
53
|
+
}
|
|
54
|
+
async disconnect() {
|
|
55
|
+
await this.mongo.disconnect();
|
|
56
|
+
this._connected = false;
|
|
57
|
+
}
|
|
58
|
+
get connected() {
|
|
59
|
+
return this._connected;
|
|
60
|
+
}
|
|
61
|
+
getEntityContext() {
|
|
62
|
+
return {
|
|
63
|
+
getCollection: (name) => {
|
|
64
|
+
return this.db.collection(name);
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
initializeEntities() {
|
|
69
|
+
const ctx = this.getEntityContext();
|
|
70
|
+
// Initialize Collections
|
|
71
|
+
this.collections = new collections_js_1.Collections(ctx, (collectionId) => this.cascade.cascadeCollectionDelete(collectionId));
|
|
72
|
+
// Initialize Languages
|
|
73
|
+
this.languages = new languages_js_1.Languages(ctx, (langId) => this.cascade.cascadeLanguageDelete(langId), (oldLangId, newLangId) => this.cascade.cascadeLanguageRename(oldLangId, newLangId));
|
|
74
|
+
// Initialize NodeTypes
|
|
75
|
+
this.nodeTypes = new node_types_js_1.NodeTypes(ctx, (nodeTypeId) => this.cascade.cascadeNodeTypeDelete(nodeTypeId));
|
|
76
|
+
// Initialize Templates
|
|
77
|
+
this.templates = new templates_js_1.Templates(ctx, (templateId) => this.cascade.cascadeTemplateDelete(templateId), async (id) => !!(await this.collections.findById(id)));
|
|
78
|
+
// Initialize Blocks
|
|
79
|
+
this.blocks = new blocks_js_1.Blocks(ctx, (blockId) => this.cascade.cascadeBlockDelete(blockId), (blockId) => this.cascade.cascadeBlockContentTypeChange(blockId), async (id) => !!(await this.templates.findById(id)));
|
|
80
|
+
// Initialize Images
|
|
81
|
+
this.images = new images_js_1.Images(ctx, this.s3, (imageId) => this.cascade.cascadeImageDelete(imageId), async (id) => !!(await this.collections.findById(id)));
|
|
82
|
+
// Initialize ImageVariants
|
|
83
|
+
this.imageVariants = new image_variants_js_1.ImageVariants(ctx, this.s3, async (id) => !!(await this.images.findById(id)));
|
|
84
|
+
// Initialize Nodes
|
|
85
|
+
this.nodes = new nodes_js_1.Nodes(ctx, (nodeId) => this.cascade.cascadeNodeDelete(nodeId), {
|
|
86
|
+
collectionExists: async (id) => !!(await this.collections.findById(id)),
|
|
87
|
+
templateExists: async (id) => !!(await this.templates.findById(id)),
|
|
88
|
+
templateInCollection: async (templateId, collectionId) => {
|
|
89
|
+
const template = await this.templates.findById(templateId);
|
|
90
|
+
return template?._collection.toString() === collectionId.toString();
|
|
91
|
+
},
|
|
92
|
+
nodeTypeExists: async (id) => !!(await this.nodeTypes.findById(id)),
|
|
93
|
+
imageExists: async (id) => !!(await this.images.findById(id)),
|
|
94
|
+
imageInCollection: async (imageId, collectionId) => {
|
|
95
|
+
const image = await this.images.findById(imageId);
|
|
96
|
+
return image?._collection.toString() === collectionId.toString();
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
// Initialize Contents
|
|
100
|
+
this.contents = new contents_js_1.Contents(ctx, {
|
|
101
|
+
getNode: (id) => this.nodes.findById(id),
|
|
102
|
+
getBlock: (id) => this.blocks.findById(id),
|
|
103
|
+
imageExists: async (id) => !!(await this.images.findById(id)),
|
|
104
|
+
imageInCollection: async (imageId, collectionId) => {
|
|
105
|
+
const image = await this.images.findById(imageId);
|
|
106
|
+
return image?._collection.toString() === collectionId.toString();
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
// Initialize NodeRelationTypes
|
|
110
|
+
this.nodeRelationTypes = new node_relation_types_js_1.NodeRelationTypes(ctx, (nodeRelationTypeId) => this.cascade.cascadeNodeRelationTypeDelete(nodeRelationTypeId), async (id) => !!(await this.collections.findById(id)));
|
|
111
|
+
// Initialize NodeRelations
|
|
112
|
+
this.nodeRelations = new node_relations_js_1.NodeRelations(ctx, {
|
|
113
|
+
getNode: (id) => this.nodes.findById(id),
|
|
114
|
+
getNodeRelationType: (id) => this.nodeRelationTypes.findById(id),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get the raw MongoDB database instance
|
|
119
|
+
*/
|
|
120
|
+
getDb() {
|
|
121
|
+
if (!this._connected) {
|
|
122
|
+
throw new Error('Not connected. Call connect() first.');
|
|
123
|
+
}
|
|
124
|
+
return this.db;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get the S3 storage instance
|
|
128
|
+
*/
|
|
129
|
+
getS3() {
|
|
130
|
+
return this.s3;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Helper to convert string to ObjectId
|
|
134
|
+
*/
|
|
135
|
+
static toObjectId(id) {
|
|
136
|
+
return new mongodb_1.ObjectId(id);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Check if a string is a valid ObjectId
|
|
140
|
+
*/
|
|
141
|
+
static isValidObjectId(id) {
|
|
142
|
+
return mongodb_1.ObjectId.isValid(id);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
exports.Bloko = Bloko;
|
|
146
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;AAAA,qCAA4E;AAE5E,4CAAgD;AAChD,2CAA4C;AAC5C,qDAAsD;AAEtD,iBAAiB;AACjB,8DAAwD;AACxD,0DAAoD;AACpD,4DAAqD;AACrD,0DAAoD;AACpD,oDAA8C;AAC9C,kDAA4C;AAC5C,wDAAkD;AAClD,oDAA8C;AAC9C,oEAA6D;AAC7D,8EAAsE;AACtE,oEAA6D;AAI7D,MAAa,KAAK;IACR,KAAK,CAAkB;IACvB,EAAE,CAAY;IACd,OAAO,CAAkB;IACzB,EAAE,CAAM;IACR,UAAU,GAAG,KAAK,CAAC;IAE3B,mBAAmB;IACZ,WAAW,CAAe;IAC1B,SAAS,CAAa;IACtB,SAAS,CAAa;IACtB,SAAS,CAAa;IACtB,MAAM,CAAU;IAChB,KAAK,CAAS;IACd,QAAQ,CAAY;IACpB,MAAM,CAAU;IAChB,aAAa,CAAiB;IAC9B,iBAAiB,CAAqB;IACtC,aAAa,CAAiB;IAErC,YAAY,MAAmB;QAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,0BAAe,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,EAAE,GAAG,IAAI,iBAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QAErC,0BAA0B;QAC1B,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC;QAE7B,IAAI,CAAC,OAAO,GAAG,IAAI,2BAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAEO,gBAAgB;QACtB,OAAO;YACL,aAAa,EAAE,CAAqB,IAAY,EAAiB,EAAE;gBACjE,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAI,IAAI,CAAC,CAAC;YACrC,CAAC;SACF,CAAC;IACJ,CAAC;IAEO,kBAAkB;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAEpC,yBAAyB;QACzB,IAAI,CAAC,WAAW,GAAG,IAAI,4BAAW,CAChC,GAAG,EACH,CAAC,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,YAAY,CAAC,CACrE,CAAC;QAEF,uBAAuB;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,wBAAS,CAC5B,GAAG,EACH,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,EACtD,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,SAAS,EAAE,SAAS,CAAC,CACnF,CAAC;QAEF,uBAAuB;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,yBAAS,CAC5B,GAAG,EACH,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAC/D,CAAC;QAEF,uBAAuB;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,wBAAS,CAC5B,GAAG,EACH,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAC9D,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CACtD,CAAC;QAEF,oBAAoB;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAM,CACtB,GAAG,EACH,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,EACrD,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,OAAO,CAAC,EAChE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CACpD,CAAC;QAEF,oBAAoB;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAM,CACtB,GAAG,EACH,IAAI,CAAC,EAAE,EACP,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,EACrD,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CACtD,CAAC;QAEF,2BAA2B;QAC3B,IAAI,CAAC,aAAa,GAAG,IAAI,iCAAa,CACpC,GAAG,EACH,IAAI,CAAC,EAAE,EACP,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CACjD,CAAC;QAEF,mBAAmB;QACnB,IAAI,CAAC,KAAK,GAAG,IAAI,gBAAK,CACpB,GAAG,EACH,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAClD;YACE,gBAAgB,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACvE,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACnE,oBAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE;gBACvD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAC3D,OAAO,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,KAAK,YAAY,CAAC,QAAQ,EAAE,CAAC;YACtE,CAAC;YACD,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACnE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7D,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE;gBACjD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAClD,OAAO,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE,KAAK,YAAY,CAAC,QAAQ,EAAE,CAAC;YACnE,CAAC;SACF,CACF,CAAC;QAEF,sBAAsB;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAQ,CAAC,GAAG,EAAE;YAChC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7D,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE;gBACjD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAClD,OAAO,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE,KAAK,YAAY,CAAC,QAAQ,EAAE,CAAC;YACnE,CAAC;SACF,CAAC,CAAC;QAEH,+BAA+B;QAC/B,IAAI,CAAC,iBAAiB,GAAG,IAAI,0CAAiB,CAC5C,GAAG,EACH,CAAC,kBAAkB,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,EACtF,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CACtD,CAAC;QAEF,2BAA2B;QAC3B,IAAI,CAAC,aAAa,GAAG,IAAI,iCAAa,CAAC,GAAG,EAAE;YAC1C,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,mBAAmB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;SACjE,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,EAAU;QAC1B,OAAO,IAAI,kBAAQ,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,EAAU;QAC/B,OAAO,kBAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;CACF;AAzLD,sBAyLC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { MongoClientOptions } from 'mongodb';
|
|
2
|
+
export interface S3Config {
|
|
3
|
+
bucket: string;
|
|
4
|
+
region: string;
|
|
5
|
+
accessKeyId?: string;
|
|
6
|
+
secretAccessKey?: string;
|
|
7
|
+
endpoint?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface BlokoConfig {
|
|
10
|
+
mongoUri: string;
|
|
11
|
+
mongoOptions?: MongoClientOptions;
|
|
12
|
+
dbName: string;
|
|
13
|
+
s3: S3Config;
|
|
14
|
+
}
|
|
15
|
+
export declare const COLLECTION_NAMES: {
|
|
16
|
+
readonly collections: "collections";
|
|
17
|
+
readonly languages: "languages";
|
|
18
|
+
readonly nodes: "nodes";
|
|
19
|
+
readonly nodeTypes: "node_types";
|
|
20
|
+
readonly templates: "templates";
|
|
21
|
+
readonly blocks: "blocks";
|
|
22
|
+
readonly contents: "contents";
|
|
23
|
+
readonly images: "images";
|
|
24
|
+
readonly imageVariants: "image_variants";
|
|
25
|
+
readonly nodeRelationTypes: "node_relation_types";
|
|
26
|
+
readonly nodeRelations: "node_relations";
|
|
27
|
+
};
|
|
28
|
+
export type CollectionName = (typeof COLLECTION_NAMES)[keyof typeof COLLECTION_NAMES];
|
|
29
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,QAAQ,CAAC;CACd;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;CAYnB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.COLLECTION_NAMES = void 0;
|
|
4
|
+
exports.COLLECTION_NAMES = {
|
|
5
|
+
collections: 'collections',
|
|
6
|
+
languages: 'languages',
|
|
7
|
+
nodes: 'nodes',
|
|
8
|
+
nodeTypes: 'node_types',
|
|
9
|
+
templates: 'templates',
|
|
10
|
+
blocks: 'blocks',
|
|
11
|
+
contents: 'contents',
|
|
12
|
+
images: 'images',
|
|
13
|
+
imageVariants: 'image_variants',
|
|
14
|
+
nodeRelationTypes: 'node_relation_types',
|
|
15
|
+
nodeRelations: 'node_relations',
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;AAiBa,QAAA,gBAAgB,GAAG;IAC9B,WAAW,EAAE,aAAa;IAC1B,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,aAAa,EAAE,gBAAgB;IAC/B,iBAAiB,EAAE,qBAAqB;IACxC,aAAa,EAAE,gBAAgB;CACvB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Db, Collection, Document } from 'mongodb';
|
|
2
|
+
import type { BlokoConfig } from '../config.js';
|
|
3
|
+
import { CollectionName } from '../config.js';
|
|
4
|
+
export declare class MongoConnection {
|
|
5
|
+
private config;
|
|
6
|
+
private client;
|
|
7
|
+
private db;
|
|
8
|
+
constructor(config: BlokoConfig);
|
|
9
|
+
connect(): Promise<Db>;
|
|
10
|
+
disconnect(): Promise<void>;
|
|
11
|
+
getDb(): Db;
|
|
12
|
+
getCollection<T extends Document = Document>(name: CollectionName): Collection<T>;
|
|
13
|
+
private ensureIndexes;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=mongo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongo.d.ts","sourceRoot":"","sources":["../../src/db/mongo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAoB,cAAc,EAAE,MAAM,cAAc,CAAC;AAEhE,qBAAa,eAAe;IAId,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,EAAE,CAAmB;gBAET,MAAM,EAAE,WAAW;IAEjC,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC;IActB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC,KAAK,IAAI,EAAE;IAOX,aAAa,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,EAAE,IAAI,EAAE,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC;YAInE,aAAa;CA2E5B"}
|
package/dist/db/mongo.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MongoConnection = void 0;
|
|
4
|
+
const mongodb_1 = require("mongodb");
|
|
5
|
+
const config_js_1 = require("../config.js");
|
|
6
|
+
class MongoConnection {
|
|
7
|
+
config;
|
|
8
|
+
client = null;
|
|
9
|
+
db = null;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
}
|
|
13
|
+
async connect() {
|
|
14
|
+
if (this.db) {
|
|
15
|
+
return this.db;
|
|
16
|
+
}
|
|
17
|
+
this.client = new mongodb_1.MongoClient(this.config.mongoUri, this.config.mongoOptions);
|
|
18
|
+
await this.client.connect();
|
|
19
|
+
this.db = this.client.db(this.config.dbName);
|
|
20
|
+
await this.ensureIndexes();
|
|
21
|
+
return this.db;
|
|
22
|
+
}
|
|
23
|
+
async disconnect() {
|
|
24
|
+
if (this.client) {
|
|
25
|
+
await this.client.close();
|
|
26
|
+
this.client = null;
|
|
27
|
+
this.db = null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
getDb() {
|
|
31
|
+
if (!this.db) {
|
|
32
|
+
throw new Error('Database not connected. Call connect() first.');
|
|
33
|
+
}
|
|
34
|
+
return this.db;
|
|
35
|
+
}
|
|
36
|
+
getCollection(name) {
|
|
37
|
+
return this.getDb().collection(name);
|
|
38
|
+
}
|
|
39
|
+
async ensureIndexes() {
|
|
40
|
+
const db = this.getDb();
|
|
41
|
+
// Collections indexes
|
|
42
|
+
await db.collection(config_js_1.COLLECTION_NAMES.collections).createIndex({ code: 1 }, { unique: true });
|
|
43
|
+
// Languages - no extra indexes needed, _id is the language code and is already unique
|
|
44
|
+
// Nodes indexes
|
|
45
|
+
await db.collection(config_js_1.COLLECTION_NAMES.nodes).createIndexes([
|
|
46
|
+
{ key: { _collection: 1, code: 1 }, unique: true },
|
|
47
|
+
{ key: { _collection: 1 } },
|
|
48
|
+
{ key: { _parent: 1 } },
|
|
49
|
+
{ key: { _template: 1 } },
|
|
50
|
+
{ key: { _node_type: 1 } },
|
|
51
|
+
{ key: { 'slug.en': 1, _parent: 1 }, sparse: true },
|
|
52
|
+
{ key: { 'slug.ro': 1, _parent: 1 }, sparse: true },
|
|
53
|
+
]);
|
|
54
|
+
// Node Types indexes
|
|
55
|
+
await db.collection(config_js_1.COLLECTION_NAMES.nodeTypes).createIndex({ code: 1 }, { unique: true });
|
|
56
|
+
// Templates indexes
|
|
57
|
+
await db.collection(config_js_1.COLLECTION_NAMES.templates).createIndexes([
|
|
58
|
+
{ key: { _collection: 1, code: 1 }, unique: true },
|
|
59
|
+
{ key: { _collection: 1 } },
|
|
60
|
+
]);
|
|
61
|
+
// Blocks indexes
|
|
62
|
+
await db.collection(config_js_1.COLLECTION_NAMES.blocks).createIndexes([
|
|
63
|
+
{ key: { _template: 1, code: 1 }, unique: true },
|
|
64
|
+
{ key: { _template: 1 } },
|
|
65
|
+
{ key: { _parent: 1 } },
|
|
66
|
+
]);
|
|
67
|
+
// Contents indexes
|
|
68
|
+
await db.collection(config_js_1.COLLECTION_NAMES.contents).createIndexes([
|
|
69
|
+
{ key: { _node: 1, _block: 1 }, unique: true },
|
|
70
|
+
{ key: { _node: 1 } },
|
|
71
|
+
{ key: { _block: 1 } },
|
|
72
|
+
]);
|
|
73
|
+
// Images indexes
|
|
74
|
+
await db.collection(config_js_1.COLLECTION_NAMES.images).createIndexes([
|
|
75
|
+
{ key: { _collection: 1 } },
|
|
76
|
+
{ key: { s3_key: 1 }, unique: true },
|
|
77
|
+
]);
|
|
78
|
+
// Image Variants indexes
|
|
79
|
+
await db.collection(config_js_1.COLLECTION_NAMES.imageVariants).createIndexes([
|
|
80
|
+
{ key: { _image: 1, width: 1, height: 1, format: 1 }, unique: true },
|
|
81
|
+
{ key: { _image: 1 } },
|
|
82
|
+
{ key: { s3_key: 1 }, unique: true },
|
|
83
|
+
]);
|
|
84
|
+
// Node Relation Types indexes
|
|
85
|
+
await db.collection(config_js_1.COLLECTION_NAMES.nodeRelationTypes).createIndexes([
|
|
86
|
+
{ key: { _collection: 1, code: 1 }, unique: true },
|
|
87
|
+
{ key: { _collection: 1 } },
|
|
88
|
+
]);
|
|
89
|
+
// Node Relations indexes
|
|
90
|
+
await db.collection(config_js_1.COLLECTION_NAMES.nodeRelations).createIndexes([
|
|
91
|
+
{ key: { _from: 1, _to: 1, _node_relation_type: 1 }, unique: true },
|
|
92
|
+
{ key: { _from: 1 } },
|
|
93
|
+
{ key: { _to: 1 } },
|
|
94
|
+
{ key: { _node_relation_type: 1 } },
|
|
95
|
+
]);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.MongoConnection = MongoConnection;
|
|
99
|
+
//# sourceMappingURL=mongo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongo.js","sourceRoot":"","sources":["../../src/db/mongo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Collection, Filter, ObjectId, WithId, Document, UpdateFilter } from 'mongodb';
|
|
2
|
+
import type { ZodSchema } from 'zod';
|
|
3
|
+
export interface EntityContext {
|
|
4
|
+
getCollection: <T extends Document>(name: string) => Collection<T>;
|
|
5
|
+
}
|
|
6
|
+
export declare abstract class BaseEntity<TDoc extends Document, TCreate, TUpdate> {
|
|
7
|
+
protected ctx: EntityContext;
|
|
8
|
+
protected abstract collectionName: string;
|
|
9
|
+
protected abstract createSchema: ZodSchema<TCreate>;
|
|
10
|
+
protected abstract updateSchema: ZodSchema<TUpdate>;
|
|
11
|
+
constructor(ctx: EntityContext);
|
|
12
|
+
protected get collection(): Collection<TDoc>;
|
|
13
|
+
protected validateCreate(data: unknown): TCreate;
|
|
14
|
+
protected validateUpdate(data: unknown): TUpdate;
|
|
15
|
+
findById(id: ObjectId): Promise<WithId<TDoc> | null>;
|
|
16
|
+
findByIdOrThrow(id: ObjectId): Promise<WithId<TDoc>>;
|
|
17
|
+
findMany(filter?: Filter<TDoc>): Promise<WithId<TDoc>[]>;
|
|
18
|
+
findOne(filter: Filter<TDoc>): Promise<WithId<TDoc> | null>;
|
|
19
|
+
count(filter?: Filter<TDoc>): Promise<number>;
|
|
20
|
+
exists(filter: Filter<TDoc>): Promise<boolean>;
|
|
21
|
+
protected updateOne(id: ObjectId, update: UpdateFilter<TDoc>): Promise<WithId<TDoc>>;
|
|
22
|
+
protected deleteOne(id: ObjectId): Promise<boolean>;
|
|
23
|
+
protected deleteMany(filter: Filter<TDoc>): Promise<number>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/entities/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAGrC,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC;CACpE;AAED,8BAAsB,UAAU,CAAC,IAAI,SAAS,QAAQ,EAAE,OAAO,EAAE,OAAO;IAK1D,SAAS,CAAC,GAAG,EAAE,aAAa;IAJxC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAC1C,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;gBAE9B,GAAG,EAAE,aAAa;IAExC,SAAS,KAAK,UAAU,IAAI,UAAU,CAAC,IAAI,CAAC,CAE3C;IAED,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAUhD,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAU1C,QAAQ,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAIpD,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAQpD,QAAQ,CAAC,MAAM,GAAE,MAAM,CAAC,IAAI,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IAI5D,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAI3D,KAAK,CAAC,MAAM,GAAE,MAAM,CAAC,IAAI,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIjD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;cAKpC,SAAS,CACvB,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,GACzB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;cAcR,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;cAKzC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAIlE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseEntity = void 0;
|
|
4
|
+
const types_js_1 = require("../types.js");
|
|
5
|
+
class BaseEntity {
|
|
6
|
+
ctx;
|
|
7
|
+
constructor(ctx) {
|
|
8
|
+
this.ctx = ctx;
|
|
9
|
+
}
|
|
10
|
+
get collection() {
|
|
11
|
+
return this.ctx.getCollection(this.collectionName);
|
|
12
|
+
}
|
|
13
|
+
validateCreate(data) {
|
|
14
|
+
const result = this.createSchema.safeParse(data);
|
|
15
|
+
if (!result.success) {
|
|
16
|
+
throw new types_js_1.ValidationError('Validation failed', {
|
|
17
|
+
errors: result.error.errors,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return result.data;
|
|
21
|
+
}
|
|
22
|
+
validateUpdate(data) {
|
|
23
|
+
const result = this.updateSchema.safeParse(data);
|
|
24
|
+
if (!result.success) {
|
|
25
|
+
throw new types_js_1.ValidationError('Validation failed', {
|
|
26
|
+
errors: result.error.errors,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return result.data;
|
|
30
|
+
}
|
|
31
|
+
async findById(id) {
|
|
32
|
+
return this.collection.findOne({ _id: id });
|
|
33
|
+
}
|
|
34
|
+
async findByIdOrThrow(id) {
|
|
35
|
+
const doc = await this.findById(id);
|
|
36
|
+
if (!doc) {
|
|
37
|
+
throw new types_js_1.NotFoundError(this.collectionName, id.toString());
|
|
38
|
+
}
|
|
39
|
+
return doc;
|
|
40
|
+
}
|
|
41
|
+
async findMany(filter = {}) {
|
|
42
|
+
return this.collection.find(filter).toArray();
|
|
43
|
+
}
|
|
44
|
+
async findOne(filter) {
|
|
45
|
+
return this.collection.findOne(filter);
|
|
46
|
+
}
|
|
47
|
+
async count(filter = {}) {
|
|
48
|
+
return this.collection.countDocuments(filter);
|
|
49
|
+
}
|
|
50
|
+
async exists(filter) {
|
|
51
|
+
const count = await this.collection.countDocuments(filter, { limit: 1 });
|
|
52
|
+
return count > 0;
|
|
53
|
+
}
|
|
54
|
+
async updateOne(id, update) {
|
|
55
|
+
const result = await this.collection.findOneAndUpdate({ _id: id }, update, { returnDocument: 'after' });
|
|
56
|
+
if (!result) {
|
|
57
|
+
throw new types_js_1.NotFoundError(this.collectionName, id.toString());
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
async deleteOne(id) {
|
|
62
|
+
const result = await this.collection.deleteOne({ _id: id });
|
|
63
|
+
return result.deletedCount > 0;
|
|
64
|
+
}
|
|
65
|
+
async deleteMany(filter) {
|
|
66
|
+
const result = await this.collection.deleteMany(filter);
|
|
67
|
+
return result.deletedCount;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.BaseEntity = BaseEntity;
|
|
71
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/entities/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { ObjectId } from 'mongodb';
|
|
2
|
+
import { BaseEntity, type EntityContext } from './base.js';
|
|
3
|
+
import type { BlockDoc } from '../types.js';
|
|
4
|
+
import { type BlockInput } from '../validation/schemas.js';
|
|
5
|
+
export declare class Blocks extends BaseEntity<BlockDoc, BlockInput, Partial<Omit<BlockInput, '_template'>>> {
|
|
6
|
+
private cascadeDelete;
|
|
7
|
+
private cascadeContentTypeChange;
|
|
8
|
+
private templateExists;
|
|
9
|
+
protected collectionName: "blocks";
|
|
10
|
+
protected createSchema: import("zod").ZodObject<{
|
|
11
|
+
code: import("zod").ZodString;
|
|
12
|
+
_template: import("zod").ZodEffects<import("zod").ZodString, string, string>;
|
|
13
|
+
_parent: import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodEffects<import("zod").ZodString, string, string>>>;
|
|
14
|
+
title: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodNullable<import("zod").ZodString>>>>;
|
|
15
|
+
content_type: import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodEnum<["number", "text", "text_list", "titled_text_list", "image", "images"]>>>;
|
|
16
|
+
sort: import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodNumber>>;
|
|
17
|
+
notes: import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodString>>;
|
|
18
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
19
|
+
code: string;
|
|
20
|
+
_template: string;
|
|
21
|
+
sort?: number | null | undefined;
|
|
22
|
+
_parent?: string | null | undefined;
|
|
23
|
+
title?: Record<string, string | null> | null | undefined;
|
|
24
|
+
notes?: string | null | undefined;
|
|
25
|
+
content_type?: "number" | "images" | "text" | "text_list" | "titled_text_list" | "image" | null | undefined;
|
|
26
|
+
}, {
|
|
27
|
+
code: string;
|
|
28
|
+
_template: string;
|
|
29
|
+
sort?: number | null | undefined;
|
|
30
|
+
_parent?: string | null | undefined;
|
|
31
|
+
title?: Record<string, string | null> | null | undefined;
|
|
32
|
+
notes?: string | null | undefined;
|
|
33
|
+
content_type?: "number" | "images" | "text" | "text_list" | "titled_text_list" | "image" | null | undefined;
|
|
34
|
+
}>;
|
|
35
|
+
protected updateSchema: import("zod").ZodObject<Omit<{
|
|
36
|
+
code: import("zod").ZodOptional<import("zod").ZodString>;
|
|
37
|
+
_template: import("zod").ZodOptional<import("zod").ZodEffects<import("zod").ZodString, string, string>>;
|
|
38
|
+
_parent: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodEffects<import("zod").ZodString, string, string>>>>;
|
|
39
|
+
title: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodNullable<import("zod").ZodString>>>>>;
|
|
40
|
+
content_type: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodEnum<["number", "text", "text_list", "titled_text_list", "image", "images"]>>>>;
|
|
41
|
+
sort: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodNumber>>>;
|
|
42
|
+
notes: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodString>>>;
|
|
43
|
+
}, "_template">, "strip", import("zod").ZodTypeAny, {
|
|
44
|
+
code?: string | undefined;
|
|
45
|
+
sort?: number | null | undefined;
|
|
46
|
+
_parent?: string | null | undefined;
|
|
47
|
+
title?: Record<string, string | null> | null | undefined;
|
|
48
|
+
notes?: string | null | undefined;
|
|
49
|
+
content_type?: "number" | "images" | "text" | "text_list" | "titled_text_list" | "image" | null | undefined;
|
|
50
|
+
}, {
|
|
51
|
+
code?: string | undefined;
|
|
52
|
+
sort?: number | null | undefined;
|
|
53
|
+
_parent?: string | null | undefined;
|
|
54
|
+
title?: Record<string, string | null> | null | undefined;
|
|
55
|
+
notes?: string | null | undefined;
|
|
56
|
+
content_type?: "number" | "images" | "text" | "text_list" | "titled_text_list" | "image" | null | undefined;
|
|
57
|
+
}>;
|
|
58
|
+
constructor(ctx: EntityContext, cascadeDelete: (blockId: ObjectId) => Promise<void>, cascadeContentTypeChange: (blockId: ObjectId) => Promise<void>, templateExists: (id: ObjectId) => Promise<boolean>);
|
|
59
|
+
private checkCircularReference;
|
|
60
|
+
create(data: BlockInput): Promise<BlockDoc & {
|
|
61
|
+
_id: ObjectId;
|
|
62
|
+
}>;
|
|
63
|
+
update(id: ObjectId, data: Partial<Omit<BlockInput, '_template'>>): Promise<BlockDoc & {
|
|
64
|
+
_id: ObjectId;
|
|
65
|
+
}>;
|
|
66
|
+
delete(id: ObjectId): Promise<boolean>;
|
|
67
|
+
findByCode(templateId: ObjectId, code: string): Promise<(BlockDoc & {
|
|
68
|
+
_id: ObjectId;
|
|
69
|
+
}) | null>;
|
|
70
|
+
findByTemplate(templateId: ObjectId): Promise<(BlockDoc & {
|
|
71
|
+
_id: ObjectId;
|
|
72
|
+
})[]>;
|
|
73
|
+
findChildren(parentId: ObjectId): Promise<(BlockDoc & {
|
|
74
|
+
_id: ObjectId;
|
|
75
|
+
})[]>;
|
|
76
|
+
findRootBlocks(templateId: ObjectId): Promise<(BlockDoc & {
|
|
77
|
+
_id: ObjectId;
|
|
78
|
+
})[]>;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=blocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/entities/blocks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,0BAA0B,CAAC;AAIlC,qBAAa,MAAO,SAAQ,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IAOhG,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,wBAAwB;IAChC,OAAO,CAAC,cAAc;IARxB,SAAS,CAAC,cAAc,WAA2B;IACnD,SAAS,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;OAAqB;IAC3C,SAAS,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;OAAqB;gBAGzC,GAAG,EAAE,aAAa,EACV,aAAa,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,EACnD,wBAAwB,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,EAC9D,cAAc,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC;YAK9C,sBAAsB;IAwB9B,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,GAAG;QAAE,GAAG,EAAE,QAAQ,CAAA;KAAE,CAAC;IA6C/D,MAAM,CACV,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,GAC3C,OAAO,CAAC,QAAQ,GAAG;QAAE,GAAG,EAAE,QAAQ,CAAA;KAAE,CAAC;IAyDlC,MAAM,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAOtC,UAAU,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;QAAE,GAAG,EAAE,QAAQ,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAI9F,cAAc,CAAC,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;QAAE,GAAG,EAAE,QAAQ,CAAA;KAAE,CAAC,EAAE,CAAC;IAI/E,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;QAAE,GAAG,EAAE,QAAQ,CAAA;KAAE,CAAC,EAAE,CAAC;IAI3E,cAAc,CAAC,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;QAAE,GAAG,EAAE,QAAQ,CAAA;KAAE,CAAC,EAAE,CAAC;CAGtF"}
|