@tachybase/module-collection 0.23.8
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/.turbo/turbo-build.log +14 -0
- package/LICENSE +201 -0
- package/README.md +9 -0
- package/README.zh-CN.md +9 -0
- package/client.d.ts +2 -0
- package/client.js +1 -0
- package/dist/client/index.d.ts +5 -0
- package/dist/client/index.js +1 -0
- package/dist/externalVersion.js +14 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +39 -0
- package/dist/server/actions/collectionImportExportMeta.d.ts +2 -0
- package/dist/server/actions/collectionImportExportMeta.js +226 -0
- package/dist/server/collections/collectionCategories.d.ts +3 -0
- package/dist/server/collections/collectionCategories.js +52 -0
- package/dist/server/collections/collections.d.ts +3 -0
- package/dist/server/collections/collections.js +92 -0
- package/dist/server/collections/fields.d.ts +3 -0
- package/dist/server/collections/fields.js +94 -0
- package/dist/server/hooks/afterCreateForForeignKeyField.d.ts +2 -0
- package/dist/server/hooks/afterCreateForForeignKeyField.js +195 -0
- package/dist/server/hooks/afterCreateForReverseField.d.ts +4 -0
- package/dist/server/hooks/afterCreateForReverseField.js +37 -0
- package/dist/server/hooks/afterDestroyForForeignKeyField.d.ts +2 -0
- package/dist/server/hooks/afterDestroyForForeignKeyField.js +89 -0
- package/dist/server/hooks/beforeCreateForChildrenCollection.d.ts +5 -0
- package/dist/server/hooks/beforeCreateForChildrenCollection.js +58 -0
- package/dist/server/hooks/beforeCreateForReverseField.d.ts +4 -0
- package/dist/server/hooks/beforeCreateForReverseField.js +64 -0
- package/dist/server/hooks/beforeCreateForValidateField.d.ts +4 -0
- package/dist/server/hooks/beforeCreateForValidateField.js +48 -0
- package/dist/server/hooks/beforeCreateForViewCollection.d.ts +5 -0
- package/dist/server/hooks/beforeCreateForViewCollection.js +30 -0
- package/dist/server/hooks/beforeDestroyForeignKey.d.ts +2 -0
- package/dist/server/hooks/beforeDestroyForeignKey.js +66 -0
- package/dist/server/hooks/beforeInitOptions.d.ts +29 -0
- package/dist/server/hooks/beforeInitOptions.js +233 -0
- package/dist/server/hooks/index.d.ts +6 -0
- package/dist/server/hooks/index.js +31 -0
- package/dist/server/index.d.ts +4 -0
- package/dist/server/index.js +45 -0
- package/dist/server/migrations/20220613103214-alert-sub-table.d.ts +5 -0
- package/dist/server/migrations/20220613103214-alert-sub-table.js +40 -0
- package/dist/server/migrations/20220704225714-drop-foreign-keys.d.ts +5 -0
- package/dist/server/migrations/20220704225714-drop-foreign-keys.js +67 -0
- package/dist/server/migrations/20221101111110-update-foreign-fields.d.ts +5 -0
- package/dist/server/migrations/20221101111110-update-foreign-fields.js +64 -0
- package/dist/server/migrations/20221104151410-update-collections-hidden.d.ts +5 -0
- package/dist/server/migrations/20221104151410-update-collections-hidden.js +47 -0
- package/dist/server/migrations/20221121111110-update-fk-type.d.ts +5 -0
- package/dist/server/migrations/20221121111110-update-fk-type.js +144 -0
- package/dist/server/migrations/20221121111113-update-id-to-bigint.d.ts +5 -0
- package/dist/server/migrations/20221121111113-update-id-to-bigint.js +178 -0
- package/dist/server/migrations/20221221103220-timestamps.d.ts +5 -0
- package/dist/server/migrations/20221221103220-timestamps.js +45 -0
- package/dist/server/migrations/20230225111112-drop-ui-schema-relation.d.ts +5 -0
- package/dist/server/migrations/20230225111112-drop-ui-schema-relation.js +87 -0
- package/dist/server/migrations/20230509111114-alert-ui-schema.d.ts +5 -0
- package/dist/server/migrations/20230509111114-alert-ui-schema.js +77 -0
- package/dist/server/migrations/20230623145414-number-step.d.ts +5 -0
- package/dist/server/migrations/20230623145414-number-step.js +71 -0
- package/dist/server/migrations/20230704222935-tableoid.d.ts +5 -0
- package/dist/server/migrations/20230704222935-tableoid.js +73 -0
- package/dist/server/migrations/20230918024546-set-collection-schema.d.ts +5 -0
- package/dist/server/migrations/20230918024546-set-collection-schema.js +45 -0
- package/dist/server/migrations/20240220153103-install-main-datasource.d.ts +6 -0
- package/dist/server/migrations/20240220153103-install-main-datasource.js +41 -0
- package/dist/server/models/collection.d.ts +23 -0
- package/dist/server/models/collection.js +221 -0
- package/dist/server/models/field.d.ts +22 -0
- package/dist/server/models/field.js +188 -0
- package/dist/server/models/index.d.ts +2 -0
- package/dist/server/models/index.js +23 -0
- package/dist/server/repositories/collection-repository.d.ts +12 -0
- package/dist/server/repositories/collection-repository.js +135 -0
- package/dist/server/repositories/index.d.ts +1 -0
- package/dist/server/repositories/index.js +21 -0
- package/dist/server/resourcers/collections.d.ts +4 -0
- package/dist/server/resourcers/collections.js +93 -0
- package/dist/server/resourcers/sql.d.ts +10 -0
- package/dist/server/resourcers/sql.js +108 -0
- package/dist/server/resourcers/views.d.ts +9 -0
- package/dist/server/resourcers/views.js +98 -0
- package/dist/server/server.d.ts +11 -0
- package/dist/server/server.js +332 -0
- package/dist/swagger/index.d.ts +405 -0
- package/dist/swagger/index.js +431 -0
- package/package.json +34 -0
- package/server.d.ts +2 -0
- package/server.js +1 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var views_exports = {};
|
|
19
|
+
__export(views_exports, {
|
|
20
|
+
default: () => views_default
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(views_exports);
|
|
23
|
+
var import_database = require("@tachybase/database");
|
|
24
|
+
var views_default = {
|
|
25
|
+
name: "dbViews",
|
|
26
|
+
actions: {
|
|
27
|
+
async get(ctx, next) {
|
|
28
|
+
const { filterByTk, schema } = ctx.action.params;
|
|
29
|
+
const db = ctx.app.db;
|
|
30
|
+
const fields = await import_database.ViewFieldInference.inferFields({
|
|
31
|
+
db,
|
|
32
|
+
viewName: filterByTk,
|
|
33
|
+
viewSchema: schema
|
|
34
|
+
});
|
|
35
|
+
ctx.body = {
|
|
36
|
+
fields,
|
|
37
|
+
sources: [
|
|
38
|
+
...new Set(
|
|
39
|
+
Object.values(fields).map((field) => field.source).filter(Boolean).map((source) => source.split(".")[0])
|
|
40
|
+
)
|
|
41
|
+
]
|
|
42
|
+
};
|
|
43
|
+
await next();
|
|
44
|
+
},
|
|
45
|
+
list: async function(ctx, next) {
|
|
46
|
+
const db = ctx.app.db;
|
|
47
|
+
const dbViews = await db.queryInterface.listViews();
|
|
48
|
+
const viewCollections = Array.from(db.collections.values()).filter((collection) => collection.isView());
|
|
49
|
+
ctx.body = dbViews.map((dbView) => {
|
|
50
|
+
return {
|
|
51
|
+
...dbView
|
|
52
|
+
};
|
|
53
|
+
}).filter((dbView) => {
|
|
54
|
+
return !viewCollections.find((collection) => {
|
|
55
|
+
const viewName = dbView.name;
|
|
56
|
+
const schema = dbView.schema;
|
|
57
|
+
const collectionViewName = collection.options.viewName || collection.options.name;
|
|
58
|
+
return collectionViewName === viewName && collection.options.schema === schema;
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
await next();
|
|
62
|
+
},
|
|
63
|
+
async query(ctx, next) {
|
|
64
|
+
const { filterByTk, fieldTypes, schema = "public", page = 1, pageSize = 10 } = ctx.action.params;
|
|
65
|
+
const offset = (page - 1) * pageSize;
|
|
66
|
+
const limit = 1 * pageSize;
|
|
67
|
+
const sql = `SELECT *
|
|
68
|
+
FROM ${ctx.app.db.utils.quoteTable(
|
|
69
|
+
ctx.app.db.utils.addSchema(filterByTk, schema)
|
|
70
|
+
)} LIMIT ${limit} OFFSET ${offset}`;
|
|
71
|
+
const rawValues = await ctx.app.db.sequelize.query(sql, { type: "SELECT" });
|
|
72
|
+
if (fieldTypes) {
|
|
73
|
+
for (const raw of rawValues) {
|
|
74
|
+
const fakeInstance = {
|
|
75
|
+
dataValues: raw,
|
|
76
|
+
getDataValue: (key) => raw[key]
|
|
77
|
+
};
|
|
78
|
+
for (const fieldName of Object.keys(fieldTypes)) {
|
|
79
|
+
const fieldType = fieldTypes[fieldName];
|
|
80
|
+
const FieldClass = ctx.app.db.fieldTypes.get(fieldType);
|
|
81
|
+
const fieldOptions = new FieldClass(
|
|
82
|
+
{ name: fieldName },
|
|
83
|
+
{
|
|
84
|
+
db: ctx.app.db
|
|
85
|
+
}
|
|
86
|
+
).options;
|
|
87
|
+
if (fieldOptions.get) {
|
|
88
|
+
const newValue = fieldOptions.get.apply(fakeInstance);
|
|
89
|
+
raw[fieldName] = newValue;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
ctx.body = rawValues;
|
|
95
|
+
await next();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Filter } from '@tachybase/database';
|
|
2
|
+
import { Plugin } from '@tachybase/server';
|
|
3
|
+
export declare class CollectionManagerPlugin extends Plugin {
|
|
4
|
+
schema: string;
|
|
5
|
+
private loadFilter;
|
|
6
|
+
setLoadFilter(filter: Filter): void;
|
|
7
|
+
beforeLoad(): Promise<void>;
|
|
8
|
+
load(): Promise<void>;
|
|
9
|
+
install(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export default CollectionManagerPlugin;
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var server_exports = {};
|
|
29
|
+
__export(server_exports, {
|
|
30
|
+
CollectionManagerPlugin: () => CollectionManagerPlugin,
|
|
31
|
+
default: () => server_default
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(server_exports);
|
|
34
|
+
var import_path = __toESM(require("path"));
|
|
35
|
+
var process = __toESM(require("process"));
|
|
36
|
+
var import_worker_threads = require("worker_threads");
|
|
37
|
+
var import_database = require("@tachybase/database");
|
|
38
|
+
var import_server = require("@tachybase/server");
|
|
39
|
+
var import_async_mutex = require("async-mutex");
|
|
40
|
+
var import_lodash = __toESM(require("lodash"));
|
|
41
|
+
var import__ = require(".");
|
|
42
|
+
var import_collectionImportExportMeta = require("./actions/collectionImportExportMeta");
|
|
43
|
+
var import_hooks = require("./hooks");
|
|
44
|
+
var import_beforeCreateForValidateField = require("./hooks/beforeCreateForValidateField");
|
|
45
|
+
var import_beforeCreateForViewCollection = require("./hooks/beforeCreateForViewCollection");
|
|
46
|
+
var import_models = require("./models");
|
|
47
|
+
var import_collections = __toESM(require("./resourcers/collections"));
|
|
48
|
+
var import_sql = __toESM(require("./resourcers/sql"));
|
|
49
|
+
var import_views = __toESM(require("./resourcers/views"));
|
|
50
|
+
class CollectionManagerPlugin extends import_server.Plugin {
|
|
51
|
+
schema;
|
|
52
|
+
loadFilter = {};
|
|
53
|
+
setLoadFilter(filter) {
|
|
54
|
+
this.loadFilter = filter;
|
|
55
|
+
}
|
|
56
|
+
async beforeLoad() {
|
|
57
|
+
if (this.app.db.inDialect("postgres")) {
|
|
58
|
+
this.schema = process.env.COLLECTION_MANAGER_SCHEMA || this.db.options.schema || "public";
|
|
59
|
+
}
|
|
60
|
+
this.app.db.registerRepositories({
|
|
61
|
+
CollectionRepository: import__.CollectionRepository
|
|
62
|
+
});
|
|
63
|
+
this.app.db.registerModels({
|
|
64
|
+
CollectionModel: import_models.CollectionModel,
|
|
65
|
+
FieldModel: import_models.FieldModel
|
|
66
|
+
});
|
|
67
|
+
this.db.addMigrations({
|
|
68
|
+
namespace: "collection-manager",
|
|
69
|
+
directory: import_path.default.resolve(__dirname, "./migrations"),
|
|
70
|
+
context: {
|
|
71
|
+
plugin: this
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
this.app.db.on("collections.beforeCreate", async (model) => {
|
|
75
|
+
if (this.app.db.inDialect("postgres") && this.schema && model.get("from") !== "db2cm" && !model.get("schema")) {
|
|
76
|
+
model.set("schema", this.schema);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
this.app.db.on("collections.beforeCreate", (0, import_beforeCreateForViewCollection.beforeCreateForViewCollection)(this.db));
|
|
80
|
+
this.app.db.on(
|
|
81
|
+
"collections.afterCreateWithAssociations",
|
|
82
|
+
async (model, { context, transaction }) => {
|
|
83
|
+
if (context) {
|
|
84
|
+
await model.migrate({
|
|
85
|
+
transaction
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
);
|
|
90
|
+
this.app.db.on("collections.beforeDestroy", async (model, options) => {
|
|
91
|
+
const removeOptions = {};
|
|
92
|
+
if (options.transaction) {
|
|
93
|
+
removeOptions["transaction"] = options.transaction;
|
|
94
|
+
}
|
|
95
|
+
const cascade = import_lodash.default.get(options, "context.action.params.cascade", false);
|
|
96
|
+
if (cascade === true || cascade === "true") {
|
|
97
|
+
removeOptions["cascade"] = true;
|
|
98
|
+
}
|
|
99
|
+
await model.remove(removeOptions);
|
|
100
|
+
});
|
|
101
|
+
this.app.db.on("fields.beforeCreate", (0, import_hooks.beforeCreateForReverseField)(this.app.db));
|
|
102
|
+
this.app.db.on("fields.beforeCreate", async (model, options) => {
|
|
103
|
+
const collectionName = model.get("collectionName");
|
|
104
|
+
const collection = this.app.db.getCollection(collectionName);
|
|
105
|
+
if (!collection) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (collection.isInherited() && collection.parentFields().has(model.get("name"))) {
|
|
109
|
+
model.set("overriding", true);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
this.app.db.on("fields.beforeValidate", async (model) => {
|
|
113
|
+
if (model.get("name") && model.get("name").includes(".")) {
|
|
114
|
+
model.set("field", model.get("name"));
|
|
115
|
+
model.set("name", model.get("name").replace(/\./g, "_"));
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
this.app.db.on("fields.beforeCreate", async (model, options) => {
|
|
119
|
+
if (model.get("source")) return;
|
|
120
|
+
const type = model.get("type");
|
|
121
|
+
const fn = import_hooks.beforeInitOptions[type];
|
|
122
|
+
if (fn) {
|
|
123
|
+
await fn(model, { database: this.app.db });
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
this.app.db.on("fields.beforeCreate", (0, import_beforeCreateForValidateField.beforeCreateForValidateField)(this.app.db));
|
|
127
|
+
this.app.db.on("fields.afterCreate", (0, import_hooks.afterCreateForReverseField)(this.app.db));
|
|
128
|
+
this.app.db.on("fields.afterCreate", async (model, { context, transaction }) => {
|
|
129
|
+
if (context) {
|
|
130
|
+
await model.migrate({
|
|
131
|
+
isNew: true,
|
|
132
|
+
transaction
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
this.app.db.on("fields.afterCreate", (0, import_hooks.afterCreateForForeignKeyField)(this.app.db));
|
|
137
|
+
this.app.db.on("fields.beforeUpdate", async (model, options) => {
|
|
138
|
+
const newValue = options.values;
|
|
139
|
+
if (model.get("reverseKey") && import_lodash.default.get(newValue, "reverseField") && !import_lodash.default.get(newValue, "reverseField.key")) {
|
|
140
|
+
const field = await this.app.db.getModel("fields").findByPk(model.get("reverseKey"), { transaction: options.transaction });
|
|
141
|
+
if (field) {
|
|
142
|
+
throw new Error("cant update field without a reverseField key");
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (model.get("sortable") && model.get("type") === "hasMany") {
|
|
146
|
+
model.set("sortBy", model.get("foreignKey") + "Sort");
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
this.app.db.on("fields.afterUpdate", async (model, { context, transaction }) => {
|
|
150
|
+
const prevOptions = model.previous("options");
|
|
151
|
+
const currentOptions = model.get("options");
|
|
152
|
+
if (context) {
|
|
153
|
+
const prev = prevOptions["unique"];
|
|
154
|
+
const next = currentOptions["unique"];
|
|
155
|
+
if (Boolean(prev) !== Boolean(next)) {
|
|
156
|
+
await model.syncUniqueIndex({ transaction });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const prevDefaultValue = prevOptions["defaultValue"];
|
|
160
|
+
const currentDefaultValue = currentOptions["defaultValue"];
|
|
161
|
+
if (prevDefaultValue !== currentDefaultValue) {
|
|
162
|
+
await model.syncDefaultValue({ transaction, defaultValue: currentDefaultValue });
|
|
163
|
+
}
|
|
164
|
+
const prevOnDelete = prevOptions["onDelete"];
|
|
165
|
+
const currentOnDelete = currentOptions["onDelete"];
|
|
166
|
+
if (prevOnDelete !== currentOnDelete) {
|
|
167
|
+
await model.syncReferenceCheckOption({ transaction });
|
|
168
|
+
}
|
|
169
|
+
if (model.get("type") === "hasMany" && model.get("sortable") && model.get("sortBy")) {
|
|
170
|
+
await model.syncSortByField({ transaction });
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
this.app.db.on("fields.afterSaveWithAssociations", async (model, { context, transaction }) => {
|
|
174
|
+
if (context) {
|
|
175
|
+
await model.load({ transaction });
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
this.app.db.on("fields.beforeDestroy", (0, import_hooks.beforeDestroyForeignKey)(this.app.db));
|
|
179
|
+
const mutex = new import_async_mutex.Mutex();
|
|
180
|
+
this.app.db.on("fields.beforeDestroy", async (model, options) => {
|
|
181
|
+
await mutex.runExclusive(async () => {
|
|
182
|
+
await model.remove(options);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
this.app.db.on("fields.afterDestroy", async (model, options) => {
|
|
186
|
+
const { transaction } = options;
|
|
187
|
+
const collectionName = model.get("collectionName");
|
|
188
|
+
const childCollections = this.db.inheritanceMap.getChildren(collectionName);
|
|
189
|
+
const childShouldRemoveField = Array.from(childCollections).filter((item) => {
|
|
190
|
+
const parents = Array.from(this.db.inheritanceMap.getParents(item)).map((parent) => {
|
|
191
|
+
const collection = this.db.getCollection(parent);
|
|
192
|
+
const field = collection.getField(model.get("name"));
|
|
193
|
+
return field;
|
|
194
|
+
}).filter(Boolean);
|
|
195
|
+
return parents.length === 0;
|
|
196
|
+
});
|
|
197
|
+
await this.db.getCollection("fields").repository.destroy({
|
|
198
|
+
filter: {
|
|
199
|
+
name: model.get("name"),
|
|
200
|
+
collectionName: {
|
|
201
|
+
$in: childShouldRemoveField
|
|
202
|
+
},
|
|
203
|
+
options: {
|
|
204
|
+
overriding: true
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
transaction
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
const loadCollections = async () => {
|
|
211
|
+
this.log.debug("loading custom collections", { method: "loadCollections" });
|
|
212
|
+
this.app.setMaintainingMessage("loading custom collections");
|
|
213
|
+
await this.app.db.getRepository("collections").load({
|
|
214
|
+
filter: this.loadFilter
|
|
215
|
+
});
|
|
216
|
+
};
|
|
217
|
+
this.app.on("beforeStart", loadCollections);
|
|
218
|
+
if (!import_worker_threads.isMainThread) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
this.app.resourcer.use(
|
|
222
|
+
async (ctx, next) => {
|
|
223
|
+
const { resourceName, actionName } = ctx.action;
|
|
224
|
+
if (resourceName === "collections.fields" && actionName === "update") {
|
|
225
|
+
const { updateAssociationValues = [] } = ctx.action.params;
|
|
226
|
+
updateAssociationValues.push("uiSchema");
|
|
227
|
+
ctx.action.mergeParams({
|
|
228
|
+
updateAssociationValues
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
await next();
|
|
232
|
+
},
|
|
233
|
+
{ tag: "appendUISchemaOnFieldUpdate" }
|
|
234
|
+
);
|
|
235
|
+
this.app.acl.allow("collections", "list", "loggedIn");
|
|
236
|
+
this.app.acl.allow("collectionCategories", "list", "loggedIn");
|
|
237
|
+
this.app.resourcer.define(import_collectionImportExportMeta.collectionImportExportMeta);
|
|
238
|
+
}
|
|
239
|
+
async load() {
|
|
240
|
+
await this.importCollections(import_path.default.resolve(__dirname, "./collections"));
|
|
241
|
+
this.db.getRepository("collections").setApp(this.app);
|
|
242
|
+
const errorHandlerPlugin = this.app.getPlugin("error-handler");
|
|
243
|
+
errorHandlerPlugin.errorHandler.register(
|
|
244
|
+
(err) => {
|
|
245
|
+
return err instanceof import_database.UniqueConstraintError;
|
|
246
|
+
},
|
|
247
|
+
(err, ctx) => {
|
|
248
|
+
return ctx.throw(400, ctx.t(`The value of ${Object.keys(err.fields)} field duplicated`));
|
|
249
|
+
}
|
|
250
|
+
);
|
|
251
|
+
this.app.resourcer.use(
|
|
252
|
+
async (ctx, next) => {
|
|
253
|
+
if (ctx.action.resourceName === "collections.fields" && ["create", "update"].includes(ctx.action.actionName)) {
|
|
254
|
+
ctx.action.mergeParams({
|
|
255
|
+
updateAssociationValues: ["reverseField"]
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
await next();
|
|
259
|
+
},
|
|
260
|
+
{ tag: "setReverseFieldOnFieldChange" }
|
|
261
|
+
);
|
|
262
|
+
this.app.resource(import_views.default);
|
|
263
|
+
this.app.resource(import_sql.default);
|
|
264
|
+
this.app.actions(import_collections.default);
|
|
265
|
+
const handleFieldSource = (fields) => {
|
|
266
|
+
var _a;
|
|
267
|
+
for (const field of import_lodash.default.castArray(fields)) {
|
|
268
|
+
if (field.get("source")) {
|
|
269
|
+
const [collectionSource, fieldSource] = field.get("source").split(".");
|
|
270
|
+
const collectionField = (_a = this.app.db.getCollection(collectionSource)) == null ? void 0 : _a.getField(fieldSource);
|
|
271
|
+
if (!collectionField) {
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
const newOptions = {};
|
|
275
|
+
import_lodash.default.merge(newOptions, import_lodash.default.omit(collectionField.options, "name"));
|
|
276
|
+
import_lodash.default.mergeWith(newOptions, field.get(), (objValue, srcValue) => {
|
|
277
|
+
if (srcValue === null) {
|
|
278
|
+
return objValue;
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
field.set("options", newOptions);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
this.app.resourcer.use(
|
|
286
|
+
async (ctx, next) => {
|
|
287
|
+
var _a, _b;
|
|
288
|
+
await next();
|
|
289
|
+
if (ctx.action.resourceName === "collections" && ctx.action.actionName === "list" && ((_a = ctx.action.params) == null ? void 0 : _a.paginate) === "false") {
|
|
290
|
+
for (const collection of ctx.body) {
|
|
291
|
+
if (collection.get("view")) {
|
|
292
|
+
const fields = collection.fields;
|
|
293
|
+
handleFieldSource(fields);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
if (ctx.action.resourceName === "collections.fields" && ctx.action.actionName === "list") {
|
|
298
|
+
handleFieldSource(((_b = ctx.action.params) == null ? void 0 : _b.paginate) === "false" ? ctx.body : ctx.body.rows);
|
|
299
|
+
}
|
|
300
|
+
if (ctx.action.resourceName === "collections.fields" && ctx.action.actionName === "get") {
|
|
301
|
+
handleFieldSource(ctx.body);
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
{ tag: "handleFieldSourceOnListAndGet" }
|
|
305
|
+
);
|
|
306
|
+
this.app.db.extendCollection({
|
|
307
|
+
name: "collectionCategory",
|
|
308
|
+
dumpRules: "required",
|
|
309
|
+
origin: this.options.packageName
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
async install() {
|
|
313
|
+
const dataSourcesCollection = this.app.db.getCollection("dataSources");
|
|
314
|
+
if (dataSourcesCollection) {
|
|
315
|
+
await dataSourcesCollection.repository.firstOrCreate({
|
|
316
|
+
filterKeys: ["key"],
|
|
317
|
+
values: {
|
|
318
|
+
key: "main",
|
|
319
|
+
type: "main",
|
|
320
|
+
displayName: '{{t("Main")}}',
|
|
321
|
+
fixed: true,
|
|
322
|
+
options: {}
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
var server_default = CollectionManagerPlugin;
|
|
329
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
330
|
+
0 && (module.exports = {
|
|
331
|
+
CollectionManagerPlugin
|
|
332
|
+
});
|