@nocobase/plugin-data-source-main 1.2.12-alpha → 1.3.0-alpha.20240710084543

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