@punks/backend-entity-manager 0.0.91 → 0.0.93

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 (50) hide show
  1. package/dist/cjs/index.js +108 -13
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/__test__/entity/foo.d.ts +1 -1
  4. package/dist/cjs/types/__test__/providers/typeorm/entity/foo.d.ts +1 -1
  5. package/dist/cjs/types/abstractions/configuration.d.ts +1 -1
  6. package/dist/cjs/types/abstractions/import.d.ts +2 -0
  7. package/dist/cjs/types/abstractions/serializer.d.ts +7 -2
  8. package/dist/cjs/types/base/serializer.d.ts +7 -3
  9. package/dist/cjs/types/commands/import.d.ts +5 -0
  10. package/dist/cjs/types/platforms/nest/__test__/server/app/appCompanies/appCompany.serializer.d.ts +1 -1
  11. package/dist/cjs/types/platforms/nest/__test__/server/app/appDivisions/appDivision.serializer.d.ts +1 -1
  12. package/dist/cjs/types/platforms/nest/__test__/server/app/appOrganizations/appOrganization.serializer.d.ts +1 -1
  13. package/dist/cjs/types/platforms/nest/__test__/server/app/appRoles/appRole.serializer.d.ts +1 -1
  14. package/dist/cjs/types/platforms/nest/__test__/server/app/appTenants/appTenant.serializer.d.ts +1 -1
  15. package/dist/cjs/types/platforms/nest/__test__/server/app/appUserGroupMembers/appUserGroupMember.serializer.d.ts +1 -1
  16. package/dist/cjs/types/platforms/nest/__test__/server/app/appUserGroups/appUserGroup.serializer.d.ts +1 -1
  17. package/dist/cjs/types/platforms/nest/__test__/server/app/appUserProfiles/appUserProfile.serializer.d.ts +1 -1
  18. package/dist/cjs/types/platforms/nest/__test__/server/app/appUserRoles/appUserRole.serializer.d.ts +1 -1
  19. package/dist/cjs/types/platforms/nest/__test__/server/app/appUsers/appUser.serializer.d.ts +1 -1
  20. package/dist/cjs/types/platforms/nest/__test__/server/entities/foos/foo.serializer.d.ts +1 -1
  21. package/dist/cjs/types/platforms/nest/base/entityActions.d.ts +1 -1
  22. package/dist/cjs/types/platforms/nest/base/entityManager.d.ts +1 -1
  23. package/dist/cjs/types/platforms/nest/base/entitySerializer.d.ts +1 -1
  24. package/dist/cjs/types/providers/services.d.ts +3 -3
  25. package/dist/esm/index.js +109 -14
  26. package/dist/esm/index.js.map +1 -1
  27. package/dist/esm/types/__test__/entity/foo.d.ts +1 -1
  28. package/dist/esm/types/__test__/providers/typeorm/entity/foo.d.ts +1 -1
  29. package/dist/esm/types/abstractions/configuration.d.ts +1 -1
  30. package/dist/esm/types/abstractions/import.d.ts +2 -0
  31. package/dist/esm/types/abstractions/serializer.d.ts +7 -2
  32. package/dist/esm/types/base/serializer.d.ts +7 -3
  33. package/dist/esm/types/commands/import.d.ts +5 -0
  34. package/dist/esm/types/platforms/nest/__test__/server/app/appCompanies/appCompany.serializer.d.ts +1 -1
  35. package/dist/esm/types/platforms/nest/__test__/server/app/appDivisions/appDivision.serializer.d.ts +1 -1
  36. package/dist/esm/types/platforms/nest/__test__/server/app/appOrganizations/appOrganization.serializer.d.ts +1 -1
  37. package/dist/esm/types/platforms/nest/__test__/server/app/appRoles/appRole.serializer.d.ts +1 -1
  38. package/dist/esm/types/platforms/nest/__test__/server/app/appTenants/appTenant.serializer.d.ts +1 -1
  39. package/dist/esm/types/platforms/nest/__test__/server/app/appUserGroupMembers/appUserGroupMember.serializer.d.ts +1 -1
  40. package/dist/esm/types/platforms/nest/__test__/server/app/appUserGroups/appUserGroup.serializer.d.ts +1 -1
  41. package/dist/esm/types/platforms/nest/__test__/server/app/appUserProfiles/appUserProfile.serializer.d.ts +1 -1
  42. package/dist/esm/types/platforms/nest/__test__/server/app/appUserRoles/appUserRole.serializer.d.ts +1 -1
  43. package/dist/esm/types/platforms/nest/__test__/server/app/appUsers/appUser.serializer.d.ts +1 -1
  44. package/dist/esm/types/platforms/nest/__test__/server/entities/foos/foo.serializer.d.ts +1 -1
  45. package/dist/esm/types/platforms/nest/base/entityActions.d.ts +1 -1
  46. package/dist/esm/types/platforms/nest/base/entityManager.d.ts +1 -1
  47. package/dist/esm/types/platforms/nest/base/entitySerializer.d.ts +1 -1
  48. package/dist/esm/types/providers/services.d.ts +3 -3
  49. package/dist/index.d.ts +22 -11
  50. package/package.json +3 -3
package/dist/cjs/index.js CHANGED
@@ -128,12 +128,47 @@ class EntitySeeder {
128
128
  }
129
129
  }
130
130
 
