adminforth 1.4.3-next.2 → 1.4.3-next.21

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 (191) hide show
  1. package/commands/bundle.js +29 -0
  2. package/commands/generateModels.js +63 -0
  3. package/commands/utils.js +93 -0
  4. package/dist/adminforth/auth.d.ts +31 -0
  5. package/dist/adminforth/auth.d.ts.map +1 -0
  6. package/dist/adminforth/auth.js +119 -0
  7. package/dist/adminforth/auth.js.map +1 -0
  8. package/dist/adminforth/basePlugin.d.ts +23 -0
  9. package/dist/adminforth/basePlugin.d.ts.map +1 -0
  10. package/dist/adminforth/basePlugin.js +51 -0
  11. package/dist/adminforth/basePlugin.js.map +1 -0
  12. package/dist/adminforth/dataConnectors/baseConnector.d.ts +95 -0
  13. package/dist/adminforth/dataConnectors/baseConnector.d.ts.map +1 -0
  14. package/dist/adminforth/dataConnectors/baseConnector.js +178 -0
  15. package/dist/adminforth/dataConnectors/baseConnector.js.map +1 -0
  16. package/dist/adminforth/dataConnectors/clickhouse.d.ts +93 -0
  17. package/dist/adminforth/dataConnectors/clickhouse.d.ts.map +1 -0
  18. package/dist/adminforth/dataConnectors/clickhouse.js +297 -0
  19. package/dist/adminforth/dataConnectors/clickhouse.js.map +1 -0
  20. package/dist/adminforth/dataConnectors/mongo.d.ts +94 -0
  21. package/dist/adminforth/dataConnectors/mongo.d.ts.map +1 -0
  22. package/dist/adminforth/dataConnectors/mongo.js +168 -0
  23. package/dist/adminforth/dataConnectors/mongo.js.map +1 -0
  24. package/dist/adminforth/dataConnectors/postgres.d.ts +72 -0
  25. package/dist/adminforth/dataConnectors/postgres.d.ts.map +1 -0
  26. package/dist/adminforth/dataConnectors/postgres.js +298 -0
  27. package/dist/adminforth/dataConnectors/postgres.js.map +1 -0
  28. package/dist/adminforth/dataConnectors/sqlite.d.ts +67 -0
  29. package/dist/adminforth/dataConnectors/sqlite.d.ts.map +1 -0
  30. package/dist/adminforth/dataConnectors/sqlite.js +251 -0
  31. package/dist/adminforth/dataConnectors/sqlite.js.map +1 -0
  32. package/dist/adminforth/index.d.ts +94 -0
  33. package/dist/adminforth/index.d.ts.map +1 -0
  34. package/dist/adminforth/index.js +357 -0
  35. package/dist/adminforth/index.js.map +1 -0
  36. package/dist/adminforth/modules/codeInjector.d.ts +38 -0
  37. package/dist/adminforth/modules/codeInjector.d.ts.map +1 -0
  38. package/dist/adminforth/modules/codeInjector.js +673 -0
  39. package/dist/adminforth/modules/codeInjector.js.map +1 -0
  40. package/dist/adminforth/modules/configValidator.d.ts +13 -0
  41. package/dist/adminforth/modules/configValidator.d.ts.map +1 -0
  42. package/dist/adminforth/modules/configValidator.js +511 -0
  43. package/dist/adminforth/modules/configValidator.js.map +1 -0
  44. package/dist/adminforth/modules/operationalResource.d.ts +17 -0
  45. package/dist/adminforth/modules/operationalResource.d.ts.map +1 -0
  46. package/dist/adminforth/modules/operationalResource.js +75 -0
  47. package/dist/adminforth/modules/operationalResource.js.map +1 -0
  48. package/dist/adminforth/modules/restApi.d.ts +11 -0
  49. package/dist/adminforth/modules/restApi.d.ts.map +1 -0
  50. package/dist/adminforth/modules/restApi.js +657 -0
  51. package/dist/adminforth/modules/restApi.js.map +1 -0
  52. package/dist/adminforth/modules/styleGenerator.d.ts +9 -0
  53. package/dist/adminforth/modules/styleGenerator.d.ts.map +1 -0
  54. package/dist/adminforth/modules/styleGenerator.js +47 -0
  55. package/dist/adminforth/modules/styleGenerator.js.map +1 -0
  56. package/dist/adminforth/modules/styles.d.ts +96 -0
  57. package/dist/adminforth/modules/styles.d.ts.map +1 -0
  58. package/dist/adminforth/modules/styles.js +105 -0
  59. package/dist/adminforth/modules/styles.js.map +1 -0
  60. package/dist/adminforth/modules/utils.d.ts +39 -0
  61. package/dist/adminforth/modules/utils.d.ts.map +1 -0
  62. package/dist/adminforth/modules/utils.js +421 -0
  63. package/dist/adminforth/modules/utils.js.map +1 -0
  64. package/dist/adminforth/plugins/audit-log/index.d.ts +25 -0
  65. package/dist/adminforth/plugins/audit-log/index.d.ts.map +1 -0
  66. package/dist/adminforth/plugins/audit-log/index.js +129 -0
  67. package/dist/adminforth/plugins/audit-log/index.js.map +1 -0
  68. package/dist/adminforth/plugins/audit-log/types.d.ts +35 -0
  69. package/dist/adminforth/plugins/audit-log/types.d.ts.map +1 -0
  70. package/dist/adminforth/plugins/audit-log/types.js +2 -0
  71. package/dist/adminforth/plugins/audit-log/types.js.map +1 -0
  72. package/dist/adminforth/plugins/chat-gpt/index.d.ts +14 -0
  73. package/dist/adminforth/plugins/chat-gpt/index.d.ts.map +1 -0
  74. package/dist/adminforth/plugins/chat-gpt/index.js +147 -0
  75. package/dist/adminforth/plugins/chat-gpt/index.js.map +1 -0
  76. package/dist/adminforth/plugins/chat-gpt/types.d.ts +82 -0
  77. package/dist/adminforth/plugins/chat-gpt/types.d.ts.map +1 -0
  78. package/dist/adminforth/plugins/chat-gpt/types.js +2 -0
  79. package/dist/adminforth/plugins/chat-gpt/types.js.map +1 -0
  80. package/dist/adminforth/plugins/email-password-reset/index.d.ts +15 -0
  81. package/dist/adminforth/plugins/email-password-reset/index.d.ts.map +1 -0
  82. package/dist/adminforth/plugins/email-password-reset/index.js +176 -0
  83. package/dist/adminforth/plugins/email-password-reset/index.js.map +1 -0
  84. package/dist/adminforth/plugins/email-password-reset/types.d.ts +28 -0
  85. package/dist/adminforth/plugins/email-password-reset/types.d.ts.map +1 -0
  86. package/dist/adminforth/plugins/email-password-reset/types.js +2 -0
  87. package/dist/adminforth/plugins/email-password-reset/types.js.map +1 -0
  88. package/dist/adminforth/plugins/foreign-inline-list/index.d.ts +13 -0
  89. package/dist/adminforth/plugins/foreign-inline-list/index.d.ts.map +1 -0
  90. package/dist/adminforth/plugins/foreign-inline-list/index.js +56 -0
  91. package/dist/adminforth/plugins/foreign-inline-list/index.js.map +1 -0
  92. package/dist/adminforth/plugins/foreign-inline-list/types.d.ts +19 -0
  93. package/dist/adminforth/plugins/foreign-inline-list/types.d.ts.map +1 -0
  94. package/dist/adminforth/plugins/foreign-inline-list/types.js +2 -0
  95. package/dist/adminforth/plugins/foreign-inline-list/types.js.map +1 -0
  96. package/dist/adminforth/plugins/import-export/index.d.ts +15 -0
  97. package/dist/adminforth/plugins/import-export/index.d.ts.map +1 -0
  98. package/dist/adminforth/plugins/import-export/index.js +127 -0
  99. package/dist/adminforth/plugins/import-export/index.js.map +1 -0
  100. package/dist/adminforth/plugins/import-export/types.d.ts +3 -0
  101. package/dist/adminforth/plugins/import-export/types.d.ts.map +1 -0
  102. package/dist/adminforth/plugins/import-export/types.js +2 -0
  103. package/dist/adminforth/plugins/import-export/types.js.map +1 -0
  104. package/dist/adminforth/plugins/rich-editor/index.d.ts +17 -0
  105. package/dist/adminforth/plugins/rich-editor/index.d.ts.map +1 -0
  106. package/dist/adminforth/plugins/rich-editor/index.js +262 -0
  107. package/dist/adminforth/plugins/rich-editor/index.js.map +1 -0
  108. package/dist/adminforth/plugins/rich-editor/types.d.ts +153 -0
  109. package/dist/adminforth/plugins/rich-editor/types.d.ts.map +1 -0
  110. package/dist/adminforth/plugins/rich-editor/types.js +16 -0
  111. package/dist/adminforth/plugins/rich-editor/types.js.map +1 -0
  112. package/dist/adminforth/plugins/two-factors-auth/index.d.ts +16 -0
  113. package/dist/adminforth/plugins/two-factors-auth/index.d.ts.map +1 -0
  114. package/dist/adminforth/plugins/two-factors-auth/index.js +134 -0
  115. package/dist/adminforth/plugins/two-factors-auth/index.js.map +1 -0
  116. package/dist/adminforth/plugins/two-factors-auth/types.d.ts +18 -0
  117. package/dist/adminforth/plugins/two-factors-auth/types.d.ts.map +1 -0
  118. package/dist/adminforth/plugins/two-factors-auth/types.js +2 -0
  119. package/dist/adminforth/plugins/two-factors-auth/types.js.map +1 -0
  120. package/dist/adminforth/plugins/upload/index.d.ts +14 -0
  121. package/dist/adminforth/plugins/upload/index.d.ts.map +1 -0
  122. package/dist/adminforth/plugins/upload/index.js +450 -0
  123. package/dist/adminforth/plugins/upload/index.js.map +1 -0
  124. package/dist/adminforth/plugins/upload/types.d.ts +132 -0
  125. package/dist/adminforth/plugins/upload/types.d.ts.map +1 -0
  126. package/dist/adminforth/plugins/upload/types.js +2 -0
  127. package/dist/adminforth/plugins/upload/types.js.map +1 -0
  128. package/dist/adminforth/servers/express.d.ts +18 -0
  129. package/dist/adminforth/servers/express.d.ts.map +1 -0
  130. package/dist/adminforth/servers/express.js +238 -0
  131. package/dist/adminforth/servers/express.js.map +1 -0
  132. package/dist/adminforth/types/Back.d.ts +1103 -0
  133. package/dist/adminforth/types/Back.d.ts.map +1 -0
  134. package/dist/adminforth/types/Back.js +86 -0
  135. package/dist/adminforth/types/Back.js.map +1 -0
  136. package/dist/adminforth/types/Common.d.ts +616 -0
  137. package/dist/adminforth/types/Common.d.ts.map +1 -0
  138. package/dist/adminforth/types/Common.js +65 -0
  139. package/dist/adminforth/types/Common.js.map +1 -0
  140. package/dist/adminforth/types/FrontendAPI.d.ts +134 -0
  141. package/dist/adminforth/types/FrontendAPI.d.ts.map +1 -0
  142. package/dist/adminforth/types/FrontendAPI.js +8 -0
  143. package/dist/adminforth/types/FrontendAPI.js.map +1 -0
  144. package/dist/dataConnectors/baseConnector.d.ts.map +1 -1
  145. package/dist/dataConnectors/baseConnector.js +7 -2
  146. package/dist/dataConnectors/baseConnector.js.map +1 -1
  147. package/dist/dataConnectors/postgres.js +3 -3
  148. package/dist/dataConnectors/postgres.js.map +1 -1
  149. package/dist/dev-demo/index.d.ts +3 -0
  150. package/dist/dev-demo/index.d.ts.map +1 -0
  151. package/dist/dev-demo/index.js +1052 -0
  152. package/dist/dev-demo/index.js.map +1 -0
  153. package/dist/modules/codeInjector.d.ts +4 -2
  154. package/dist/modules/codeInjector.d.ts.map +1 -1
  155. package/dist/modules/codeInjector.js +93 -69
  156. package/dist/modules/codeInjector.js.map +1 -1
  157. package/dist/modules/restApi.d.ts.map +1 -1
  158. package/dist/modules/restApi.js +33 -19
  159. package/dist/modules/restApi.js.map +1 -1
  160. package/dist/modules/utils.d.ts.map +1 -1
  161. package/dist/modules/utils.js +0 -1
  162. package/dist/modules/utils.js.map +1 -1
  163. package/dist/servers/express.d.ts.map +1 -1
  164. package/dist/servers/express.js +4 -1
  165. package/dist/servers/express.js.map +1 -1
  166. package/dist/spa/package-lock.json +64 -4
  167. package/dist/spa/package.json +1 -0
  168. package/dist/spa/src/App.vue +15 -25
  169. package/dist/spa/src/acl/Button.vue +21 -0
  170. package/dist/spa/src/acl/Link.vue +9 -0
  171. package/dist/spa/src/afcl/Button.vue +27 -0
  172. package/dist/spa/src/afcl/Input.vue +41 -0
  173. package/dist/spa/src/afcl/Link.vue +9 -0
  174. package/dist/spa/src/afcl/Select.vue +206 -0
  175. package/dist/spa/src/afcl/index.ts +6 -0
  176. package/dist/spa/src/components/Filters.vue +11 -5
  177. package/dist/spa/src/components/GroupsTable.vue +23 -23
  178. package/dist/spa/src/components/ValueRenderer.vue +3 -1
  179. package/dist/spa/src/renderers/CompactField.vue +1 -1
  180. package/dist/spa/src/renderers/CompactUUID.vue +1 -1
  181. package/dist/spa/src/renderers/CountryFlag.vue +3 -4
  182. package/dist/spa/src/renderers/HumanNumber.vue +3 -2
  183. package/dist/spa/src/renderers/RelativeTime.vue +3 -2
  184. package/dist/spa/src/router/index.ts +1 -1
  185. package/dist/spa/src/types/Back.ts +47 -13
  186. package/dist/spa/src/views/LoginView.vue +4 -15
  187. package/dist/spa/vite.config.ts +16 -34
  188. package/dist/types/Back.d.ts +21 -6
  189. package/dist/types/Back.d.ts.map +1 -1
  190. package/dist/types/Back.js.map +1 -1
  191. package/package.json +3 -2
