@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.
- package/dist/cjs/index.js +108 -13
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/__test__/entity/foo.d.ts +1 -1
- package/dist/cjs/types/__test__/providers/typeorm/entity/foo.d.ts +1 -1
- package/dist/cjs/types/abstractions/configuration.d.ts +1 -1
- package/dist/cjs/types/abstractions/import.d.ts +2 -0
- package/dist/cjs/types/abstractions/serializer.d.ts +7 -2
- package/dist/cjs/types/base/serializer.d.ts +7 -3
- package/dist/cjs/types/commands/import.d.ts +5 -0
- package/dist/cjs/types/platforms/nest/__test__/server/app/appCompanies/appCompany.serializer.d.ts +1 -1
- package/dist/cjs/types/platforms/nest/__test__/server/app/appDivisions/appDivision.serializer.d.ts +1 -1
- package/dist/cjs/types/platforms/nest/__test__/server/app/appOrganizations/appOrganization.serializer.d.ts +1 -1
- package/dist/cjs/types/platforms/nest/__test__/server/app/appRoles/appRole.serializer.d.ts +1 -1
- package/dist/cjs/types/platforms/nest/__test__/server/app/appTenants/appTenant.serializer.d.ts +1 -1
- package/dist/cjs/types/platforms/nest/__test__/server/app/appUserGroupMembers/appUserGroupMember.serializer.d.ts +1 -1
- package/dist/cjs/types/platforms/nest/__test__/server/app/appUserGroups/appUserGroup.serializer.d.ts +1 -1
- package/dist/cjs/types/platforms/nest/__test__/server/app/appUserProfiles/appUserProfile.serializer.d.ts +1 -1
- package/dist/cjs/types/platforms/nest/__test__/server/app/appUserRoles/appUserRole.serializer.d.ts +1 -1
- package/dist/cjs/types/platforms/nest/__test__/server/app/appUsers/appUser.serializer.d.ts +1 -1
- package/dist/cjs/types/platforms/nest/__test__/server/entities/foos/foo.serializer.d.ts +1 -1
- package/dist/cjs/types/platforms/nest/base/entityActions.d.ts +1 -1
- package/dist/cjs/types/platforms/nest/base/entityManager.d.ts +1 -1
- package/dist/cjs/types/platforms/nest/base/entitySerializer.d.ts +1 -1
- package/dist/cjs/types/providers/services.d.ts +3 -3
- package/dist/esm/index.js +109 -14
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/__test__/entity/foo.d.ts +1 -1
- package/dist/esm/types/__test__/providers/typeorm/entity/foo.d.ts +1 -1
- package/dist/esm/types/abstractions/configuration.d.ts +1 -1
- package/dist/esm/types/abstractions/import.d.ts +2 -0
- package/dist/esm/types/abstractions/serializer.d.ts +7 -2
- package/dist/esm/types/base/serializer.d.ts +7 -3
- package/dist/esm/types/commands/import.d.ts +5 -0
- package/dist/esm/types/platforms/nest/__test__/server/app/appCompanies/appCompany.serializer.d.ts +1 -1
- package/dist/esm/types/platforms/nest/__test__/server/app/appDivisions/appDivision.serializer.d.ts +1 -1
- package/dist/esm/types/platforms/nest/__test__/server/app/appOrganizations/appOrganization.serializer.d.ts +1 -1
- package/dist/esm/types/platforms/nest/__test__/server/app/appRoles/appRole.serializer.d.ts +1 -1
- package/dist/esm/types/platforms/nest/__test__/server/app/appTenants/appTenant.serializer.d.ts +1 -1
- package/dist/esm/types/platforms/nest/__test__/server/app/appUserGroupMembers/appUserGroupMember.serializer.d.ts +1 -1
- package/dist/esm/types/platforms/nest/__test__/server/app/appUserGroups/appUserGroup.serializer.d.ts +1 -1
- package/dist/esm/types/platforms/nest/__test__/server/app/appUserProfiles/appUserProfile.serializer.d.ts +1 -1
- package/dist/esm/types/platforms/nest/__test__/server/app/appUserRoles/appUserRole.serializer.d.ts +1 -1
- package/dist/esm/types/platforms/nest/__test__/server/app/appUsers/appUser.serializer.d.ts +1 -1
- package/dist/esm/types/platforms/nest/__test__/server/entities/foos/foo.serializer.d.ts +1 -1
- package/dist/esm/types/platforms/nest/base/entityActions.d.ts +1 -1
- package/dist/esm/types/platforms/nest/base/entityManager.d.ts +1 -1
- package/dist/esm/types/platforms/nest/base/entitySerializer.d.ts +1 -1
- package/dist/esm/types/providers/services.d.ts +3 -3
- package/dist/index.d.ts +22 -11
- 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
|
-
|
|
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
|
-
]
|
|
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,
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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:
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
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
|
-
|
|
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
|
|