131
+ const DEFAULT_DELIMITER = ";";
131
132
  class EntitySerializer {
132
133
  constructor(entityName) {
133
134
  this.entityName = entityName;
134
135
  }
135
136
  async parse(data, format) {
136
- throw new Error("Method not implemented.");
137
+ switch (format) {
138
+ case exports.EntitySerializationFormat.Csv:
139
+ return this.parseCsv(data);
140
+ case exports.EntitySerializationFormat.Xlsx:
141
+ return this.parseXlsx(data);
142
+ default:
143
+ throw new Error(`Format ${format} not supported`);
144
+ }
145
+ }
146
+ parseCsv(data) {
147
+ const records = backendCore.csvParse(data, DEFAULT_DELIMITER);
148
+ return records.map((x) => this.convertSheetRecord(x));
149
+ }
150
+ parseXlsx(data) {
151
+ const records = backendCore.excelParse(data);
152
+ return records.map((x) => this.convertSheetRecord(x));
153
+ }
154
+ convertSheetRecord(record) {
155
+ if (!record._type || record._type !== this.entityName) {
156
+ throw new Error(`Invalid record type ${record._type}`);
157
+ }
158
+ const definition = this.getDefinition();
159
+ const entity = {};
160
+ for (const column of definition.columns) {
161
+ entity[column.selector] = this.parseColumnValue(record, column);
162
+ }
163
+ const idField = definition.columns.find((x) => x.idColumn || x.selector === "id");
164
+ return {
165
+ id: idField ? entity[idField.selector] : undefined,
166
+ item: entity,
167
+ };
168
+ }
169
+ parseColumnValue(row, definition) {
170
+ const rawValue = row[definition.name];
171
+ return definition.parser ? definition.parser(rawValue) : rawValue;
137
172
  }
138
173
  async createSample(format) {
139
174
  return await this.buildSampleFile(format);
@@ -157,7 +192,9 @@ class EntitySerializer {
157
192
  name: c.name,
158
193
  value: () => c.sampleValue ?? "",
159
194
  })),
160
- ]), "utf-8"),
195
+ ], {
196
+ delimiter: DEFAULT_DELIMITER,
197
+ }), "utf-8"),
161
198
  };
162
199
  case exports.EntitySerializationFormat.Xlsx:
163
200
  return {
@@ -196,10 +233,18 @@ class EntitySerializer {
196
233
  return {
197
234
  fileName,
198
235
  contentType: "text/csv",
199
- content: Buffer.from(backendCore.csvBuild(data, this.getDefinition().columns.map((c) => ({
200
- name: c.name,
201
- value: (item) => this.getColumnValue(item, c),
202
- }))), "utf-8"),
236
+ content: Buffer.from(backendCore.csvBuild(data, [
237
+ {
238
+ name: "_type",
239
+ value: () => this.entityName,
240
+ },
241
+ ...this.getDefinition().columns.map((c) => ({
242
+ name: c.name,
243
+ value: (item) => this.getColumnValue(item, c),
244
+ })),
245
+ ], {
246
+ delimiter: DEFAULT_DELIMITER,
247
+ }), "utf-8"),
203
248
  };
204
249
  case exports.EntitySerializationFormat.Xlsx:
205
250
  return {
@@ -208,11 +253,17 @@ class EntitySerializer {
208
253
  content: Buffer.from(backendCore.excelBuild({
209
254
  data,
210
255
  sheetName: this.entityName,
211
- columns: this.getDefinition().columns.map((c) => ({
212
- header: c.name,
213
- value: (item) => this.getColumnValue(item, c),
214
- headerSize: c.colSpan,
215
- })),
256
+ columns: [
257
+ {
258
+ header: "_type",
259
+ value: () => this.entityName,
260
+ },
261
+ ...this.getDefinition().columns.map((c) => ({
262
+ header: c.name,
263
+ value: (item) => this.getColumnValue(item, c),
264
+ headerSize: c.colSpan,
265
+ })),
266
+ ],
216
267
  })),
217
268
  };
218
269
  case exports.EntitySerializationFormat.Json:
@@ -951,8 +1002,52 @@ class EntitiesImportCommand {
951
1002
  this.services = services;
952
1003
  this.settings = settings;
953
1004
  }
954
- execute(input) {
955
- throw new Error("Method not implemented.");
1005
+ async execute(input) {
1006
+ await this.uploadImportFile({
1007
+ content: input.content,
1008
+ contentType: input.contentType,
1009
+ fileName: input.fileName,
1010
+ });
1011
+ const importEntities = await this.parseImportFile(input.content, input.format);
1012
+ for (const entry of importEntities) {
1013
+ await this.importEntity(entry);
1014
+ }
1015
+ return {
1016
+ statistics: {
1017
+ importedCount: importEntities.length,
1018
+ createdCount: 0,
1019
+ unchangedCount: 0,
1020
+ updatedCount: 0,
1021
+ },
1022
+ };
1023
+ }
1024
+ async importEntity(entry) {
1025
+ try {
1026
+ if (!entry.id) {
1027
+ return this.services.resolveCreateCommand().execute(entry.item);
1028
+ }
1029
+ return this.services.resolveUpsertCommand().execute(entry.id, entry.item);
1030
+ }
1031
+ catch (error) {
1032
+ throw new Error(`Error importing entry with id ${entry.id}`);
1033
+ }
1034
+ }
1035
+ async parseImportFile(content, format) {
1036
+ return await this.services.resolveSerializer().parse(content, format);
1037
+ }
1038
+ async uploadImportFile(file) {
1039
+ await this.bucket.fileUpload({
1040
+ bucket: this.settings.exportBucket.bucket,
1041
+ filePath: this.buildAbsoluteBucketPath(file.fileName),
1042
+ content: file.content,
1043
+ contentType: file.contentType,
1044
+ });
1045
+ }
1046
+ buildAbsoluteBucketPath(relativePath) {
1047
+ return `${this.settings.exportBucket.rootFolderPath ?? ""}/imports/${createDayPath(new Date())}/${relativePath}`;
1048
+ }
1049
+ get bucket() {
1050
+ return this.services.getRootServices().resolveBucketProvider();
956
1051
  }
957
1052
  }
958
1053