@@ -0,0 +1,450 @@
1
+ import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
2
+ import { ExpirationStatus, GetObjectCommand, PutObjectCommand, S3 } from '@aws-sdk/client-s3';
3
+ import { AdminForthPlugin, suggestIfTypo } from "adminforth";
4
+ import { Readable } from "stream";
5
+ import { RateLimiter, getClinetIp } from "adminforth";
6
+ const ADMINFORTH_NOT_YET_USED_TAG = 'adminforth-candidate-for-cleanup';
7
+ export default class UploadPlugin extends AdminForthPlugin {
8
+ constructor(options) {
9
+ super(options, import.meta.url);
10
+ this.options = options;
11
+ }
12
+ instanceUniqueRepresentation(pluginOptions) {
13
+ return `${pluginOptions.pathColumnName}`;
14
+ }
15
+ async setupLifecycleRule() {
16
+ // check that lifecyle rule "adminforth-unused-cleaner" exists
17
+ const CLEANUP_RULE_ID = 'adminforth-unused-cleaner';
18
+ const s3 = new S3({
19
+ credentials: {
20
+ accessKeyId: this.options.s3AccessKeyId,
21
+ secretAccessKey: this.options.s3SecretAccessKey,
22
+ },
23
+ region: this.options.s3Region,
24
+ });
25
+ // check bucket exists
26
+ const bucketExists = s3.headBucket({ Bucket: this.options.s3Bucket });
27
+ if (!bucketExists) {
28
+ throw new Error(`Bucket ${this.options.s3Bucket} does not exist`);
29
+ }
30
+ // check that lifecycle rule exists
31
+ let ruleExists = false;
32
+ try {
33
+ const lifecycleConfig = await s3.getBucketLifecycleConfiguration({ Bucket: this.options.s3Bucket });
34
+ ruleExists = lifecycleConfig.Rules.some((rule) => rule.ID === CLEANUP_RULE_ID);
35
+ }
36
+ catch (e) {
37
+ if (e.name !== 'NoSuchLifecycleConfiguration') {
38
+ throw e;
39
+ }
40
+ else {
41
+ ruleExists = false;
42
+ }
43
+ }
44
+ if (!ruleExists) {
45
+ // create
46
+ // rule deletes object has tag adminforth-candidate-for-cleanup = true after 2 days
47
+ const params = {
48
+ Bucket: this.options.s3Bucket,
49
+ LifecycleConfiguration: {
50
+ Rules: [
51
+ {
52
+ ID: CLEANUP_RULE_ID,
53
+ Status: ExpirationStatus.Enabled,
54
+ Filter: {
55
+ Tag: {
56
+ Key: ADMINFORTH_NOT_YET_USED_TAG,
57
+ Value: 'true'
58
+ }
59
+ },
60
+ Expiration: {
61
+ Days: 2
62
+ }
63
+ }
64
+ ]
65
+ }
66
+ };
67
+ await s3.putBucketLifecycleConfiguration(params);
68
+ }
69
+ }
70
+ async genPreviewUrl(record, s3) {
71
+ var _a;
72
+ if ((_a = this.options.preview) === null || _a === void 0 ? void 0 : _a.previewUrl) {
73
+ record[`previewUrl_${this.pluginInstanceId}`] = this.options.preview.previewUrl({ s3Path: record[this.options.pathColumnName] });
74
+ return;
75
+ }
76
+ const previewUrl = await await getSignedUrl(s3, new GetObjectCommand({
77
+ Bucket: this.options.s3Bucket,
78
+ Key: record[this.options.pathColumnName],
79
+ }));
80
+ record[`previewUrl_${this.pluginInstanceId}`] = previewUrl;
81
+ }
82
+ async modifyResourceConfig(adminforth, resourceConfig) {
83
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
84
+ super.modifyResourceConfig(adminforth, resourceConfig);
85
+ // after column to store the path of the uploaded file, add new VirtualColumn,
86
+ // show only in edit and create views
87
+ // use component uploader.vue
88
+ const { pathColumnName } = this.options;
89
+ const pathColumnIndex = resourceConfig.columns.findIndex((column) => column.name === pathColumnName);
90
+ if (pathColumnIndex === -1) {
91
+ throw new Error(`Column with name "${pathColumnName}" not found in resource "${resourceConfig.name}"`);
92
+ }
93
+ if ((_a = this.options.generation) === null || _a === void 0 ? void 0 : _a.fieldsForContext) {
94
+ (_b = this.options.generation) === null || _b === void 0 ? void 0 : _b.fieldsForContext.forEach((field) => {
95
+ if (!resourceConfig.columns.find((column) => column.name === field)) {
96
+ const similar = suggestIfTypo(resourceConfig.columns.map((column) => column.name), field);
97
+ throw new Error(`Field "${field}" specified in fieldsForContext not found in
98
+ resource "${resourceConfig.label}". ${similar ? `Did you mean "${similar}"?` : ''}`);
99
+ }
100
+ });
101
+ }
102
+ const pluginFrontendOptions = {
103
+ allowedExtensions: this.options.allowedFileExtensions,
104
+ maxFileSize: this.options.maxFileSize,
105
+ pluginInstanceId: this.pluginInstanceId,
106
+ resourceLabel: resourceConfig.label,
107
+ generateImages: this.options.generation ? true : false,
108
+ pathColumnLabel: resourceConfig.columns[pathColumnIndex].label,
109
+ fieldsForContext: (_c = this.options.generation) === null || _c === void 0 ? void 0 : _c.fieldsForContext,
110
+ };
111
+ // define components which will be imported from other components
112
+ this.componentPath('imageGenerator.vue');
113
+ const virtualColumn = {
114
+ virtual: true,
115
+ name: `uploader_${this.pluginInstanceId}`,
116
+ components: {
117
+ edit: {
118
+ file: this.componentPath('uploader.vue'),
119
+ meta: pluginFrontendOptions,
120
+ },
121
+ create: {
122
+ file: this.componentPath('uploader.vue'),
123
+ meta: pluginFrontendOptions,
124
+ },
125
+ },
126
+ showIn: ['edit', 'create'],
127
+ };
128
+ if (!resourceConfig.columns[pathColumnIndex].components) {
129
+ resourceConfig.columns[pathColumnIndex].components = {};
130
+ }
131
+ if (((_d = this.options.preview) === null || _d === void 0 ? void 0 : _d.showInList) || ((_e = this.options.preview) === null || _e === void 0 ? void 0 : _e.showInList) === undefined) {
132
+ // add preview column to list
133
+ resourceConfig.columns[pathColumnIndex].components.list = {
134
+ file: this.componentPath('preview.vue'),
135
+ meta: pluginFrontendOptions,
136
+ };
137
+ }
138
+ if (((_f = this.options.preview) === null || _f === void 0 ? void 0 : _f.showInShow) || ((_g = this.options.preview) === null || _g === void 0 ? void 0 : _g.showInShow) === undefined) {
139
+ resourceConfig.columns[pathColumnIndex].components.show = {
140
+ file: this.componentPath('preview.vue'),
141
+ meta: pluginFrontendOptions,
142
+ };
143
+ }
144
+ // insert virtual column after path column if it is not already there
145
+ const virtualColumnIndex = resourceConfig.columns.findIndex((column) => column.name === virtualColumn.name);
146
+ if (virtualColumnIndex === -1) {
147
+ resourceConfig.columns.splice(pathColumnIndex + 1, 0, virtualColumn);
148
+ }
149
+ // if showIn of path column has 'create' or 'edit' remove it
150
+ const pathColumn = resourceConfig.columns[pathColumnIndex];
151
+ if (pathColumn.showIn && (pathColumn.showIn.includes('create') || pathColumn.showIn.includes('edit'))) {
152
+ pathColumn.showIn = pathColumn.showIn.filter((view) => !['create', 'edit'].includes(view));
153
+ }
154
+ virtualColumn.required = pathColumn.required;
155
+ virtualColumn.label = pathColumn.label;
156
+ virtualColumn.editingNote = pathColumn.editingNote;
157
+ // ** HOOKS FOR CREATE **//
158
+ // add beforeSave hook to save virtual column to path column
159
+ resourceConfig.hooks.create.beforeSave.push(async ({ record }) => {
160
+ if (record[virtualColumn.name]) {
161
+ record[pathColumnName] = record[virtualColumn.name];
162
+ delete record[virtualColumn.name];
163
+ }
164
+ return { ok: true };
165
+ });
166
+ // in afterSave hook, aremove tag adminforth-not-yet-used from the file
167
+ resourceConfig.hooks.create.afterSave.push(async ({ record }) => {
168
+ process.env.HEAVY_DEBUG && console.log('💾💾 after save ', record === null || record === void 0 ? void 0 : record.id);
169
+ if (record[pathColumnName]) {
170
+ const s3 = new S3({
171
+ credentials: {
172
+ accessKeyId: this.options.s3AccessKeyId,
173
+ secretAccessKey: this.options.s3SecretAccessKey,
174
+ },
175
+ region: this.options.s3Region,
176
+ });
177
+ process.env.HEAVY_DEBUG && console.log('🪥🪥 remove ObjectTagging', record[pathColumnName]);
178
+ // let it crash if it fails: this is a new file which just was uploaded.
179
+ await s3.putObjectTagging({
180
+ Bucket: this.options.s3Bucket,
181
+ Key: record[pathColumnName],
182
+ Tagging: {
183
+ TagSet: []
184
+ }
185
+ });
186
+ }
187
+ return { ok: true };
188
+ });
189
+ // ** HOOKS FOR SHOW **//
190
+ // add show hook to get presigned URL
191
+ resourceConfig.hooks.show.afterDatasourceResponse.push(async ({ response }) => {
192
+ const record = response[0];
193
+ if (!record) {
194
+ return { ok: true };
195
+ }
196
+ if (record[pathColumnName]) {
197
+ const s3 = new S3({
198
+ credentials: {
199
+ accessKeyId: this.options.s3AccessKeyId,
200
+ secretAccessKey: this.options.s3SecretAccessKey,
201
+ },
202
+ region: this.options.s3Region,
203
+ });
204
+ await this.genPreviewUrl(record, s3);
205
+ }
206
+ return { ok: true };
207
+ });
208
+ // ** HOOKS FOR LIST **//
209
+ if (((_h = this.options.preview) === null || _h === void 0 ? void 0 : _h.showInList) || ((_j = this.options.preview) === null || _j === void 0 ? void 0 : _j.showInList) === undefined) {
210
+ resourceConfig.hooks.list.afterDatasourceResponse.push(async ({ response }) => {
211
+ const s3 = new S3({
212
+ credentials: {
213
+ accessKeyId: this.options.s3AccessKeyId,
214
+ secretAccessKey: this.options.s3SecretAccessKey,
215
+ },
216
+ region: this.options.s3Region,
217
+ });
218
+ await Promise.all(response.map(async (record) => {
219
+ if (record[this.options.pathColumnName]) {
220
+ await this.genPreviewUrl(record, s3);
221
+ }
222
+ }));
223
+ return { ok: true };
224
+ });
225
+ }
226
+ // ** HOOKS FOR DELETE **//
227
+ // add delete hook which sets tag adminforth-candidate-for-cleanup to true
228
+ resourceConfig.hooks.delete.afterSave.push(async ({ record }) => {
229
+ if (record[pathColumnName]) {
230
+ const s3 = new S3({
231
+ credentials: {
232
+ accessKeyId: this.options.s3AccessKeyId,
233
+ secretAccessKey: this.options.s3SecretAccessKey,
234
+ },
235
+ region: this.options.s3Region,
236
+ });
237
+ try {
238
+ await s3.putObjectTagging({
239
+ Bucket: this.options.s3Bucket,
240
+ Key: record[pathColumnName],
241
+ Tagging: {
242
+ TagSet: [
243
+ {
244
+ Key: ADMINFORTH_NOT_YET_USED_TAG,
245
+ Value: 'true'
246
+ }
247
+ ]
248
+ }
249
+ });
250
+ }
251
+ catch (e) {
252
+ // file might be e.g. already deleted, so we catch error
253
+ console.error(`Error setting tag ${ADMINFORTH_NOT_YET_USED_TAG} to true for object ${record[pathColumnName]}. File will not be auto-cleaned up`, e);
254
+ }
255
+ }
256
+ return { ok: true };
257
+ });
258
+ // ** HOOKS FOR EDIT **//
259
+ // beforeSave
260
+ resourceConfig.hooks.edit.beforeSave.push(async ({ record }) => {
261
+ // null is when value is removed
262
+ if (record[virtualColumn.name] || record[virtualColumn.name] === null) {
263
+ record[pathColumnName] = record[virtualColumn.name];
264
+ }
265
+ return { ok: true };
266
+ });
267
+ // add edit postSave hook to delete old file and remove tag from new file
268
+ resourceConfig.hooks.edit.afterSave.push(async ({ record, oldRecord }) => {
269
+ if (record[virtualColumn.name] || record[virtualColumn.name] === null) {
270
+ const s3 = new S3({
271
+ credentials: {
272
+ accessKeyId: this.options.s3AccessKeyId,
273
+ secretAccessKey: this.options.s3SecretAccessKey,
274
+ },
275
+ region: this.options.s3Region,
276
+ });
277
+ if (oldRecord[pathColumnName]) {
278
+ // put tag to delete old file
279
+ try {
280
+ await s3.putObjectTagging({
281
+ Bucket: this.options.s3Bucket,
282
+ Key: oldRecord[pathColumnName],
283
+ Tagging: {
284
+ TagSet: [
285
+ {
286
+ Key: ADMINFORTH_NOT_YET_USED_TAG,
287
+ Value: 'true'
288
+ }
289
+ ]
290
+ }
291
+ });
292
+ }
293
+ catch (e) {
294
+ // file might be e.g. already deleted, so we catch error
295
+ console.error(`Error setting tag ${ADMINFORTH_NOT_YET_USED_TAG} to true for object ${oldRecord[pathColumnName]}. File will not be auto-cleaned up`, e);
296
+ }
297
+ }
298
+ if (record[virtualColumn.name] !== null) {
299
+ // remove tag from new file
300
+ // in this case we let it crash if it fails: this is a new file which just was uploaded.
301
+ await s3.putObjectTagging({
302
+ Bucket: this.options.s3Bucket,
303
+ Key: record[pathColumnName],
304
+ Tagging: {
305
+ TagSet: []
306
+ }
307
+ });
308
+ }
309
+ }
310
+ return { ok: true };
311
+ });
312
+ }
313
+ validateConfigAfterDiscover(adminforth, resourceConfig) {
314
+ // called here because modifyResourceConfig can be called in build time where there is no environment and AWS secrets
315
+ this.setupLifecycleRule();
316
+ }
317
+ setupEndpoints(server) {
318
+ server.endpoint({
319
+ method: 'POST',
320
+ path: `/plugin/${this.pluginInstanceId}/get_s3_upload_url`,
321
+ handler: async ({ body }) => {
322
+ var _a;
323
+ const { originalFilename, contentType, size, originalExtension } = body;
324
+ if (this.options.allowedFileExtensions && !this.options.allowedFileExtensions.includes(originalExtension)) {
325
+ return {
326
+ error: `File extension "${originalExtension}" is not allowed, allowed extensions are: ${this.options.allowedFileExtensions.join(', ')}`
327
+ };
328
+ }
329
+ const s3Path = this.options.s3Path({ originalFilename, originalExtension, contentType });
330
+ if (s3Path.startsWith('/')) {
331
+ throw new Error('s3Path should not start with /, please adjust s3path function to not return / at the start of the path');
332
+ }
333
+ const s3 = new S3({
334
+ credentials: {
335
+ accessKeyId: this.options.s3AccessKeyId,
336
+ secretAccessKey: this.options.s3SecretAccessKey,
337
+ },
338
+ region: this.options.s3Region,
339
+ });
340
+ const tagline = `${ADMINFORTH_NOT_YET_USED_TAG}=true`;
341
+ const params = {
342
+ Bucket: this.options.s3Bucket,
343
+ Key: s3Path,
344
+ ContentType: contentType,
345
+ ACL: (this.options.s3ACL || 'private'),
346
+ Tagging: tagline,
347
+ };
348
+ const uploadUrl = await await getSignedUrl(s3, new PutObjectCommand(params), {
349
+ expiresIn: 1800,
350
+ unhoistableHeaders: new Set(['x-amz-tagging']),
351
+ });
352
+ let previewUrl;
353
+ if ((_a = this.options.preview) === null || _a === void 0 ? void 0 : _a.previewUrl) {
354
+ previewUrl = this.options.preview.previewUrl({ s3Path });
355
+ return;
356
+ }
357
+ else if (this.options.s3ACL === 'public-read') {
358
+ previewUrl = `https://${this.options.s3Bucket}.s3.${this.options.s3Region}.amazonaws.com/${s3Path}`;
359
+ }
360
+ else {
361
+ previewUrl = await getSignedUrl(s3, new GetObjectCommand({
362
+ Bucket: this.options.s3Bucket,
363
+ Key: s3Path,
364
+ }));
365
+ }
366
+ return {
367
+ uploadUrl,
368
+ s3Path,
369
+ tagline,
370
+ previewUrl,
371
+ };
372
+ }
373
+ });
374
+ // generation: {
375
+ // provider: 'openai-dall-e',
376
+ // countToGenerate: 3,
377
+ // openAiOptions: {
378
+ // model: 'dall-e-3',
379
+ // size: '1792x1024',
380
+ // apiKey: process.env.OPENAI_API_KEY as string,
381
+ // },
382
+ // },
383
+ // curl https://api.openai.com/v1/images/generations \
384
+ // -H "Content-Type: application/json" \
385
+ // -H "Authorization: Bearer $OPENAI_API_KEY" \
386
+ // -d '{
387
+ // "model": "dall-e-3",
388
+ // "prompt": "A cute baby sea otter",
389
+ // "n": 1,
390
+ // "size": "1024x1024"
391
+ // }'
392
+ server.endpoint({
393
+ method: 'POST',
394
+ path: `/plugin/${this.pluginInstanceId}/generate_images`,
395
+ handler: async ({ body, headers }) => {
396
+ var _a, _b;
397
+ const { prompt } = body;
398
+ if (this.options.generation.provider !== 'openai-dall-e') {
399
+ throw new Error(`Provider ${this.options.generation.provider} is not supported`);
400
+ }
401
+ if ((_a = this.options.generation.rateLimit) === null || _a === void 0 ? void 0 : _a.limit) {
402
+ // rate limit
403
+ const { error } = RateLimiter.checkRateLimit(this.pluginInstanceId, (_b = this.options.generation.rateLimit) === null || _b === void 0 ? void 0 : _b.limit, getClinetIp(headers));
404
+ if (error) {
405
+ return { error: this.options.generation.rateLimit.errorMessage };
406
+ }
407
+ }
408
+ const { model, size, apiKey } = this.options.generation.openAiOptions;
409
+ const url = 'https://api.openai.com/v1/images/generations';
410
+ let error = null;
411
+ const images = await Promise.all((new Array(this.options.generation.countToGenerate)).fill(0).map(async () => {
412
+ const response = await fetch(url, {
413
+ method: 'POST',
414
+ headers: {
415
+ 'Content-Type': 'application/json',
416
+ 'Authorization': `Bearer ${apiKey}`,
417
+ },
418
+ body: JSON.stringify({
419
+ model,
420
+ prompt,
421
+ n: 1,
422
+ size,
423
+ })
424
+ });
425
+ const json = await response.json();
426
+ if (json.error) {
427
+ console.error('Error generating image', json.error);
428
+ error = json.error;
429
+ return;
430
+ }
431
+ return json;
432
+ }));
433
+ return { error, images };
434
+ }
435
+ });
436
+ server.endpoint({
437
+ method: 'GET',
438
+ path: `/plugin/${this.pluginInstanceId}/cors-proxy`,
439
+ handler: async ({ query, response }) => {
440
+ const { url } = query;
441
+ const resp = await fetch(url);
442
+ response.setHeader('Content-Type', resp.headers.get('Content-Type'));
443
+ //@ts-ignore
444
+ Readable.fromWeb(resp.body).pipe(response.blobStream());
445
+ return null;
446
+ }
447
+ });
448
+ }
449
+ }
450
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../plugins/upload/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ export type PluginOptions = {
2
+ /**
3
+ * The name of the column where the path to the uploaded file is stored.
4
+ * On place of this column, a file upload field will be shown.
5
+ */
6
+ pathColumnName: string;
7
+ /**
8
+ * the list of allowed file extensions
9
+ */
10
+ allowedFileExtensions?: string[];
11
+ /**
12
+ * the maximum file size in bytes
13
+ */
14
+ maxFileSize?: number;
15
+ /**
16
+ * S3 bucket name where we will upload the files, e.g. 'my-bucket'
17
+ */
18
+ s3Bucket: string;
19
+ /**
20
+ * S3 region, e.g. 'us-east-1'
21
+ */
22
+ s3Region: string;
23
+ /**
24
+ * S3 access key id
25
+ */
26
+ s3AccessKeyId: string;
27
+ /**
28
+ * S3 secret access key
29
+ */
30
+ s3SecretAccessKey: string;
31
+ /**
32
+ * ACL which will be set to uploaded file, e.g. 'public-read'.
33
+ * If you want to use 'public-read', it is your responsibility to set the "ACL Enabled" to true in the S3 bucket policy and Uncheck "Block all public access" in the bucket settings.
34
+ */
35
+ s3ACL?: string;
36
+ /**
37
+ * The path where the file will be uploaded to the S3 bucket, same path will be stored in the database
38
+ * in the column specified in {@link pathColumnName}
39
+ *
40
+ * example:
41
+ *
42
+ * ```typescript
43
+ * s3Path: ({record, originalFilename}) => `/aparts/${record.id}/${originalFilename}`
44
+ * ```
45
+ *
46
+ */
47
+ s3Path: ({ originalFilename, originalExtension, contentType }: {
48
+ originalFilename: any;
49
+ originalExtension: any;
50
+ contentType: any;
51
+ }) => string;
52
+ preview: {
53
+ /**
54
+ * Whether to show preview of image instead of path in list field
55
+ * By default true
56
+ */
57
+ showInList?: boolean;
58
+ /**
59
+ * Whether to show preview of image instead of path in list field
60
+ * By default true
61
+ */
62
+ showInShow?: boolean;
63
+ /**
64
+ * Used to display preview (if it is image) in list and show views.
65
+ * Defaulted to the AWS S3 presigned URL if resource is private or public URL if resource is public.
66
+ * Can be used to generate custom e.g. CDN(e.g. Cloudflare) URL to worm up cache and deliver preview faster.
67
+ *
68
+ * Example:
69
+ *
70
+ * ```typescript
71
+ * previewUrl: ({record, path}) => `https://my-bucket.s3.amazonaws.com/${path}`,
72
+ * ```
73
+ *
74
+ */
75
+ previewUrl?: ({ s3Path }: {
76
+ s3Path: any;
77
+ }) => string;
78
+ };
79
+ /**
80
+ * AI image generation options
81
+ */
82
+ generation?: {
83
+ /**
84
+ * The provider to use for image generation
85
+ * for now only 'openai-dall-e' is supported
86
+ */
87
+ provider: string;
88
+ /**
89
+ * The number of images to generate
90
+ * in one request
91
+ */
92
+ countToGenerate: number;
93
+ /**
94
+ * Options for OpenAI
95
+ */
96
+ openAiOptions: {
97
+ /**
98
+ * The model to use, e.g. 'dall-e-3'
99
+ */
100
+ model: string;
101
+ /**
102
+ * The size of the image to generate, e.g. '1792x1024'
103
+ */
104
+ size: string;
105
+ /**
106
+ * The OpenAI API key
107
+ */
108
+ apiKey: string;
109
+ };
110
+ /**
111
+ * Fields of record to use for context. if supplied must be array of valid column names for resource
112
+ * where plugin is used.
113
+ */
114
+ fieldsForContext?: string[];
115
+ /**
116
+ * Since AI generation can be expensive, we can limit the number of requests per IP.
117
+ */
118
+ rateLimit?: {
119
+ /**
120
+ * E.g. 5/1d - 5 requests per day
121
+ * 3/1h - 3 requests per hour
122
+ */
123
+ limit: string;
124
+ /**
125
+ * !Not used now
126
+ * Message shown to user when rate limit is reached
127
+ */
128
+ errorMessage: string;
129
+ };
130
+ };
131
+ };
132
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../plugins/upload/types.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,aAAa,GAAG;IAE1B;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;;;;;;OAUG;IACH,MAAM,EAAE,CAAC,EAAC,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAC;;;;KAAA,KAAK,MAAM,CAAC;IAGvE,OAAO,EAAE;QAEP;;;WAGG;QACH,UAAU,CAAC,EAAE,OAAO,CAAC;QAErB;;;WAGG;QACH,UAAU,CAAC,EAAE,OAAO,CAAC;QAErB;;;;;;;;;;;WAWG;QACH,UAAU,CAAC,EAAE,CAAC,EAAC,MAAM,EAAC;;SAAA,KAAK,MAAM,CAAC;KACnC,CAAA;IAGD;;OAEG;IACH,UAAU,CAAC,EAAE;QACX;;;WAGG;QACH,QAAQ,EAAE,MAAM,CAAC;QAEjB;;;WAGG;QACH,eAAe,EAAE,MAAM,CAAC;QAExB;;WAEG;QACH,aAAa,EAAE;YACb;;eAEG;YACH,KAAK,EAAE,MAAM,CAAC;YAEd;;eAEG;YACH,IAAI,EAAE,MAAM,CAAC;YAEb;;eAEG;YACH,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QAEF;;;WAGG;QACH,gBAAgB,CAAC,EAAG,MAAM,EAAE,CAAC;QAG7B;;WAEG;QACH,SAAS,CAAC,EAAE;YAEV;;;eAGG;YACH,KAAK,EAAE,MAAM,CAAC;YAEd;;;eAGG;YACH,YAAY,EAAE,MAAM,CAAC;SACtB,CAAC;KACH,CAAA;CAEF,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../plugins/upload/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { Express } from 'express';
2
+ import { IAdminForth, IExpressHttpServer } from '../types/Back.js';
3
+ declare class ExpressServer implements IExpressHttpServer {
4
+ expressApp: Express;
5
+ adminforth: IAdminForth;
6
+ constructor(adminforth: IAdminForth);
7
+ setupSpaServer(): void;
8
+ serve(app: any): void;
9
+ authorize(handler: any): (req: any, res: any, next: any) => Promise<void>;
10
+ endpoint({ method, path, handler, noAuth }: {
11
+ method?: string;
12
+ path: any;
13
+ handler: any;
14
+ noAuth?: boolean;
15
+ }): void;
16
+ }
17
+ export default ExpressServer;
18
+ //# sourceMappingURL=express.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../../servers/express.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AA4EnE,cAAM,aAAc,YAAW,kBAAkB;IAE/C,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,WAAW,CAAC;gBAEZ,UAAU,EAAE,WAAW;IAInC,cAAc;IAgEd,KAAK,CAAC,GAAG,KAAA;IAMT,SAAS,CAAC,OAAO,KAAA;IAoCjB,QAAQ,CAAC,EAAE,MAAY,EAAE,IAAI,EAAE,OAAO,EAAE,MAAY,EAAE;;;;;KAAA;CA0EvD;AAED,eAAe,aAAa,CAAC"}