@punks/backend-entity-manager 0.0.92 → 0.0.94

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 +88 -5
  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 +6 -1
  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 +89 -6
  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 +6 -1
  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 +26 -12
  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 {
@@ -205,7 +242,9 @@ class EntitySerializer {
205
242
  name: c.name,
206
243
  value: (item) => this.getColumnValue(item, c),
207
244
  })),
208
- ]), "utf-8"),
245
+ ], {
246
+ delimiter: DEFAULT_DELIMITER,
247
+ }), "utf-8"),
209
248
  };
210
249
  case exports.EntitySerializationFormat.Xlsx:
211
250
  return {
@@ -963,8 +1002,52 @@ class EntitiesImportCommand {
963
1002
  this.services = services;
964
1003
  this.settings = settings;
965
1004
  }
966
- execute(input) {
967
- throw new Error("Method not implemented.");
1005
+ async execute(input) {
1006
+ await this.uploadImportFile({
1007
+ content: input.file.content,
1008
+ contentType: input.file.contentType,
1009
+ fileName: input.file.fileName,
1010
+ });
1011
+ const importEntities = await this.parseImportFile(input.file.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();
968
1051
  }
969
1052
  }
970
1053