@nocobase/plugin-data-source-main 1.0.0-alpha.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.
Files changed (91) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +9 -0
  3. package/README.zh-CN.md +9 -0
  4. package/client.d.ts +2 -0
  5. package/client.js +1 -0
  6. package/dist/client/index.d.ts +5 -0
  7. package/dist/client/index.js +1 -0
  8. package/dist/externalVersion.js +13 -0
  9. package/dist/index.d.ts +2 -0
  10. package/dist/index.js +39 -0
  11. package/dist/server/collections/collectionCategories.d.ts +3 -0
  12. package/dist/server/collections/collectionCategories.js +52 -0
  13. package/dist/server/collections/collections.d.ts +3 -0
  14. package/dist/server/collections/collections.js +92 -0
  15. package/dist/server/collections/fields.d.ts +3 -0
  16. package/dist/server/collections/fields.js +94 -0
  17. package/dist/server/hooks/afterCreateForForeignKeyField.d.ts +2 -0
  18. package/dist/server/hooks/afterCreateForForeignKeyField.js +208 -0
  19. package/dist/server/hooks/afterCreateForReverseField.d.ts +4 -0
  20. package/dist/server/hooks/afterCreateForReverseField.js +37 -0
  21. package/dist/server/hooks/afterDestroyForForeignKeyField.d.ts +2 -0
  22. package/dist/server/hooks/afterDestroyForForeignKeyField.js +89 -0
  23. package/dist/server/hooks/beforeCreateForChildrenCollection.d.ts +5 -0
  24. package/dist/server/hooks/beforeCreateForChildrenCollection.js +58 -0
  25. package/dist/server/hooks/beforeCreateForReverseField.d.ts +4 -0
  26. package/dist/server/hooks/beforeCreateForReverseField.js +64 -0
  27. package/dist/server/hooks/beforeCreateForValidateField.d.ts +7 -0
  28. package/dist/server/hooks/beforeCreateForValidateField.js +67 -0
  29. package/dist/server/hooks/beforeCreateForViewCollection.d.ts +5 -0
  30. package/dist/server/hooks/beforeCreateForViewCollection.js +30 -0
  31. package/dist/server/hooks/beforeDestroyForeignKey.d.ts +2 -0
  32. package/dist/server/hooks/beforeDestroyForeignKey.js +66 -0
  33. package/dist/server/hooks/beforeInitOptions.d.ts +15 -0
  34. package/dist/server/hooks/beforeInitOptions.js +128 -0
  35. package/dist/server/hooks/index.d.ts +5 -0
  36. package/dist/server/hooks/index.js +29 -0
  37. package/dist/server/index.d.ts +4 -0
  38. package/dist/server/index.js +45 -0
  39. package/dist/server/migrations/20220613103214-alert-sub-table.d.ts +5 -0
  40. package/dist/server/migrations/20220613103214-alert-sub-table.js +41 -0
  41. package/dist/server/migrations/20220704225714-drop-foreign-keys.d.ts +5 -0
  42. package/dist/server/migrations/20220704225714-drop-foreign-keys.js +70 -0
  43. package/dist/server/migrations/20221101111110-update-foreign-fields.d.ts +5 -0
  44. package/dist/server/migrations/20221101111110-update-foreign-fields.js +65 -0
  45. package/dist/server/migrations/20221104151410-update-collections-hidden.d.ts +5 -0
  46. package/dist/server/migrations/20221104151410-update-collections-hidden.js +48 -0
  47. package/dist/server/migrations/20221121111110-update-fk-type.d.ts +5 -0
  48. package/dist/server/migrations/20221121111110-update-fk-type.js +146 -0
  49. package/dist/server/migrations/20221121111113-update-id-to-bigint.d.ts +5 -0
  50. package/dist/server/migrations/20221121111113-update-id-to-bigint.js +180 -0
  51. package/dist/server/migrations/20221221103220-timestamps.d.ts +5 -0
  52. package/dist/server/migrations/20221221103220-timestamps.js +46 -0
  53. package/dist/server/migrations/20230225111112-drop-ui-schema-relation.d.ts +5 -0
  54. package/dist/server/migrations/20230225111112-drop-ui-schema-relation.js +88 -0
  55. package/dist/server/migrations/20230509111114-alert-ui-schema.d.ts +5 -0
  56. package/dist/server/migrations/20230509111114-alert-ui-schema.js +78 -0
  57. package/dist/server/migrations/20230623145414-number-step.d.ts +5 -0
  58. package/dist/server/migrations/20230623145414-number-step.js +72 -0
  59. package/dist/server/migrations/20230704222935-tableoid.d.ts +5 -0
  60. package/dist/server/migrations/20230704222935-tableoid.js +74 -0
  61. package/dist/server/migrations/20230918024546-set-collection-schema.d.ts +5 -0
  62. package/dist/server/migrations/20230918024546-set-collection-schema.js +46 -0
  63. package/dist/server/migrations/20240220153103-install-main-datasource.d.ts +6 -0
  64. package/dist/server/migrations/20240220153103-install-main-datasource.js +42 -0
  65. package/dist/server/migrations/20240419182147-fix-created-by-field-target.d.ts +6 -0
  66. package/dist/server/migrations/20240419182147-fix-created-by-field-target.js +40 -0
  67. package/dist/server/migrations/20240420105949-add-sort-field.d.ts +6 -0
  68. package/dist/server/migrations/20240420105949-add-sort-field.js +72 -0
  69. package/dist/server/models/collection.d.ts +19 -0
  70. package/dist/server/models/collection.js +185 -0
  71. package/dist/server/models/field.d.ts +18 -0
  72. package/dist/server/models/field.js +164 -0
  73. package/dist/server/models/index.d.ts +2 -0
  74. package/dist/server/models/index.js +23 -0
  75. package/dist/server/repositories/collection-repository.d.ts +12 -0
  76. package/dist/server/repositories/collection-repository.js +159 -0
  77. package/dist/server/repositories/index.d.ts +1 -0
  78. package/dist/server/repositories/index.js +21 -0
  79. package/dist/server/resourcers/collections.d.ts +4 -0
  80. package/dist/server/resourcers/collections.js +93 -0
  81. package/dist/server/resourcers/sql.d.ts +10 -0
  82. package/dist/server/resourcers/sql.js +106 -0
  83. package/dist/server/resourcers/views.d.ts +9 -0
  84. package/dist/server/resourcers/views.js +107 -0
  85. package/dist/server/server.d.ts +11 -0
  86. package/dist/server/server.js +345 -0
  87. package/dist/swagger/index.d.ts +405 -0
  88. package/dist/swagger/index.js +431 -0
  89. package/package.json +29 -0
  90. package/server.d.ts +2 -0
  91. package/server.js +1 -0
@@ -0,0 +1,18 @@
1
+ import Database, { Collection, MagicAttributeModel, Transactionable } from '@nocobase/database';
2
+ interface LoadOptions extends Transactionable {
3
+ skipExist?: boolean;
4
+ }
5
+ export declare class FieldModel extends MagicAttributeModel {
6
+ get db(): Database;
7
+ isAssociationField(): boolean;
8
+ load(loadOptions?: LoadOptions): Promise<import("@nocobase/database").Field>;
9
+ syncSortByField(options: Transactionable): Promise<void>;
10
+ remove(options?: any): Promise<void>;
11
+ syncUniqueIndex(options: Transactionable): Promise<void>;
12
+ syncDefaultValue(options: Transactionable & {
13
+ defaultValue: any;
14
+ }): Promise<void>;
15
+ syncReferenceCheckOption(options: Transactionable): Promise<void>;
16
+ protected getFieldCollection(): Collection | null;
17
+ }
18
+ export {};
@@ -0,0 +1,164 @@
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 field_exports = {};
19
+ __export(field_exports, {
20
+ FieldModel: () => FieldModel
21
+ });
22
+ module.exports = __toCommonJS(field_exports);
23
+ var import_database = require("@nocobase/database");
24
+ class FieldModel extends import_database.MagicAttributeModel {
25
+ get db() {
26
+ return this.constructor.database;
27
+ }
28
+ isAssociationField() {
29
+ return ["belongsTo", "hasOne", "hasMany", "belongsToMany"].includes(this.get("type"));
30
+ }
31
+ async load(loadOptions) {
32
+ const { skipExist = false, transaction } = loadOptions || {};
33
+ const collectionName = this.get("collectionName");
34
+ if (!this.db.hasCollection(collectionName)) {
35
+ return;
36
+ }
37
+ const collection = this.db.getCollection(collectionName);
38
+ const name = this.get("name");
39
+ if (skipExist && collection.hasField(name)) {
40
+ return collection.getField(name);
41
+ }
42
+ const options = this.get();
43
+ const field = await (async () => {
44
+ await new Promise((resolve) => setTimeout(resolve, 0));
45
+ return collection.setField(name, options);
46
+ })();
47
+ await this.db.emitAsync("field:loaded", {
48
+ fieldKey: this.get("key"),
49
+ transaction
50
+ });
51
+ return field;
52
+ }
53
+ async syncSortByField(options) {
54
+ const collectionName = this.get("collectionName");
55
+ const collection = this.db.getCollection(collectionName);
56
+ await this.load(options);
57
+ await collection.sync({
58
+ force: false,
59
+ alter: {
60
+ drop: false
61
+ },
62
+ // @ts-ignore
63
+ transaction: options.transaction
64
+ });
65
+ }
66
+ async remove(options) {
67
+ const collection = this.getFieldCollection();
68
+ if (!collection) {
69
+ return;
70
+ }
71
+ return collection.removeFieldFromDb(this.get("name"), {
72
+ transaction: options.transaction
73
+ });
74
+ }
75
+ async syncUniqueIndex(options) {
76
+ const unique = this.get("unique");
77
+ const collection = this.getFieldCollection();
78
+ const field = collection.getField(this.get("name"));
79
+ const columnName = collection.model.rawAttributes[this.get("name")].field;
80
+ const tableName = collection.model.tableName;
81
+ const queryInterface = this.db.sequelize.getQueryInterface();
82
+ const existsIndexes = await queryInterface.showIndex(collection.getTableNameWithSchema(), {
83
+ transaction: options.transaction
84
+ });
85
+ const existUniqueIndex = existsIndexes.find((item) => {
86
+ return item.unique && item.fields[0].attribute === columnName && item.fields.length === 1;
87
+ });
88
+ let existsUniqueConstraint;
89
+ const constraintName = `${tableName}_${field.name}_uk`;
90
+ if (existUniqueIndex) {
91
+ const existsUniqueConstraints = await queryInterface.showConstraint(
92
+ collection.getTableNameWithSchema(),
93
+ constraintName,
94
+ {}
95
+ );
96
+ existsUniqueConstraint = existsUniqueConstraints[0];
97
+ }
98
+ if (unique && !existsUniqueConstraint) {
99
+ await collection.sync({ ...options, force: false, alter: { drop: false } });
100
+ await queryInterface.addConstraint(collection.getTableNameWithSchema(), {
101
+ type: "unique",
102
+ fields: [columnName],
103
+ name: constraintName,
104
+ transaction: options.transaction
105
+ });
106
+ this.db.logger.info(`add unique index ${constraintName}`);
107
+ }
108
+ if (!unique && existsUniqueConstraint) {
109
+ await queryInterface.removeConstraint(collection.getTableNameWithSchema(), constraintName, {
110
+ transaction: options.transaction
111
+ });
112
+ this.db.logger.info(`remove unique index ${constraintName}`);
113
+ }
114
+ }
115
+ async syncDefaultValue(options) {
116
+ const collection = this.getFieldCollection();
117
+ if (!collection) {
118
+ return;
119
+ }
120
+ if (collection.isView()) {
121
+ return;
122
+ }
123
+ const field = collection.getField(this.get("name"));
124
+ if (field.get("overriding")) {
125
+ return;
126
+ }
127
+ const queryInterface = collection.db.sequelize.getQueryInterface();
128
+ await queryInterface.changeColumn(
129
+ collection.getTableNameWithSchema(),
130
+ collection.model.rawAttributes[this.get("name")].field,
131
+ {
132
+ type: field.dataType,
133
+ defaultValue: options.defaultValue
134
+ },
135
+ {
136
+ transaction: options.transaction
137
+ }
138
+ );
139
+ }
140
+ async syncReferenceCheckOption(options) {
141
+ const reverseKey = this.get("reverseKey");
142
+ if (!reverseKey)
143
+ return;
144
+ const reverseField = await this.db.getCollection("fields").repository.findOne({
145
+ filterByTk: reverseKey,
146
+ transaction: options.transaction
147
+ });
148
+ if (!reverseField)
149
+ return;
150
+ reverseField.set("onDelete", this.get("onDelete"));
151
+ await reverseField.save({ hooks: false, transaction: options.transaction });
152
+ }
153
+ getFieldCollection() {
154
+ const collectionName = this.get("collectionName");
155
+ if (!this.db.hasCollection(collectionName)) {
156
+ return;
157
+ }
158
+ return this.db.getCollection(collectionName);
159
+ }
160
+ }
161
+ // Annotate the CommonJS export names for ESM import in node:
162
+ 0 && (module.exports = {
163
+ FieldModel
164
+ });
@@ -0,0 +1,2 @@
1
+ export * from './collection';
2
+ export * from './field';
@@ -0,0 +1,23 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __copyProps = (to, from, except, desc) => {
6
+ if (from && typeof from === "object" || typeof from === "function") {
7
+ for (let key of __getOwnPropNames(from))
8
+ if (!__hasOwnProp.call(to, key) && key !== except)
9
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
10
+ }
11
+ return to;
12
+ };
13
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var models_exports = {};
16
+ module.exports = __toCommonJS(models_exports);
17
+ __reExport(models_exports, require("./collection"), module.exports);
18
+ __reExport(models_exports, require("./field"), module.exports);
19
+ // Annotate the CommonJS export names for ESM import in node:
20
+ 0 && (module.exports = {
21
+ ...require("./collection"),
22
+ ...require("./field")
23
+ });
@@ -0,0 +1,12 @@
1
+ import { Repository } from '@nocobase/database';
2
+ interface LoadOptions {
3
+ filter?: any;
4
+ skipExist?: boolean;
5
+ }
6
+ export declare class CollectionRepository extends Repository {
7
+ private app;
8
+ setApp(app: any): void;
9
+ load(options?: LoadOptions): Promise<void>;
10
+ db2cm(collectionName: string): Promise<void>;
11
+ }
12
+ export {};
@@ -0,0 +1,159 @@
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 collection_repository_exports = {};
29
+ __export(collection_repository_exports, {
30
+ CollectionRepository: () => CollectionRepository
31
+ });
32
+ module.exports = __toCommonJS(collection_repository_exports);
33
+ var import_database = require("@nocobase/database");
34
+ var import_utils = require("@nocobase/utils");
35
+ var import_lodash = __toESM(require("lodash"));
36
+ class CollectionRepository extends import_database.Repository {
37
+ app;
38
+ setApp(app) {
39
+ this.app = app;
40
+ }
41
+ async load(options = {}) {
42
+ const { filter, skipExist } = options;
43
+ const instances = await this.find({ filter, appends: ["fields"] });
44
+ const graphlib = import_utils.CollectionsGraph.graphlib();
45
+ const graph = new graphlib.Graph();
46
+ const nameMap = {};
47
+ const viewCollections = [];
48
+ for (const instance of instances) {
49
+ graph.setNode(instance.get("name"));
50
+ if (instance.get("view") || instance.get("sql")) {
51
+ viewCollections.push(instance.get("name"));
52
+ }
53
+ }
54
+ for (const instance of instances) {
55
+ const collectionName = instance.get("name");
56
+ nameMap[collectionName] = instance;
57
+ if (instance.get("inherits")) {
58
+ for (const parent of instance.get("inherits")) {
59
+ graph.setEdge(parent, collectionName);
60
+ }
61
+ }
62
+ }
63
+ if (graph.nodeCount() === 0)
64
+ return;
65
+ if (!graphlib.alg.isAcyclic(graph)) {
66
+ const cycles = graphlib.alg.findCycles(graph);
67
+ throw new Error(`Cyclic dependencies: ${cycles.map((cycle) => cycle.join(" -> ")).join(", ")}`);
68
+ }
69
+ const sortedNames = graphlib.alg.topsort(graph);
70
+ const lazyCollectionFields = /* @__PURE__ */ new Map();
71
+ for (const instanceName of sortedNames) {
72
+ if (!nameMap[instanceName])
73
+ continue;
74
+ const skipField = (() => {
75
+ if (viewCollections.includes(instanceName)) {
76
+ return true;
77
+ }
78
+ const fields = nameMap[instanceName].get("fields");
79
+ return fields.filter((field) => field["type"] === "belongsTo" || field["type"] === "belongsToMany").map((field) => field.get("name"));
80
+ })();
81
+ if (import_lodash.default.isArray(skipField) && skipField.length) {
82
+ lazyCollectionFields.set(instanceName, skipField);
83
+ }
84
+ this.database.logger.debug(`load collection`, {
85
+ instanceName,
86
+ submodule: "CollectionRepository",
87
+ method: "load"
88
+ });
89
+ this.app.setMaintainingMessage(`load ${instanceName} collection`);
90
+ await nameMap[instanceName].load({ skipField });
91
+ }
92
+ const fieldWithSourceAttributes = /* @__PURE__ */ new Map();
93
+ for (const viewCollectionName of viewCollections) {
94
+ this.database.logger.debug(`load collection fields`, {
95
+ submodule: "CollectionRepository",
96
+ method: "load",
97
+ viewCollectionName
98
+ });
99
+ const skipField = (() => {
100
+ const fields = nameMap[viewCollectionName].get("fields");
101
+ return fields.filter((field) => {
102
+ var _a;
103
+ if (((_a = field.options) == null ? void 0 : _a.source) && (field["type"] === "belongsTo" || field["type"] === "belongsToMany")) {
104
+ return true;
105
+ }
106
+ return false;
107
+ }).map((field) => field.get("name"));
108
+ })();
109
+ this.app.setMaintainingMessage(`load ${viewCollectionName} collection fields`);
110
+ if (import_lodash.default.isArray(skipField) && skipField.length) {
111
+ fieldWithSourceAttributes.set(viewCollectionName, skipField);
112
+ }
113
+ await nameMap[viewCollectionName].loadFields({ skipField });
114
+ }
115
+ for (const [collectionName, skipField] of lazyCollectionFields) {
116
+ this.database.logger.debug(`load collection fields`, {
117
+ submodule: "CollectionRepository",
118
+ method: "load",
119
+ collectionName
120
+ });
121
+ this.app.setMaintainingMessage(`load ${collectionName} collection fields`);
122
+ await nameMap[collectionName].loadFields({ includeFields: skipField });
123
+ }
124
+ for (const [collectionName, skipField] of fieldWithSourceAttributes) {
125
+ this.database.logger.debug(`load collection fields`, {
126
+ submodule: "CollectionRepository",
127
+ method: "load",
128
+ collectionName
129
+ });
130
+ this.app.setMaintainingMessage(`load ${collectionName} collection fields`);
131
+ await nameMap[collectionName].loadFields({ includeFields: skipField });
132
+ }
133
+ }
134
+ async db2cm(collectionName) {
135
+ const collection = this.database.getCollection(collectionName);
136
+ if (await this.findOne({ filter: { name: collectionName } })) {
137
+ return;
138
+ }
139
+ const options = collection.options;
140
+ const fields = [];
141
+ for (const [name, field] of collection.fields) {
142
+ fields.push({
143
+ name,
144
+ ...field.options
145
+ });
146
+ }
147
+ await this.create({
148
+ values: {
149
+ ...options,
150
+ fields,
151
+ from: "db2cm"
152
+ }
153
+ });
154
+ }
155
+ }
156
+ // Annotate the CommonJS export names for ESM import in node:
157
+ 0 && (module.exports = {
158
+ CollectionRepository
159
+ });
@@ -0,0 +1 @@
1
+ export * from './collection-repository';
@@ -0,0 +1,21 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __copyProps = (to, from, except, desc) => {
6
+ if (from && typeof from === "object" || typeof from === "function") {
7
+ for (let key of __getOwnPropNames(from))
8
+ if (!__hasOwnProp.call(to, key) && key !== except)
9
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
10
+ }
11
+ return to;
12
+ };
13
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var repositories_exports = {};
16
+ module.exports = __toCommonJS(repositories_exports);
17
+ __reExport(repositories_exports, require("./collection-repository"), module.exports);
18
+ // Annotate the CommonJS export names for ESM import in node:
19
+ 0 && (module.exports = {
20
+ ...require("./collection-repository")
21
+ });
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ "collections:setFields"(ctx: any, next: any): Promise<void>;
3
+ };
4
+ export default _default;
@@ -0,0 +1,93 @@
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 collections_exports = {};
19
+ __export(collections_exports, {
20
+ default: () => collections_default
21
+ });
22
+ module.exports = __toCommonJS(collections_exports);
23
+ var collections_default = {
24
+ async ["collections:setFields"](ctx, next) {
25
+ var _a;
26
+ const { filterByTk, values } = ctx.action.params;
27
+ const transaction = await ctx.app.db.sequelize.transaction();
28
+ try {
29
+ const fields = (_a = values.fields) == null ? void 0 : _a.map((f) => {
30
+ delete f.key;
31
+ return f;
32
+ });
33
+ const db = ctx.app.db;
34
+ const collectionModel = await db.getRepository("collections").findOne({
35
+ filter: {
36
+ name: filterByTk
37
+ },
38
+ transaction
39
+ });
40
+ const existFields = await collectionModel.getFields({
41
+ transaction
42
+ });
43
+ const needUpdateFields = fields.filter((f) => {
44
+ return existFields.find((ef) => ef.name === f.name);
45
+ }).map((f) => {
46
+ return {
47
+ ...f,
48
+ key: existFields.find((ef) => ef.name === f.name).key
49
+ };
50
+ });
51
+ const needDestroyFields = existFields.filter((ef) => {
52
+ return !fields.find((f) => f.name === ef.name);
53
+ });
54
+ const needCreatedFields = fields.filter((f) => {
55
+ return !existFields.find((ef) => ef.name === f.name);
56
+ });
57
+ if (needDestroyFields.length) {
58
+ await db.getRepository("fields").destroy({
59
+ filterByTk: needDestroyFields.map((f) => f.key),
60
+ transaction
61
+ });
62
+ }
63
+ if (needUpdateFields.length) {
64
+ await db.getRepository("fields").updateMany({
65
+ records: needUpdateFields,
66
+ transaction
67
+ });
68
+ }
69
+ if (needCreatedFields.length) {
70
+ await db.getRepository("collections.fields", filterByTk).create({
71
+ values: needCreatedFields,
72
+ transaction
73
+ });
74
+ }
75
+ await collectionModel.loadFields({
76
+ transaction
77
+ });
78
+ const collection = db.getCollection(filterByTk);
79
+ await collection.sync({
80
+ force: false,
81
+ alter: {
82
+ drop: false
83
+ },
84
+ transaction
85
+ });
86
+ await transaction.commit();
87
+ } catch (e) {
88
+ await transaction.rollback();
89
+ throw e;
90
+ }
91
+ await next();
92
+ }
93
+ };
@@ -0,0 +1,10 @@
1
+ import { Context, Next } from '@nocobase/actions';
2
+ declare const _default: {
3
+ name: string;
4
+ actions: {
5
+ execute: (ctx: Context, next: Next) => Promise<void>;
6
+ setFields: (ctx: Context, next: Next) => Promise<void>;
7
+ update: (ctx: Context, next: Next) => Promise<void>;
8
+ };
9
+ };
10
+ export default _default;
@@ -0,0 +1,106 @@
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 sql_exports = {};
19
+ __export(sql_exports, {
20
+ default: () => sql_default
21
+ });
22
+ module.exports = __toCommonJS(sql_exports);
23
+ var import_database = require("@nocobase/database");
24
+ const updateCollection = async (ctx, transaction) => {
25
+ const { filterByTk, values } = ctx.action.params;
26
+ const repo = ctx.db.getRepository("collections");
27
+ const collection = await repo.findOne({
28
+ filter: {
29
+ name: filterByTk
30
+ },
31
+ transaction
32
+ });
33
+ const existFields = await collection.getFields({ transaction });
34
+ const deletedFields = existFields.filter((field) => {
35
+ var _a;
36
+ return !((_a = values.fields) == null ? void 0 : _a.find((f) => f.name === field.name));
37
+ });
38
+ for (const field of deletedFields) {
39
+ await field.destroy({ transaction });
40
+ }
41
+ const upRes = await repo.update({
42
+ filterByTk,
43
+ values,
44
+ updateAssociationValues: ["fields"],
45
+ transaction
46
+ });
47
+ return { collection, upRes };
48
+ };
49
+ var sql_default = {
50
+ name: "sqlCollection",
51
+ actions: {
52
+ execute: async (ctx, next) => {
53
+ let { sql } = ctx.action.params.values || {};
54
+ if (!sql) {
55
+ ctx.throw(400, ctx.t("Please enter a SQL statement"));
56
+ }
57
+ sql = sql.trim().split(";").shift();
58
+ if (!/^select/i.test(sql) && !/^with([\s\S]+)select([\s\S]+)/i.test(sql)) {
59
+ ctx.throw(400, ctx.t("Only supports SELECT statements or WITH clauses"));
60
+ }
61
+ const tmpCollection = new import_database.SqlCollection({ name: "tmp", sql }, { database: ctx.db });
62
+ const model = tmpCollection.model;
63
+ const data = await model.findAll({ attributes: ["*"], limit: 5, raw: true });
64
+ let fields = {};
65
+ try {
66
+ fields = model.inferFields();
67
+ } catch (err) {
68
+ ctx.logger.warn(`resource: sql-collection, action: execute, error: ${err}`);
69
+ fields = {};
70
+ }
71
+ const sources = Array.from(new Set(Object.values(fields).map((field) => field.collection)));
72
+ ctx.body = { data, fields, sources };
73
+ await next();
74
+ },
75
+ setFields: async (ctx, next) => {
76
+ const transaction = await ctx.app.db.sequelize.transaction();
77
+ try {
78
+ const {
79
+ upRes: [collection]
80
+ } = await updateCollection(ctx, transaction);
81
+ await collection.loadFields({
82
+ transaction
83
+ });
84
+ await transaction.commit();
85
+ } catch (e) {
86
+ await transaction.rollback();
87
+ throw e;
88
+ }
89
+ await next();
90
+ },
91
+ update: async (ctx, next) => {
92
+ const transaction = await ctx.app.db.sequelize.transaction();
93
+ try {
94
+ const { upRes } = await updateCollection(ctx, transaction);
95
+ const [collection] = upRes;
96
+ await collection.load({ transaction, resetFields: true });
97
+ await transaction.commit();
98
+ ctx.body = upRes;
99
+ } catch (e) {
100
+ await transaction.rollback();
101
+ throw e;
102
+ }
103
+ await next();
104
+ }
105
+ }
106
+ };
@@ -0,0 +1,9 @@
1
+ declare const _default: {
2
+ name: string;
3
+ actions: {
4
+ get(ctx: any, next: any): Promise<void>;
5
+ list: (ctx: any, next: any) => Promise<void>;
6
+ query(ctx: any, next: any): Promise<void>;
7
+ };
8
+ };
9
+ export default _default;