@solidstarters/solid-core 1.2.133 → 1.2.134
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/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.d.ts +1 -0
- package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.d.ts.map +1 -1
- package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js +32 -7
- package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
- package/dist/helpers/field-crud-managers/SelectionStaticFieldCrudManager.d.ts +1 -0
- package/dist/helpers/field-crud-managers/SelectionStaticFieldCrudManager.d.ts.map +1 -1
- package/dist/helpers/field-crud-managers/SelectionStaticFieldCrudManager.js +32 -7
- package/dist/helpers/field-crud-managers/SelectionStaticFieldCrudManager.js.map +1 -1
- package/dist/services/import-transaction.service.d.ts.map +1 -1
- package/dist/services/import-transaction.service.js +2 -1
- package/dist/services/import-transaction.service.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +44 -18
- package/src/helpers/field-crud-managers/SelectionStaticFieldCrudManager.ts +43 -15
- package/src/services/import-transaction.service.ts +2 -1
|
@@ -14,6 +14,7 @@ export declare class SelectionDynamicFieldCrudManager implements FieldCrudManage
|
|
|
14
14
|
private readonly options;
|
|
15
15
|
constructor(options: SelectionDynamicFieldOptions);
|
|
16
16
|
validate(dto: any): Promise<ValidationError[]>;
|
|
17
|
+
private parseAndValidateArray;
|
|
17
18
|
private applyValidations;
|
|
18
19
|
private applyFormatValidations;
|
|
19
20
|
transformForCreate(dto: any): any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionDynamicFieldCrudManager.d.ts","sourceRoot":"","sources":["../../../src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAiD,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAElH,MAAM,WAAW,4BAA4B;IACzC,wBAAwB,EAAE,MAAM,CAAC;IACjC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IACrC,4BAA4B,EAAE,GAAG,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,aAAa,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;CAC7C;AAED,qBAAa,gCAAiC,YAAW,gBAAgB;IAEzD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,4BAA4B;IAG5D,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"SelectionDynamicFieldCrudManager.d.ts","sourceRoot":"","sources":["../../../src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAiD,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAElH,MAAM,WAAW,4BAA4B;IACzC,wBAAwB,EAAE,MAAM,CAAC;IACjC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IACrC,4BAA4B,EAAE,GAAG,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,aAAa,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;CAC7C;AAED,qBAAa,gCAAiC,YAAW,gBAAgB;IAEzD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,4BAA4B;IAG5D,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAoCpD,OAAO,CAAC,qBAAqB;YAkBf,gBAAgB;YAUhB,sBAAsB;IAQpC,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;IAKjC,OAAO,CAAC,yBAAyB;YAWnB,qBAAqB;IAOnC,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,yBAAyB;CAGpC"}
|
|
@@ -10,21 +10,46 @@ class SelectionDynamicFieldCrudManager {
|
|
|
10
10
|
async validate(dto) {
|
|
11
11
|
const fieldValue = dto[this.options.fieldName];
|
|
12
12
|
const isMultiSelect = this.options?.isMultiSelect;
|
|
13
|
-
if (isMultiSelect) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
if (isMultiSelect && fieldValue) {
|
|
14
|
+
const arrayCheck = this.parseAndValidateArray(fieldValue);
|
|
15
|
+
if (!arrayCheck.isValid) {
|
|
16
|
+
return [
|
|
17
|
+
{
|
|
18
|
+
field: this.options.fieldName,
|
|
19
|
+
error: `Field: ${this.options.fieldName} must be a valid array`,
|
|
20
|
+
},
|
|
21
|
+
];
|
|
17
22
|
}
|
|
18
|
-
|
|
19
|
-
|
|
23
|
+
const values = arrayCheck.values;
|
|
24
|
+
if (this.isApplyRequiredValidation() && values.length === 0) {
|
|
25
|
+
return [
|
|
26
|
+
{
|
|
27
|
+
field: this.options.fieldName,
|
|
28
|
+
error: `Field: ${this.options.fieldName} is required`,
|
|
29
|
+
},
|
|
30
|
+
];
|
|
20
31
|
}
|
|
21
|
-
const allErrors = await Promise.all(values.map(
|
|
32
|
+
const allErrors = await Promise.all(values.map((val) => this.applyValidations(val)));
|
|
22
33
|
return allErrors.flat();
|
|
23
34
|
}
|
|
24
35
|
else {
|
|
25
36
|
return this.applyValidations(fieldValue);
|
|
26
37
|
}
|
|
27
38
|
}
|
|
39
|
+
parseAndValidateArray(fieldValue) {
|
|
40
|
+
if (Array.isArray(fieldValue)) {
|
|
41
|
+
return { isValid: true, values: fieldValue };
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const parsed = typeof fieldValue === 'string' ? JSON.parse(fieldValue) : null;
|
|
45
|
+
if (Array.isArray(parsed)) {
|
|
46
|
+
return { isValid: true, values: parsed };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
}
|
|
51
|
+
return { isValid: false, values: [] };
|
|
52
|
+
}
|
|
28
53
|
async applyValidations(fieldValue) {
|
|
29
54
|
const errors = [];
|
|
30
55
|
this.isApplyRequiredValidation() && (0, class_validator_1.isEmpty)(fieldValue) ? errors.push({ field: this.options.fieldName, error: `Field: ${this.options.fieldName} is required` }) : "no errors";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionDynamicFieldCrudManager.js","sourceRoot":"","sources":["../../../src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts"],"names":[],"mappings":";;;AACA,qDAAuE;AACvE,oFAAwE;AAaxE,MAAa,gCAAgC;IAEzC,YAA6B,OAAqC;QAArC,YAAO,GAAP,OAAO,CAA8B;IAClE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAQ;QACnB,MAAM,UAAU,GAAQ,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"SelectionDynamicFieldCrudManager.js","sourceRoot":"","sources":["../../../src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { DiscoveryService } from \"@nestjs/core\";\nimport { isEmpty, isInt, isNotEmpty, isString } from \"class-validator\";\nimport { SelectionValueType } from \"src/dtos/create-field-metadata.dto\";\nimport { FieldCrudManager, ISelectionProvider, ISelectionProviderContext, ValidationError } from \"src/interfaces\";\n\nexport interface SelectionDynamicFieldOptions {\n selectionDynamicProvider: string;\n selectionValueType: SelectionValueType;\n required: boolean | undefined | null;\n selectionDynamicProviderCtxt: any;\n fieldName: string;\n discoveryService: DiscoveryService;\n isMultiSelect: boolean | undefined | null;\n}\n\nexport class SelectionDynamicFieldCrudManager implements FieldCrudManager {\n\n constructor(private readonly options: SelectionDynamicFieldOptions) {\n }\n\n async validate(dto: any): Promise<ValidationError[]> {\n const fieldValue: any = dto[this.options.fieldName];\n // return this.applyValidations(fieldValue);\n const isMultiSelect = this.options?.isMultiSelect;\n if (isMultiSelect && fieldValue) {\n const arrayCheck = this.parseAndValidateArray(fieldValue);\n\n if (!arrayCheck.isValid) {\n return [\n {\n field: this.options.fieldName,\n error: `Field: ${this.options.fieldName} must be a valid array`,\n },\n ];\n }\n\n const values = arrayCheck.values;\n\n if (this.isApplyRequiredValidation() && values.length === 0) {\n return [\n {\n field: this.options.fieldName,\n error: `Field: ${this.options.fieldName} is required`,\n },\n ];\n }\n\n // Apply validations to each value\n const allErrors = await Promise.all(values.map((val) => this.applyValidations(val)));\n return allErrors.flat();\n } else {\n // For non-multi-select, apply validations to the single field value\n return this.applyValidations(fieldValue);\n }\n }\n\n private parseAndValidateArray(fieldValue: any): { isValid: boolean; values: any[] } {\n if (Array.isArray(fieldValue)) {\n return { isValid: true, values: fieldValue };\n }\n \n try {\n const parsed = typeof fieldValue === 'string' ? JSON.parse(fieldValue) : null;\n if (Array.isArray(parsed)) {\n return { isValid: true, values: parsed };\n }\n } catch {\n // fall through\n }\n \n return { isValid: false, values: [] };\n }\n \n\n private async applyValidations(fieldValue: any): Promise<ValidationError[]> {\n const errors: ValidationError[] = [];\n this.isApplyRequiredValidation() && isEmpty(fieldValue) ? errors.push({ field: this.options.fieldName, error: `Field: ${this.options.fieldName} is required` }) : \"no errors\";\n if (isNotEmpty(fieldValue)) {\n const formatErrors = await this.applyFormatValidations(fieldValue);\n errors.push(...formatErrors);\n }\n return errors;\n }\n\n private async applyFormatValidations(fieldValue: any): Promise<ValidationError[]> {\n const errors: ValidationError[] = [];\n !this.isValidSelectionValueType(fieldValue, this.options.selectionValueType) ? errors.push({ field: this.options.fieldName, error: 'Field value type is invalid' }) : \"no errors\";\n const _isValidSelectionValue = await this.isValidSelectionValue(fieldValue, this.options.selectionDynamicProvider)\n !_isValidSelectionValue ? errors.push({ field: this.options.fieldName, error: 'Field value is invalid' }) : \"no errors\";\n return errors;\n }\n\n transformForCreate(dto: any): any {\n return dto;\n }\n\n // Validation to be applied\n private isValidSelectionValueType(fieldValue: any, selectionValueType: SelectionValueType): boolean {\n switch (selectionValueType) {\n case SelectionValueType.string:\n return isString(fieldValue);\n case SelectionValueType.int:\n return isInt(fieldValue);\n default:\n throw new Error(`Validation for selection value type ${selectionValueType} is not implemented`);\n }\n }\n\n private async isValidSelectionValue(fieldValue: any, selectionDynamicProvider: string): Promise<boolean> {\n const providerInstance = this.providerInstance<any>(selectionDynamicProvider);\n const values = await providerInstance.values('', JSON.parse(this.options.selectionDynamicProviderCtxt));\n // return values.map(v => v.split(\":\")[0]).includes(fieldValue);\n return values.map(v => v.value).includes(fieldValue);\n }\n\n private providerInstance<T extends ISelectionProviderContext>(selectionDynamicProvider: string): ISelectionProvider<T> {\n const provider = this.options.discoveryService\n .getProviders()\n .filter((provider) => provider.name === selectionDynamicProvider)\n .pop();\n if (!provider) {\n throw new Error(`Provider for ${selectionDynamicProvider} not found`);\n }\n return provider.instance as ISelectionProvider<T>;\n }\n\n private isApplyRequiredValidation(): boolean {\n return this.options.required;\n }\n}"]}
|
|
@@ -11,6 +11,7 @@ export declare class SelectionStaticFieldCrudManager implements FieldCrudManager
|
|
|
11
11
|
private readonly options;
|
|
12
12
|
constructor(options: SelectionStaticFieldOptions);
|
|
13
13
|
validate(dto: any): Promise<ValidationError[]>;
|
|
14
|
+
private parseAndValidateArray;
|
|
14
15
|
private applyValidations;
|
|
15
16
|
private applyFormatValidations;
|
|
16
17
|
transformForCreate(dto: any): any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionStaticFieldCrudManager.d.ts","sourceRoot":"","sources":["../../../src/helpers/field-crud-managers/SelectionStaticFieldCrudManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEnE,MAAM,WAAW,2BAA2B;IACxC,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;CAC7C;AAED,qBAAa,+BAAgC,YAAW,gBAAgB;IAExD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,2BAA2B;IAG3D,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"SelectionStaticFieldCrudManager.d.ts","sourceRoot":"","sources":["../../../src/helpers/field-crud-managers/SelectionStaticFieldCrudManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEnE,MAAM,WAAW,2BAA2B;IACxC,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;CAC7C;AAED,qBAAa,+BAAgC,YAAW,gBAAgB;IAExD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,2BAA2B;IAG3D,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAoCpD,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,sBAAsB;IAO9B,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;IAKjC,OAAO,CAAC,yBAAyB;IAWjC,OAAO,CAAC,2BAA2B;IAWnC,OAAO,CAAC,yBAAyB;CAGpC"}
|
|
@@ -10,21 +10,46 @@ class SelectionStaticFieldCrudManager {
|
|
|
10
10
|
async validate(dto) {
|
|
11
11
|
const fieldValue = dto[this.options.fieldName];
|
|
12
12
|
const isMultiSelect = this.options?.isMultiSelect;
|
|
13
|
-
if (isMultiSelect) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
if (isMultiSelect && fieldValue) {
|
|
14
|
+
const arrayCheck = this.parseAndValidateArray(fieldValue);
|
|
15
|
+
if (!arrayCheck.isValid) {
|
|
16
|
+
return [
|
|
17
|
+
{
|
|
18
|
+
field: this.options.fieldName,
|
|
19
|
+
error: `Field: ${this.options.fieldName} must be a valid array`,
|
|
20
|
+
},
|
|
21
|
+
];
|
|
17
22
|
}
|
|
18
|
-
|
|
19
|
-
|
|
23
|
+
const values = arrayCheck.values;
|
|
24
|
+
if (this.isApplyRequiredValidation() && values.length === 0) {
|
|
25
|
+
return [
|
|
26
|
+
{
|
|
27
|
+
field: this.options.fieldName,
|
|
28
|
+
error: `Field: ${this.options.fieldName} is required`,
|
|
29
|
+
},
|
|
30
|
+
];
|
|
20
31
|
}
|
|
21
|
-
const allErrors = await Promise.all(values.map(
|
|
32
|
+
const allErrors = await Promise.all(values.map((val) => this.applyValidations(val)));
|
|
22
33
|
return allErrors.flat();
|
|
23
34
|
}
|
|
24
35
|
else {
|
|
25
36
|
return this.applyValidations(fieldValue);
|
|
26
37
|
}
|
|
27
38
|
}
|
|
39
|
+
parseAndValidateArray(fieldValue) {
|
|
40
|
+
if (Array.isArray(fieldValue)) {
|
|
41
|
+
return { isValid: true, values: fieldValue };
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const parsed = typeof fieldValue === 'string' ? JSON.parse(fieldValue) : null;
|
|
45
|
+
if (Array.isArray(parsed)) {
|
|
46
|
+
return { isValid: true, values: parsed };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
}
|
|
51
|
+
return { isValid: false, values: [] };
|
|
52
|
+
}
|
|
28
53
|
applyValidations(fieldValue) {
|
|
29
54
|
const errors = [];
|
|
30
55
|
this.isApplyRequiredValidation() && (0, class_validator_1.isEmpty)(fieldValue) ? errors.push({ field: this.options.fieldName, error: `Field: ${this.options.fieldName} is required` }) : "no errors";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionStaticFieldCrudManager.js","sourceRoot":"","sources":["../../../src/helpers/field-crud-managers/SelectionStaticFieldCrudManager.ts"],"names":[],"mappings":";;;AAAA,qDAAuE;AACvE,oFAAwE;AAWxE,MAAa,+BAA+B;IAExC,YAA6B,OAAoC;QAApC,YAAO,GAAP,OAAO,CAA6B;IACjE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAQ;
|
|
1
|
+
{"version":3,"file":"SelectionStaticFieldCrudManager.js","sourceRoot":"","sources":["../../../src/helpers/field-crud-managers/SelectionStaticFieldCrudManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEmpty, isInt, isNotEmpty, isString } from \"class-validator\";\nimport { SelectionValueType } from \"src/dtos/create-field-metadata.dto\";\nimport { FieldCrudManager, ValidationError } from \"src/interfaces\";\n\nexport interface SelectionStaticFieldOptions {\n selectionStaticValues: string[];\n selectionValueType: SelectionValueType;\n required: boolean | undefined | null;\n fieldName: string;\n isMultiSelect: boolean | undefined | null;\n}\n\nexport class SelectionStaticFieldCrudManager implements FieldCrudManager {\n\n constructor(private readonly options: SelectionStaticFieldOptions) {\n }\n\n async validate(dto: any): Promise<ValidationError[]> {\n const fieldValue: any = dto[this.options.fieldName];\n // return this.applyValidations(fieldValue);\n const isMultiSelect = this.options?.isMultiSelect;\n if (isMultiSelect && fieldValue) {\n const arrayCheck = this.parseAndValidateArray(fieldValue);\n\n if (!arrayCheck.isValid) {\n return [\n {\n field: this.options.fieldName,\n error: `Field: ${this.options.fieldName} must be a valid array`,\n },\n ];\n }\n\n const values = arrayCheck.values;\n\n if (this.isApplyRequiredValidation() && values.length === 0) {\n return [\n {\n field: this.options.fieldName,\n error: `Field: ${this.options.fieldName} is required`,\n },\n ];\n }\n\n // Apply validations to each value\n const allErrors = await Promise.all(values.map((val) => this.applyValidations(val)));\n return allErrors.flat();\n } else {\n // For non-multi-select, apply validations to the single field value\n return this.applyValidations(fieldValue);\n }\n }\n\n private parseAndValidateArray(fieldValue: any): { isValid: boolean; values: any[] } {\n if (Array.isArray(fieldValue)) {\n return { isValid: true, values: fieldValue };\n }\n \n try {\n const parsed = typeof fieldValue === 'string' ? JSON.parse(fieldValue) : null;\n if (Array.isArray(parsed)) {\n return { isValid: true, values: parsed };\n }\n } catch {\n // fall through\n }\n \n return { isValid: false, values: [] };\n }\n \n\n private applyValidations(fieldValue: any): ValidationError[] {\n const errors: ValidationError[] = [];\n this.isApplyRequiredValidation() && isEmpty(fieldValue) ? errors.push({ field: this.options.fieldName, error: `Field: ${this.options.fieldName} is required` }) : \"no errors\";\n if (isNotEmpty(fieldValue)) {\n errors.push(...this.applyFormatValidations(fieldValue));\n }\n return errors;\n }\n\n private applyFormatValidations(fieldValue: any): ValidationError[] {\n const errors: ValidationError[] = [];\n !this.isValidSelectionValueType(fieldValue, this.options.selectionValueType) ? errors.push({ field: this.options.fieldName, error: 'Field value is invalid' }) : \"no errors\";\n !this.isValidSelectionStaticValue(fieldValue, this.options.selectionValueType, this.options.selectionStaticValues) ? errors.push({ field: this.options.fieldName, error: 'Field value is invalid' }) : \"no errors\";\n return errors;\n }\n\n transformForCreate(dto: any): any {\n return dto;\n }\n\n // Validation to be applied\n private isValidSelectionValueType(fieldValue: any, selectionValueType: SelectionValueType): boolean {\n switch (selectionValueType) {\n case SelectionValueType.string:\n return isString(fieldValue);\n case SelectionValueType.int:\n return isInt(fieldValue);\n default:\n throw new Error(`Validation for selection value type ${selectionValueType} is not implemented`);\n }\n }\n\n private isValidSelectionStaticValue(fieldValue: any, selectionValueType: any, selectionStaticValues: string[]): boolean {\n switch (selectionValueType) {\n case SelectionValueType.string:\n return selectionStaticValues.map(v => v.split(\":\")[0]).includes(fieldValue);\n case SelectionValueType.int:\n return selectionStaticValues.map(v => Number(v.split(\":\")[0])).includes(fieldValue);\n default:\n throw new Error(`Validation for selection value type ${selectionValueType} is not implemented`);\n }\n }\n\n private isApplyRequiredValidation(): boolean {\n return this.options.required;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-transaction.service.d.ts","sourceRoot":"","sources":["../../src/services/import-transaction.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"import-transaction.service.d.ts","sourceRoot":"","sources":["../../src/services/import-transaction.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -235,9 +235,10 @@ let ImportTransactionService = ImportTransactionService_1 = class ImportTransact
|
|
|
235
235
|
if (!exportStream) {
|
|
236
236
|
throw new common_1.BadRequestException(`Failed to create export stream for import transaction ID ${importTransactionId}.`);
|
|
237
237
|
}
|
|
238
|
+
const extension = templateFormat === "excel" ? 'xlsx' : 'csv';
|
|
238
239
|
return {
|
|
239
240
|
stream: exportStream,
|
|
240
|
-
fileName: `${importTransaction.modelMetadata.singularName}-failed-imports.${
|
|
241
|
+
fileName: `${importTransaction.modelMetadata.singularName}-failed-imports.${extension}`,
|
|
241
242
|
mimeType: templateFormat === "excel" ? ImportMimeTypes.EXCEL : ImportMimeTypes.CSV,
|
|
242
243
|
};
|
|
243
244
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-transaction.service.js","sourceRoot":"","sources":["../../src/services/import-transaction.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, Injectable, Logger } from '@nestjs/common';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { EntityManager, Repository } from 'typeorm';\n\nimport { ConfigService } from '@nestjs/config';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { CRUDService } from 'src/services/crud.service';\nimport { FileService } from 'src/services/file.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\n\n\nimport { classify } from '@angular-devkit/core/src/utils/strings';\nimport { HttpService } from '@nestjs/axios';\nimport { RelationFieldsCommand, RelationType, SolidFieldType } from 'src/dtos/create-field-metadata.dto';\nimport { ImportInstructionsResponseDto, StandardImportInstructionsResponseDto } from 'src/dtos/import-instructions.dto';\nimport { FieldMetadata } from 'src/entities/field-metadata.entity';\nimport { ImportTransactionErrorLog } from 'src/entities/import-transaction-error-log.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { MediaWithFullUrl } from 'src/interfaces';\nimport { Readable } from 'stream';\nimport { v4 as uuidv4 } from 'uuid';\nimport { ImportTransaction } from '../entities/import-transaction.entity';\nimport { CsvService } from './csv.service';\nimport { ExcelService } from './excel.service';\nimport { SolidIntrospectService } from './solid-introspect.service';\n\ninterface ImportTemplateFileInfo {\n stream: NodeJS.ReadableStream;\n fileName: string;\n mimeType: string;\n}\n\nexport enum ImportFormat {\n CSV = 'csv',\n EXCEL = 'excel',\n}\n\nexport enum ImportMimeTypes {\n CSV = 'text/csv',\n EXCEL = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n}\nexport interface ImportMappingInfo {\n sampleImportedRecordInfo: SampleImportedRecordInfo[];\n importableFields: ImportableFieldInfo[];\n}\nexport interface SampleImportedRecordInfo {\n cellHeader: string; // The header of the cell in the import file\n cellValue: string; // The value of the cell in the import file\n defaultMappedFieldName: string; // The default mapped field name in the model metadata\n}\nexport interface ImportableFieldInfo {\n name: string;\n displayName: string;\n}\n\nexport interface ImportPaginatedReadResult {\n headers: string[]; // Headers of the CSV file\n data: Record<string, any>[]; // Data records in the current page\n}\n\ninterface ImportMapping {\n header: string; // The name of the field in the import file\n fieldName: string; // The name of the field in the model metadata to which the imported field is mapped\n}\n\nexport enum ImportTransactionStatus {\n draft = 'draft',\n mapping_created = 'mapping_created',\n import_started = 'import_started',\n import_succeeded = 'import_succeeded',\n import_failed = 'import_failed',\n}\n\nexport interface ImportSyncResult {\n status: string; // The status of the import transaction\n importedIds: Array<number>; // The IDs of the records created during the import\n importedCount: number; // The number of records created during the import\n failedCount: number; // The number of records that failed to import\n}\ninterface ImportRecordsResult {\n ids: Array<number>; // The IDs of the records created during the import\n errorLogIds: Array<number>; // The IDs of the error log entries created during the import\n}\n\n@Injectable()\nexport class ImportTransactionService extends CRUDService<ImportTransaction> {\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(ImportTransaction, 'default')\n readonly repo: Repository<ImportTransaction>,\n readonly moduleRef: ModuleRef,\n readonly excelService: ExcelService,\n readonly csvService: CsvService,\n readonly httpService: HttpService,\n readonly introspectService: SolidIntrospectService,\n // readonly fieldMetadataService: FieldMetadataService,\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'importTransaction', 'solid-core', moduleRef);\n }\n\n private readonly logger = new Logger(ImportTransactionService.name);\n\n /**\n * This method is used to return a csv / excel template for the import transaction\n * It will contain the display names of the fields in the header row\n * @param modelMetadataId \n */\n async getImportTemplate(modelMetadataId: number, format: ImportFormat = ImportFormat.CSV): Promise<ImportTemplateFileInfo> {\n // Load the model metadata for the given ID\n const modelMetadata = await this.modelMetadataService.findOne(modelMetadataId, {\n populate: ['fields'],\n });\n if (!modelMetadata) {\n throw new Error(`Model metadata with ID ${modelMetadataId} not found.`);\n }\n // Create a header row with the display names of the fields, excluding the media fields,computed fields\n const headers = this.fieldsAllowedForImport(modelMetadata.fields)\n .map(field => field.displayName);\n\n // Depending on the format, generate the template\n if (format === ImportFormat.CSV) {\n const stream = await this.csvService.createCsvStream(null, 0, headers); // Create a CSV stream with the header row\n const fileName = `${modelMetadata.singularName}-import-template.csv`;\n const mimeType = 'text/csv';\n return {\n stream,\n fileName,\n mimeType,\n };\n } else if (format === ImportFormat.EXCEL) {\n const stream = await this.excelService.createExcelStream(null, 0, headers); // Create an Excel stream with the header row\n const fileName = `${modelMetadata.singularName}-import-template.xlsx`;\n // Set the MIME type for Excel files\n const mimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n return {\n stream,\n fileName,\n mimeType,\n };\n } else {\n throw new Error(`Unsupported import format: ${format}`);\n }\n\n }\n\n async getImportInstructions(modelMetadataId: number): Promise<ImportInstructionsResponseDto> {\n // Load the model metadata for the given ID\n const modelMetadata = await this.modelMetadataService.findOne(modelMetadataId, {\n populate: ['fields'],\n });\n if (!modelMetadata) {\n throw new Error(`Model metadata with ID ${modelMetadataId} not found.`);\n }\n\n // Create the standard import instructions\n const standardInstructions: StandardImportInstructionsResponseDto = {\n requiredFields: [],\n dateFields: [],\n dateTimeFields: [],\n numberFields: [],\n emailFields: [],\n regexFields: [],\n jsonFields: [],\n booleanFields: [],\n };\n\n // Iterate through the fields and populate the standard instructions\n for (const field of modelMetadata.fields) {\n if (field.isSystem) continue; // Skip system fields\n if (field.required) {\n standardInstructions.requiredFields.push(field.displayName);\n }\n if (field.type === SolidFieldType.date) {\n standardInstructions.dateFields.push(field.displayName);\n }\n if (field.type === SolidFieldType.datetime) {\n standardInstructions.dateTimeFields.push(field.displayName);\n }\n if ([SolidFieldType.bigint, SolidFieldType.int, SolidFieldType.decimal].includes(field.type as SolidFieldType)) {\n standardInstructions.numberFields.push(field.displayName);\n }\n if (field.type === SolidFieldType.email) {\n standardInstructions.emailFields.push(field.displayName);\n }\n if (field.regexPattern) {\n standardInstructions.regexFields.push({\n fieldName: field.displayName,\n regexPattern: field.regexPattern,\n });\n }\n if (field.type === SolidFieldType.json) {\n standardInstructions.jsonFields.push(field.displayName);\n }\n if (field.type === SolidFieldType.boolean) {\n standardInstructions.booleanFields.push(field.displayName);\n }\n }\n\n // Create the custom instructions\n const customInstructions: string[] = [];\n\n return {\n standard: standardInstructions,\n custom: customInstructions,\n };\n }\n\n async getImportMappingInfo(importTransactionId: number): Promise<ImportMappingInfo> {\n // Load the import transaction for the given ID\n const importTransaction = await this.loadImportTransaction(importTransactionId);\n\n // Get all the importable fields from the model metadata\n const importableFields: ImportableFieldInfo[] = this.fieldsAllowedForImport(importTransaction.modelMetadata.fields).map(field => ({\n name: field.name,\n displayName: field.displayName,\n required: field.required,\n }));\n\n // Get the import file media object from the import transaction\n const importFileMediaObject = this.getImportFileObject(importTransaction);\n\n // Get the import file stream for the import transaction\n const importFileStream = await this.getImportFileStream(importFileMediaObject);\n\n // Get a sample of records from the import file\n const sampleRecord = await this.getFileRecordsSample(importFileStream, importFileMediaObject.mimeType);\n\n // Convert sampleRecord to the format required for SampleImportedRecordInfo\n const wrappedRecords: SampleImportedRecordInfo[] = sampleRecord.data.map((record: Record<string, any>) => {\n return Object.entries(record).map(([key, value]) => ({\n cellHeader: key,\n cellValue: value,\n defaultMappedFieldName: importableFields.find(field => field.displayName === key)?.name || '',\n }));\n }).flat();\n\n // for await (const page of this.csvService.readCsvInPagesFromStream(importFileStream)) {\n // // await dbService.bulkInsert(page);\n // }\n\n return {\n sampleImportedRecordInfo: wrappedRecords, // This will hold the sample data from the file\n importableFields: importableFields, // This will hold the fields that can be imported\n };\n }\n\n async startImportSync(importTransactionId: number): Promise<ImportSyncResult> {\n // Load the import transaction for the given ID\n const importTransaction = await this.loadImportTransaction(importTransactionId);\n\n // Get the import file media object from the import transaction\n const importFileMediaObject = this.getImportFileObject(importTransaction);\n\n // Get the import file stream for the import transaction\n const importFileStream = await this.getImportFileStream(importFileMediaObject);\n\n const { ids, errorLogIds } = await this.importFromFileToDB(\n importTransaction,\n importFileStream,\n importFileMediaObject.mimeType,\n );\n\n // Update the import transaction status to 'completed'\n (errorLogIds.length > 0) ? importTransaction.status = ImportTransactionStatus.import_failed : importTransaction.status = ImportTransactionStatus.import_succeeded; //FIXME: We can probably have import_partially_failed status to differentiate\n // Save the import transaction\n await this.repo.save(importTransaction);\n return {\n status: importTransaction.status,\n importedIds: ids, // The IDs of the records created during the import\n importedCount: ids.length, // The number of records created during the import\n failedCount: errorLogIds.length, // The number of records that failed to import\n };\n }\n\n startImportAsync(importTransactionId: number): Promise<void> {\n throw new Error('Method not implemented.');\n }\n\n async exportFailedImportedImports(importTransactionId: number) {\n // Get the 1st error log entry to determine the headers for the export file\n const firstErrorLogEntry = await this.entityManager.getRepository(ImportTransactionErrorLog).findOne({\n where: {\n importTransaction: { id: importTransactionId },\n },\n });\n\n if (!firstErrorLogEntry) {\n throw new BadRequestException(`No error log entries found for import transaction ID ${importTransactionId}.`);\n }\n\n // Create the headers for the export file\n const headers = [\n ...Object.keys(firstErrorLogEntry.rowData ? JSON.parse(firstErrorLogEntry.rowData) : {}), // Include all keys from the rowData JSON\n 'Error', // Error message for the failed record\n ];\n\n\n // Depending upon the format of the import tranaction file, create a readable stream of the error log entries\n const importTransaction = await this.loadImportTransaction(importTransactionId);\n const importFileMediaObject = this.getImportFileObject(importTransaction);\n const mimeType = importFileMediaObject.mimeType;\n const templateFormat = mimeType === ImportMimeTypes.CSV ? \"csv\" : \"excel\";\n const dataRecordsFunc = async (chunkIndex: number, chunkSize: number): Promise<any[]> => {\n // Get the error log entries for the import transaction\n const errorLogEntries = await this.entityManager.getRepository(ImportTransactionErrorLog).find({\n where: {\n importTransaction: { id: importTransactionId },\n },\n skip: chunkIndex * chunkSize,\n take: chunkSize,\n });\n\n if (!errorLogEntries || errorLogEntries.length === 0) {\n return []; // Return an empty array if no error log entries found\n }\n\n // Read the row data json from the error log entry, parse it and write it as a record to the stream\n return errorLogEntries.map(entry => {\n const rowData = entry.rowData ? JSON.parse(entry.rowData) : {};\n return {\n ...rowData, // Spread the row data into the record\n Error: entry.errorMessage,\n };\n });\n };\n\n // Get the export stream for the failed records\n const exportStream = await this.getFailedRecordsStream(templateFormat, headers, dataRecordsFunc);\n if (!exportStream) {\n throw new BadRequestException(`Failed to create export stream for import transaction ID ${importTransactionId}.`);\n }\n // Return the export stream\n return {\n stream: exportStream,\n fileName: `${importTransaction.modelMetadata.singularName}-failed-imports.${templateFormat}`,\n mimeType: templateFormat === \"excel\" ? ImportMimeTypes.EXCEL : ImportMimeTypes.CSV,\n };\n\n }\n\n private async getFailedRecordsStream(templateFormat: string, headers: string[], dataRecordsFunc: (chunkIndex: number, chunkSize: number) => Promise<any[]>) {\n let exportStream = null;\n switch (templateFormat) {\n case \"excel\":\n exportStream = await this.excelService.createExcelStream(dataRecordsFunc, 100, headers);\n break;\n case \"csv\":\n exportStream = await this.csvService.createCsvStream(dataRecordsFunc, 100, headers);\n break;\n default:\n throw new Error('Invalid export format');\n }\n return exportStream;\n }\n\n\n private async loadImportTransaction(importTransactionId: number) {\n const importTransaction = await this.findOne(importTransactionId, {\n populate: ['modelMetadata', 'modelMetadata.fields'],\n populateMedia: ['fileLocation'],\n });\n if (!importTransaction) {\n throw new Error(`Import transaction with ID ${importTransactionId} not found.`);\n }\n return importTransaction;\n }\n\n private fieldsAllowedForImport(fields: FieldMetadata[]): FieldMetadata[] {\n // Filter out fields that are not allowed for import\n return fields.filter(field =>\n field.type !== SolidFieldType.mediaMultiple && // Exclude media multiple fields\n field.type !== SolidFieldType.mediaSingle &&\n field.type !== SolidFieldType.computed && // Exclude computed fields\n field.type !== SolidFieldType.password &&\n field.type !== SolidFieldType.richText &&\n field.type !== SolidFieldType.uuid &&\n field.isSystem !== true // Exclude system fields\n );\n }\n\n private async getFileRecordsSample(importFileStream: Readable, mimeType: string): Promise<ImportPaginatedReadResult> {\n // Depending upon the mime type of the file, read the file in pages\n // For CSV files, use the csvService to read the file in pages\n // For Excel files, use the excelService to read the file in pages\n if (mimeType === 'text/csv') {\n const generator = this.csvService.readCsvInPagesFromStream(importFileStream, { pageSize: 1 });\n const firstRecord = await generator.next(); // Get the first record to extract headers and sample data\n return firstRecord.value;\n } else if (mimeType === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {\n const generator = this.excelService.readExcelInPagesFromStream(importFileStream, { pageSize: 1 });\n const firstRecord = await generator.next(); // Get the first record to extract headers and sample data\n return firstRecord.value;\n }\n else { // If the file is neither CSV nor Excel, throw an error\n throw new Error(`Unsupported file type: ${mimeType}`);\n }\n }\n\n private getImportFileObject(importTransaction: ImportTransaction): MediaWithFullUrl {\n const importFileMediaObject = importTransaction['_media']['fileLocation'][0] as MediaWithFullUrl; // Since there can be only one fileLocation, we can safely access the first element\n if (!importFileMediaObject) {\n throw new Error(`Import file for transaction ID ${importTransaction.id} not found.`);\n }\n return importFileMediaObject;\n }\n\n private async getImportFileStream(importFileMediaObject: MediaWithFullUrl): Promise<Readable> {\n const fileUrl = importFileMediaObject['_full_url'];\n const mimeType = importFileMediaObject['mimeType'];\n if (!fileUrl) {\n throw new Error(`File URL ${fileUrl} not found.`);\n }\n // From the file URL, convert the file URL to a readable stream using nestjs http service and axios\n const fileUrlResponse = await this.httpService.axiosRef.get(fileUrl, {\n responseType: 'stream',\n });\n\n if (!fileUrlResponse || !fileUrlResponse.data) {\n throw new Error(`Failed to read file from URL: ${fileUrl}`);\n }\n // fileUrlResponse.data is a Node.js Readable stream\n return fileUrlResponse.data;\n }\n\n private async importFromFileToDB(\n importTransaction: ImportTransaction,\n importFileStream: Readable,\n mimeType: string,\n ): Promise<ImportRecordsResult> {\n if (!importTransaction.modelMetadata) {\n throw new Error(`Model metadata for import transaction ID ${importTransaction.id} not found.`);\n }\n\n const createdRecordIds = [];\n const createdErrorLogIds = [];\n\n // Get the model service for the model metadata name\n const modelService = this.getModelService(importTransaction.modelMetadata.singularName);\n\n // Depending upon the mime type of the file, read the file in pages and insert the records into the database\n if (mimeType === ImportMimeTypes.CSV) {\n for await (const page of this.csvService.readCsvInPagesFromStream(importFileStream)) {\n const { ids, errorLogIds } = await this.importRecords(page, importTransaction, modelService);\n createdRecordIds.push(...ids);\n createdErrorLogIds.push(...errorLogIds);\n }\n }\n else if (mimeType === ImportMimeTypes.EXCEL) {\n for await (const page of this.excelService.readExcelInPagesFromStream(importFileStream)) {\n const { ids, errorLogIds } = await this.importRecords(page, importTransaction, modelService);\n createdRecordIds.push(...ids);\n createdErrorLogIds.push(...errorLogIds);\n }\n } else { // If the file is neither CSV nor Excel, throw an error\n throw new Error(`Unsupported file type: ${mimeType}`);\n }\n\n return {\n ids: createdRecordIds, // Return the IDs of the created records\n errorLogIds: createdErrorLogIds, // Return the IDs of the error log entries created during the import\n }\n }\n\n private async importRecords(page: ImportPaginatedReadResult, importTransaction: ImportTransaction, modelService: CRUDService<any>): Promise<ImportRecordsResult> {\n if (!importTransaction.modelMetadata || !importTransaction.modelMetadata.fields) {\n throw new Error(`Model metadata with fields for import transaction ID ${importTransaction.id} not found.`);\n }\n\n const ids: Array<number> = [];\n const errorLogIds: Array<number> = [];\n for (const record of page.data) {\n try {\n const createdRecord = await this.insertRecord(record, JSON.parse(importTransaction.mapping) as ImportMapping[], importTransaction.modelMetadata, modelService);\n ids.push(createdRecord.id); // Add the ID of the created record to the ids array\n }\n catch (error) {\n this.logger.debug(`Error inserting record: ${JSON.stringify(record)}. Error: ${error.message}`);\n // Get the Import transaction error log repo\n const errorLog = await this.createErrorLogEntry(importTransaction, record, error);\n errorLogIds.push(errorLog.id); // Add the ID of the error log entry to the errorLogIds array\n }\n }\n return {\n ids: ids, // Return the IDs of the created records\n errorLogIds: errorLogIds, // Return the IDs of the error log entries created during the import\n };\n }\n\n private async createErrorLogEntry(importTransaction: ImportTransaction, record: Record<string, any>, error: any) {\n const importTransactionRepo = this.entityManager.getRepository(ImportTransactionErrorLog);\n // Create a new ImportTransactionErrorLog entry\n const rowNumber = uuidv4(); // Generate a unique row number or use page.rowNumber if available \n\n const errorLogEntry = {\n importTransactionErrorLogId: `${importTransaction.id}-${rowNumber}`, // FIXME pending to retrieve the row number from the page\n rowNumber: 1, // FIXME pending to retrieve the row number from the page\n rowData: JSON.stringify(record), // Store the row data\n importTransaction: importTransaction, // Link to the import transaction\n errorMessage: error.message, // Store the error message\n errorTrace: error.stack || '', // Store the error stack trace if available\n } as ImportTransactionErrorLog;\n\n // Save the error log entry to the database\n const savedEntry = await importTransactionRepo.save(errorLogEntry);\n return savedEntry; // Return the ID of the saved error log entry\n }\n\n //FIXME Currently below method fails if any field in the record is not valid or if the record is not valid. It does not collect the errors for all fields in a record\n private async insertRecord(record: Record<string, any>, mapping: ImportMapping[], modelMetadataWithFields: ModelMetadata, modelService: CRUDService<any>): Promise<any> {\n // Convert the imported record to a DTO\n const dto = await this.convertImportedRecordToDto(record, mapping, modelMetadataWithFields);\n // Use the model service to create the record in the database\n const createdRecord = await modelService.create(dto, [], {}); //FIXME: Need to handle this part alongwith the refactoring of the CRUDService for permissions\n return createdRecord; // Return the created record\n }\n\n private getModelService(modelSingularName: string): CRUDService<any> {\n // Get the model service for the model metadata name\n const modelServiceWrapper = this.introspectService.getProvider(`${classify(modelSingularName)}Service`);\n const modelService = modelServiceWrapper.instance as CRUDService<any>;\n if (!modelService) {\n throw new Error(`Model service for ${modelSingularName} not found.`);\n }\n return modelService;\n }\n\n private async convertImportedRecordToDto(record: Record<string, any>, mapping: ImportMapping[], modelMetadataWithFields: ModelMetadata) {\n // Create a new record object\n const dtoRecord: Record<string, any> = {};\n\n // Iterate through every cell in the record\n // Using the saved mapping, populate the dtoRecord w.r.t the record and fields\n for (const key in record) {\n const mappedField = mapping.find(m => m.header === key);\n if (mappedField) {\n // If the field is found in the mapping, get the field metadata from the model metadata\n const fieldMetadata = modelMetadataWithFields.fields.find(f => f.name === mappedField.fieldName);\n // const userKeyField = modelMetadataWithFields.fields.find(f => f.isUserKey === true); // Assuming userKey is a field in the model metadata\n if (fieldMetadata) {\n // If the field is found in the model metadata, set the value in the dtoRecord\n await this.populateDtoForACell(dtoRecord, fieldMetadata, record, key);\n } else {\n this.logger.warn(`Field ${mappedField.fieldName} not found in model metadata ${modelMetadataWithFields.singularName}`);\n }\n }\n }\n return dtoRecord;\n }\n\n private async populateDtoForACell(dtoRecord: Record<string, any>, fieldMetadata: FieldMetadata, record: Record<string, any>, key: string): Promise<Record<string, any>> {\n const fieldType = fieldMetadata.type;\n // const userKeyFieldName = userKeyField?.name || 'id'; // Default to 'id' if not found\n\n // TODO Move this logic to field crud managers i.e add a parse method to the field crud manager interface\n switch (fieldType) {\n case SolidFieldType.relation: {\n return await this.populateDtoForRelations(fieldMetadata, record, key, dtoRecord);\n }\n case SolidFieldType.date:\n case SolidFieldType.datetime: return this.populateDtoForDate(record, key, fieldMetadata, dtoRecord);\n case SolidFieldType.int:\n case SolidFieldType.bigint:\n case SolidFieldType.decimal:\n return this.populateDtoForNumber(dtoRecord, fieldMetadata, record, key);\n case SolidFieldType.boolean:\n return this.populateDtoForBoolean(dtoRecord, fieldMetadata, record, key);\n default:\n dtoRecord[fieldMetadata.name] = record[key];\n return dtoRecord;\n }\n }\n\n private populateDtoForBoolean(dtoRecord: Record<string, any>, fieldMetadata: FieldMetadata, record: Record<string, any>, key: string) {\n const booleanValue = Boolean(record[key]);\n if (typeof booleanValue !== 'boolean') {\n throw new Error(`Invalid boolean value for cell ${key} with value ${record[key]}`);\n }\n dtoRecord[fieldMetadata.name] = booleanValue;\n return dtoRecord;\n }\n\n private populateDtoForNumber(dtoRecord: Record<string, any>, fieldMetadata: FieldMetadata, record: Record<string, any>, key: string) {\n const numberValue = Number(record[key]);\n if (isNaN(numberValue)) {\n throw new Error(`Invalid number value for cell ${key} with value ${record[key]}`);\n }\n dtoRecord[fieldMetadata.name] = numberValue;\n return dtoRecord;\n }\n\n private populateDtoForDate(record: Record<string, any>, key: string, fieldMetadata: FieldMetadata, dtoRecord: Record<string, any>) {\n {\n const dateValue = new Date(record[key]);\n if (isNaN(dateValue.getTime())) {\n throw new Error(`Invalid date value for cell ${key} with value ${record[key]}`);\n }\n dtoRecord[fieldMetadata.name] = dateValue;\n return dtoRecord;\n }\n }\n\n private async populateDtoForRelations(fieldMetadata: FieldMetadata, record: Record<string, any>, key: string, dtoRecord: Record<string, any>) {\n if (!fieldMetadata.relationCoModelSingularName) {\n throw new Error(`Relation coModelSingularName is not defined for relation field ${fieldMetadata.name}`);\n }\n\n const relatedRecordsIds = await this.getRelatedEntityIdsFromUserKeys(fieldMetadata, record, key);\n if (relatedRecordsIds.length === 0) {\n return dtoRecord; // If no related records found, return the dtoRecord as is\n }\n\n if (fieldMetadata.relationType === RelationType.manyTomany || fieldMetadata.relationType === RelationType.oneToMany) {\n dtoRecord[`${fieldMetadata.name}Ids`] = relatedRecordsIds;\n dtoRecord[`${fieldMetadata.name}Command`] = RelationFieldsCommand.set; // Reset the relation field association with the related records IDs\n }\n else if (fieldMetadata.relationType === RelationType.manyToOne) {\n dtoRecord[`${fieldMetadata.name}Id`] = relatedRecordsIds.pop(); // For many-to-one relations, we need only one ID\n }\n return dtoRecord;\n }\n\n private async getRelatedEntityIdsFromUserKeys(fieldMetadata: FieldMetadata, record: Record<string, any>, key: string): Promise<Array<number>> {\n // For many-to-many or one-to-many relations, we expect the record cell to contains a comma-separated list of userKeys\n const relationUserKeys = record[key] ? String(record[key]).split(',').map((userKey: string) => userKey.trim()) : [];\n if (relationUserKeys.length === 0) return [];\n\n const coModelService = this.getModelService(fieldMetadata.relationCoModelSingularName);\n const coModelWithUserKeyField = await this.modelMetadataService.findOneBySingularName(fieldMetadata.relationCoModelSingularName, ['userKeyField']);\n const coModelUserKeyFieldName = coModelWithUserKeyField?.userKeyField?.name || 'id'; // Default to 'id' if not found\n\n\n // Set the relation basic filter dto filters with the userkeys and call the find method of the model service to get the related records\n const relationFilterDto = {\n filters: {\n [coModelUserKeyFieldName]: {\n $in: relationUserKeys, // Use the userKeyFieldName to filter by userKeys\n },\n },\n };\n\n // From the userKeys, we will get the IDs of the related records using the userKeyFieldName and throw an error if any of the userKeys is not found\n const relatedRecordsResult = await coModelService.find(relationFilterDto);\n if (!relatedRecordsResult || !relatedRecordsResult.records || relatedRecordsResult.records.length === 0 || relatedRecordsResult.records.length !== relationUserKeys.length) {\n throw new Error(`Invalid related records userKey values found for cell ${key} with value ${record[key]}`);\n }\n const relatedRecordsIds = relatedRecordsResult.records.map(record => record.id);\n return relatedRecordsIds;\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"import-transaction.service.js","sourceRoot":"","sources":["../../src/services/import-transaction.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, Injectable, Logger } from '@nestjs/common';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { EntityManager, Repository } from 'typeorm';\n\nimport { ConfigService } from '@nestjs/config';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { CRUDService } from 'src/services/crud.service';\nimport { FileService } from 'src/services/file.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\n\n\nimport { classify } from '@angular-devkit/core/src/utils/strings';\nimport { HttpService } from '@nestjs/axios';\nimport { RelationFieldsCommand, RelationType, SolidFieldType } from 'src/dtos/create-field-metadata.dto';\nimport { ImportInstructionsResponseDto, StandardImportInstructionsResponseDto } from 'src/dtos/import-instructions.dto';\nimport { FieldMetadata } from 'src/entities/field-metadata.entity';\nimport { ImportTransactionErrorLog } from 'src/entities/import-transaction-error-log.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { MediaWithFullUrl } from 'src/interfaces';\nimport { Readable } from 'stream';\nimport { v4 as uuidv4 } from 'uuid';\nimport { ImportTransaction } from '../entities/import-transaction.entity';\nimport { CsvService } from './csv.service';\nimport { ExcelService } from './excel.service';\nimport { SolidIntrospectService } from './solid-introspect.service';\n\ninterface ImportTemplateFileInfo {\n stream: NodeJS.ReadableStream;\n fileName: string;\n mimeType: string;\n}\n\nexport enum ImportFormat {\n CSV = 'csv',\n EXCEL = 'excel',\n}\n\nexport enum ImportMimeTypes {\n CSV = 'text/csv',\n EXCEL = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n}\nexport interface ImportMappingInfo {\n sampleImportedRecordInfo: SampleImportedRecordInfo[];\n importableFields: ImportableFieldInfo[];\n}\nexport interface SampleImportedRecordInfo {\n cellHeader: string; // The header of the cell in the import file\n cellValue: string; // The value of the cell in the import file\n defaultMappedFieldName: string; // The default mapped field name in the model metadata\n}\nexport interface ImportableFieldInfo {\n name: string;\n displayName: string;\n}\n\nexport interface ImportPaginatedReadResult {\n headers: string[]; // Headers of the CSV file\n data: Record<string, any>[]; // Data records in the current page\n}\n\ninterface ImportMapping {\n header: string; // The name of the field in the import file\n fieldName: string; // The name of the field in the model metadata to which the imported field is mapped\n}\n\nexport enum ImportTransactionStatus {\n draft = 'draft',\n mapping_created = 'mapping_created',\n import_started = 'import_started',\n import_succeeded = 'import_succeeded',\n import_failed = 'import_failed',\n}\n\nexport interface ImportSyncResult {\n status: string; // The status of the import transaction\n importedIds: Array<number>; // The IDs of the records created during the import\n importedCount: number; // The number of records created during the import\n failedCount: number; // The number of records that failed to import\n}\ninterface ImportRecordsResult {\n ids: Array<number>; // The IDs of the records created during the import\n errorLogIds: Array<number>; // The IDs of the error log entries created during the import\n}\n\n@Injectable()\nexport class ImportTransactionService extends CRUDService<ImportTransaction> {\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(ImportTransaction, 'default')\n readonly repo: Repository<ImportTransaction>,\n readonly moduleRef: ModuleRef,\n readonly excelService: ExcelService,\n readonly csvService: CsvService,\n readonly httpService: HttpService,\n readonly introspectService: SolidIntrospectService,\n // readonly fieldMetadataService: FieldMetadataService,\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'importTransaction', 'solid-core', moduleRef);\n }\n\n private readonly logger = new Logger(ImportTransactionService.name);\n\n /**\n * This method is used to return a csv / excel template for the import transaction\n * It will contain the display names of the fields in the header row\n * @param modelMetadataId \n */\n async getImportTemplate(modelMetadataId: number, format: ImportFormat = ImportFormat.CSV): Promise<ImportTemplateFileInfo> {\n // Load the model metadata for the given ID\n const modelMetadata = await this.modelMetadataService.findOne(modelMetadataId, {\n populate: ['fields'],\n });\n if (!modelMetadata) {\n throw new Error(`Model metadata with ID ${modelMetadataId} not found.`);\n }\n // Create a header row with the display names of the fields, excluding the media fields,computed fields\n const headers = this.fieldsAllowedForImport(modelMetadata.fields)\n .map(field => field.displayName);\n\n // Depending on the format, generate the template\n if (format === ImportFormat.CSV) {\n const stream = await this.csvService.createCsvStream(null, 0, headers); // Create a CSV stream with the header row\n const fileName = `${modelMetadata.singularName}-import-template.csv`;\n const mimeType = 'text/csv';\n return {\n stream,\n fileName,\n mimeType,\n };\n } else if (format === ImportFormat.EXCEL) {\n const stream = await this.excelService.createExcelStream(null, 0, headers); // Create an Excel stream with the header row\n const fileName = `${modelMetadata.singularName}-import-template.xlsx`;\n // Set the MIME type for Excel files\n const mimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n return {\n stream,\n fileName,\n mimeType,\n };\n } else {\n throw new Error(`Unsupported import format: ${format}`);\n }\n\n }\n\n async getImportInstructions(modelMetadataId: number): Promise<ImportInstructionsResponseDto> {\n // Load the model metadata for the given ID\n const modelMetadata = await this.modelMetadataService.findOne(modelMetadataId, {\n populate: ['fields'],\n });\n if (!modelMetadata) {\n throw new Error(`Model metadata with ID ${modelMetadataId} not found.`);\n }\n\n // Create the standard import instructions\n const standardInstructions: StandardImportInstructionsResponseDto = {\n requiredFields: [],\n dateFields: [],\n dateTimeFields: [],\n numberFields: [],\n emailFields: [],\n regexFields: [],\n jsonFields: [],\n booleanFields: [],\n };\n\n // Iterate through the fields and populate the standard instructions\n for (const field of modelMetadata.fields) {\n if (field.isSystem) continue; // Skip system fields\n if (field.required) {\n standardInstructions.requiredFields.push(field.displayName);\n }\n if (field.type === SolidFieldType.date) {\n standardInstructions.dateFields.push(field.displayName);\n }\n if (field.type === SolidFieldType.datetime) {\n standardInstructions.dateTimeFields.push(field.displayName);\n }\n if ([SolidFieldType.bigint, SolidFieldType.int, SolidFieldType.decimal].includes(field.type as SolidFieldType)) {\n standardInstructions.numberFields.push(field.displayName);\n }\n if (field.type === SolidFieldType.email) {\n standardInstructions.emailFields.push(field.displayName);\n }\n if (field.regexPattern) {\n standardInstructions.regexFields.push({\n fieldName: field.displayName,\n regexPattern: field.regexPattern,\n });\n }\n if (field.type === SolidFieldType.json) {\n standardInstructions.jsonFields.push(field.displayName);\n }\n if (field.type === SolidFieldType.boolean) {\n standardInstructions.booleanFields.push(field.displayName);\n }\n }\n\n // Create the custom instructions\n const customInstructions: string[] = [];\n\n return {\n standard: standardInstructions,\n custom: customInstructions,\n };\n }\n\n async getImportMappingInfo(importTransactionId: number): Promise<ImportMappingInfo> {\n // Load the import transaction for the given ID\n const importTransaction = await this.loadImportTransaction(importTransactionId);\n\n // Get all the importable fields from the model metadata\n const importableFields: ImportableFieldInfo[] = this.fieldsAllowedForImport(importTransaction.modelMetadata.fields).map(field => ({\n name: field.name,\n displayName: field.displayName,\n required: field.required,\n }));\n\n // Get the import file media object from the import transaction\n const importFileMediaObject = this.getImportFileObject(importTransaction);\n\n // Get the import file stream for the import transaction\n const importFileStream = await this.getImportFileStream(importFileMediaObject);\n\n // Get a sample of records from the import file\n const sampleRecord = await this.getFileRecordsSample(importFileStream, importFileMediaObject.mimeType);\n\n // Convert sampleRecord to the format required for SampleImportedRecordInfo\n const wrappedRecords: SampleImportedRecordInfo[] = sampleRecord.data.map((record: Record<string, any>) => {\n return Object.entries(record).map(([key, value]) => ({\n cellHeader: key,\n cellValue: value,\n defaultMappedFieldName: importableFields.find(field => field.displayName === key)?.name || '',\n }));\n }).flat();\n\n // for await (const page of this.csvService.readCsvInPagesFromStream(importFileStream)) {\n // // await dbService.bulkInsert(page);\n // }\n\n return {\n sampleImportedRecordInfo: wrappedRecords, // This will hold the sample data from the file\n importableFields: importableFields, // This will hold the fields that can be imported\n };\n }\n\n async startImportSync(importTransactionId: number): Promise<ImportSyncResult> {\n // Load the import transaction for the given ID\n const importTransaction = await this.loadImportTransaction(importTransactionId);\n\n // Get the import file media object from the import transaction\n const importFileMediaObject = this.getImportFileObject(importTransaction);\n\n // Get the import file stream for the import transaction\n const importFileStream = await this.getImportFileStream(importFileMediaObject);\n\n const { ids, errorLogIds } = await this.importFromFileToDB(\n importTransaction,\n importFileStream,\n importFileMediaObject.mimeType,\n );\n\n // Update the import transaction status to 'completed'\n (errorLogIds.length > 0) ? importTransaction.status = ImportTransactionStatus.import_failed : importTransaction.status = ImportTransactionStatus.import_succeeded; //FIXME: We can probably have import_partially_failed status to differentiate\n // Save the import transaction\n await this.repo.save(importTransaction);\n return {\n status: importTransaction.status,\n importedIds: ids, // The IDs of the records created during the import\n importedCount: ids.length, // The number of records created during the import\n failedCount: errorLogIds.length, // The number of records that failed to import\n };\n }\n\n startImportAsync(importTransactionId: number): Promise<void> {\n throw new Error('Method not implemented.');\n }\n\n async exportFailedImportedImports(importTransactionId: number) {\n // Get the 1st error log entry to determine the headers for the export file\n const firstErrorLogEntry = await this.entityManager.getRepository(ImportTransactionErrorLog).findOne({\n where: {\n importTransaction: { id: importTransactionId },\n },\n });\n\n if (!firstErrorLogEntry) {\n throw new BadRequestException(`No error log entries found for import transaction ID ${importTransactionId}.`);\n }\n\n // Create the headers for the export file\n const headers = [\n ...Object.keys(firstErrorLogEntry.rowData ? JSON.parse(firstErrorLogEntry.rowData) : {}), // Include all keys from the rowData JSON\n 'Error', // Error message for the failed record\n ];\n\n\n // Depending upon the format of the import tranaction file, create a readable stream of the error log entries\n const importTransaction = await this.loadImportTransaction(importTransactionId);\n const importFileMediaObject = this.getImportFileObject(importTransaction);\n const mimeType = importFileMediaObject.mimeType;\n const templateFormat = mimeType === ImportMimeTypes.CSV ? \"csv\" : \"excel\";\n const dataRecordsFunc = async (chunkIndex: number, chunkSize: number): Promise<any[]> => {\n // Get the error log entries for the import transaction\n const errorLogEntries = await this.entityManager.getRepository(ImportTransactionErrorLog).find({\n where: {\n importTransaction: { id: importTransactionId },\n },\n skip: chunkIndex * chunkSize,\n take: chunkSize,\n });\n\n if (!errorLogEntries || errorLogEntries.length === 0) {\n return []; // Return an empty array if no error log entries found\n }\n\n // Read the row data json from the error log entry, parse it and write it as a record to the stream\n return errorLogEntries.map(entry => {\n const rowData = entry.rowData ? JSON.parse(entry.rowData) : {};\n return {\n ...rowData, // Spread the row data into the record\n Error: entry.errorMessage,\n };\n });\n };\n\n // Get the export stream for the failed records\n const exportStream = await this.getFailedRecordsStream(templateFormat, headers, dataRecordsFunc);\n if (!exportStream) {\n throw new BadRequestException(`Failed to create export stream for import transaction ID ${importTransactionId}.`);\n }\n // Return the export stream\n const extension = templateFormat === \"excel\" ? 'xlsx' : 'csv';\n return {\n stream: exportStream,\n fileName: `${importTransaction.modelMetadata.singularName}-failed-imports.${extension}`,\n mimeType: templateFormat === \"excel\" ? ImportMimeTypes.EXCEL : ImportMimeTypes.CSV,\n };\n\n }\n\n private async getFailedRecordsStream(templateFormat: string, headers: string[], dataRecordsFunc: (chunkIndex: number, chunkSize: number) => Promise<any[]>) {\n let exportStream = null;\n switch (templateFormat) {\n case \"excel\":\n exportStream = await this.excelService.createExcelStream(dataRecordsFunc, 100, headers);\n break;\n case \"csv\":\n exportStream = await this.csvService.createCsvStream(dataRecordsFunc, 100, headers);\n break;\n default:\n throw new Error('Invalid export format');\n }\n return exportStream;\n }\n\n\n private async loadImportTransaction(importTransactionId: number) {\n const importTransaction = await this.findOne(importTransactionId, {\n populate: ['modelMetadata', 'modelMetadata.fields'],\n populateMedia: ['fileLocation'],\n });\n if (!importTransaction) {\n throw new Error(`Import transaction with ID ${importTransactionId} not found.`);\n }\n return importTransaction;\n }\n\n private fieldsAllowedForImport(fields: FieldMetadata[]): FieldMetadata[] {\n // Filter out fields that are not allowed for import\n return fields.filter(field =>\n field.type !== SolidFieldType.mediaMultiple && // Exclude media multiple fields\n field.type !== SolidFieldType.mediaSingle &&\n field.type !== SolidFieldType.computed && // Exclude computed fields\n field.type !== SolidFieldType.password &&\n field.type !== SolidFieldType.richText &&\n field.type !== SolidFieldType.uuid &&\n field.isSystem !== true // Exclude system fields\n );\n }\n\n private async getFileRecordsSample(importFileStream: Readable, mimeType: string): Promise<ImportPaginatedReadResult> {\n // Depending upon the mime type of the file, read the file in pages\n // For CSV files, use the csvService to read the file in pages\n // For Excel files, use the excelService to read the file in pages\n if (mimeType === 'text/csv') {\n const generator = this.csvService.readCsvInPagesFromStream(importFileStream, { pageSize: 1 });\n const firstRecord = await generator.next(); // Get the first record to extract headers and sample data\n return firstRecord.value;\n } else if (mimeType === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {\n const generator = this.excelService.readExcelInPagesFromStream(importFileStream, { pageSize: 1 });\n const firstRecord = await generator.next(); // Get the first record to extract headers and sample data\n return firstRecord.value;\n }\n else { // If the file is neither CSV nor Excel, throw an error\n throw new Error(`Unsupported file type: ${mimeType}`);\n }\n }\n\n private getImportFileObject(importTransaction: ImportTransaction): MediaWithFullUrl {\n const importFileMediaObject = importTransaction['_media']['fileLocation'][0] as MediaWithFullUrl; // Since there can be only one fileLocation, we can safely access the first element\n if (!importFileMediaObject) {\n throw new Error(`Import file for transaction ID ${importTransaction.id} not found.`);\n }\n return importFileMediaObject;\n }\n\n private async getImportFileStream(importFileMediaObject: MediaWithFullUrl): Promise<Readable> {\n const fileUrl = importFileMediaObject['_full_url'];\n const mimeType = importFileMediaObject['mimeType'];\n if (!fileUrl) {\n throw new Error(`File URL ${fileUrl} not found.`);\n }\n // From the file URL, convert the file URL to a readable stream using nestjs http service and axios\n const fileUrlResponse = await this.httpService.axiosRef.get(fileUrl, {\n responseType: 'stream',\n });\n\n if (!fileUrlResponse || !fileUrlResponse.data) {\n throw new Error(`Failed to read file from URL: ${fileUrl}`);\n }\n // fileUrlResponse.data is a Node.js Readable stream\n return fileUrlResponse.data;\n }\n\n private async importFromFileToDB(\n importTransaction: ImportTransaction,\n importFileStream: Readable,\n mimeType: string,\n ): Promise<ImportRecordsResult> {\n if (!importTransaction.modelMetadata) {\n throw new Error(`Model metadata for import transaction ID ${importTransaction.id} not found.`);\n }\n\n const createdRecordIds = [];\n const createdErrorLogIds = [];\n\n // Get the model service for the model metadata name\n const modelService = this.getModelService(importTransaction.modelMetadata.singularName);\n\n // Depending upon the mime type of the file, read the file in pages and insert the records into the database\n if (mimeType === ImportMimeTypes.CSV) {\n for await (const page of this.csvService.readCsvInPagesFromStream(importFileStream)) {\n const { ids, errorLogIds } = await this.importRecords(page, importTransaction, modelService);\n createdRecordIds.push(...ids);\n createdErrorLogIds.push(...errorLogIds);\n }\n }\n else if (mimeType === ImportMimeTypes.EXCEL) {\n for await (const page of this.excelService.readExcelInPagesFromStream(importFileStream)) {\n const { ids, errorLogIds } = await this.importRecords(page, importTransaction, modelService);\n createdRecordIds.push(...ids);\n createdErrorLogIds.push(...errorLogIds);\n }\n } else { // If the file is neither CSV nor Excel, throw an error\n throw new Error(`Unsupported file type: ${mimeType}`);\n }\n\n return {\n ids: createdRecordIds, // Return the IDs of the created records\n errorLogIds: createdErrorLogIds, // Return the IDs of the error log entries created during the import\n }\n }\n\n private async importRecords(page: ImportPaginatedReadResult, importTransaction: ImportTransaction, modelService: CRUDService<any>): Promise<ImportRecordsResult> {\n if (!importTransaction.modelMetadata || !importTransaction.modelMetadata.fields) {\n throw new Error(`Model metadata with fields for import transaction ID ${importTransaction.id} not found.`);\n }\n\n const ids: Array<number> = [];\n const errorLogIds: Array<number> = [];\n for (const record of page.data) {\n try {\n const createdRecord = await this.insertRecord(record, JSON.parse(importTransaction.mapping) as ImportMapping[], importTransaction.modelMetadata, modelService);\n ids.push(createdRecord.id); // Add the ID of the created record to the ids array\n }\n catch (error) {\n this.logger.debug(`Error inserting record: ${JSON.stringify(record)}. Error: ${error.message}`);\n // Get the Import transaction error log repo\n const errorLog = await this.createErrorLogEntry(importTransaction, record, error);\n errorLogIds.push(errorLog.id); // Add the ID of the error log entry to the errorLogIds array\n }\n }\n return {\n ids: ids, // Return the IDs of the created records\n errorLogIds: errorLogIds, // Return the IDs of the error log entries created during the import\n };\n }\n\n private async createErrorLogEntry(importTransaction: ImportTransaction, record: Record<string, any>, error: any) {\n const importTransactionRepo = this.entityManager.getRepository(ImportTransactionErrorLog);\n // Create a new ImportTransactionErrorLog entry\n const rowNumber = uuidv4(); // Generate a unique row number or use page.rowNumber if available \n\n const errorLogEntry = {\n importTransactionErrorLogId: `${importTransaction.id}-${rowNumber}`, // FIXME pending to retrieve the row number from the page\n rowNumber: 1, // FIXME pending to retrieve the row number from the page\n rowData: JSON.stringify(record), // Store the row data\n importTransaction: importTransaction, // Link to the import transaction\n errorMessage: error.message, // Store the error message\n errorTrace: error.stack || '', // Store the error stack trace if available\n } as ImportTransactionErrorLog;\n\n // Save the error log entry to the database\n const savedEntry = await importTransactionRepo.save(errorLogEntry);\n return savedEntry; // Return the ID of the saved error log entry\n }\n\n //FIXME Currently below method fails if any field in the record is not valid or if the record is not valid. It does not collect the errors for all fields in a record\n private async insertRecord(record: Record<string, any>, mapping: ImportMapping[], modelMetadataWithFields: ModelMetadata, modelService: CRUDService<any>): Promise<any> {\n // Convert the imported record to a DTO\n const dto = await this.convertImportedRecordToDto(record, mapping, modelMetadataWithFields);\n // Use the model service to create the record in the database\n const createdRecord = await modelService.create(dto, [], {}); //FIXME: Need to handle this part alongwith the refactoring of the CRUDService for permissions\n return createdRecord; // Return the created record\n }\n\n private getModelService(modelSingularName: string): CRUDService<any> {\n // Get the model service for the model metadata name\n const modelServiceWrapper = this.introspectService.getProvider(`${classify(modelSingularName)}Service`);\n const modelService = modelServiceWrapper.instance as CRUDService<any>;\n if (!modelService) {\n throw new Error(`Model service for ${modelSingularName} not found.`);\n }\n return modelService;\n }\n\n private async convertImportedRecordToDto(record: Record<string, any>, mapping: ImportMapping[], modelMetadataWithFields: ModelMetadata) {\n // Create a new record object\n const dtoRecord: Record<string, any> = {};\n\n // Iterate through every cell in the record\n // Using the saved mapping, populate the dtoRecord w.r.t the record and fields\n for (const key in record) {\n const mappedField = mapping.find(m => m.header === key);\n if (mappedField) {\n // If the field is found in the mapping, get the field metadata from the model metadata\n const fieldMetadata = modelMetadataWithFields.fields.find(f => f.name === mappedField.fieldName);\n // const userKeyField = modelMetadataWithFields.fields.find(f => f.isUserKey === true); // Assuming userKey is a field in the model metadata\n if (fieldMetadata) {\n // If the field is found in the model metadata, set the value in the dtoRecord\n await this.populateDtoForACell(dtoRecord, fieldMetadata, record, key);\n } else {\n this.logger.warn(`Field ${mappedField.fieldName} not found in model metadata ${modelMetadataWithFields.singularName}`);\n }\n }\n }\n return dtoRecord;\n }\n\n private async populateDtoForACell(dtoRecord: Record<string, any>, fieldMetadata: FieldMetadata, record: Record<string, any>, key: string): Promise<Record<string, any>> {\n const fieldType = fieldMetadata.type;\n // const userKeyFieldName = userKeyField?.name || 'id'; // Default to 'id' if not found\n\n // TODO Move this logic to field crud managers i.e add a parse method to the field crud manager interface\n switch (fieldType) {\n case SolidFieldType.relation: {\n return await this.populateDtoForRelations(fieldMetadata, record, key, dtoRecord);\n }\n case SolidFieldType.date:\n case SolidFieldType.datetime: return this.populateDtoForDate(record, key, fieldMetadata, dtoRecord);\n case SolidFieldType.int:\n case SolidFieldType.bigint:\n case SolidFieldType.decimal:\n return this.populateDtoForNumber(dtoRecord, fieldMetadata, record, key);\n case SolidFieldType.boolean:\n return this.populateDtoForBoolean(dtoRecord, fieldMetadata, record, key);\n default:\n dtoRecord[fieldMetadata.name] = record[key];\n return dtoRecord;\n }\n }\n\n private populateDtoForBoolean(dtoRecord: Record<string, any>, fieldMetadata: FieldMetadata, record: Record<string, any>, key: string) {\n const booleanValue = Boolean(record[key]);\n if (typeof booleanValue !== 'boolean') {\n throw new Error(`Invalid boolean value for cell ${key} with value ${record[key]}`);\n }\n dtoRecord[fieldMetadata.name] = booleanValue;\n return dtoRecord;\n }\n\n private populateDtoForNumber(dtoRecord: Record<string, any>, fieldMetadata: FieldMetadata, record: Record<string, any>, key: string) {\n const numberValue = Number(record[key]);\n if (isNaN(numberValue)) {\n throw new Error(`Invalid number value for cell ${key} with value ${record[key]}`);\n }\n dtoRecord[fieldMetadata.name] = numberValue;\n return dtoRecord;\n }\n\n private populateDtoForDate(record: Record<string, any>, key: string, fieldMetadata: FieldMetadata, dtoRecord: Record<string, any>) {\n {\n const dateValue = new Date(record[key]);\n if (isNaN(dateValue.getTime())) {\n throw new Error(`Invalid date value for cell ${key} with value ${record[key]}`);\n }\n dtoRecord[fieldMetadata.name] = dateValue;\n return dtoRecord;\n }\n }\n\n private async populateDtoForRelations(fieldMetadata: FieldMetadata, record: Record<string, any>, key: string, dtoRecord: Record<string, any>) {\n if (!fieldMetadata.relationCoModelSingularName) {\n throw new Error(`Relation coModelSingularName is not defined for relation field ${fieldMetadata.name}`);\n }\n\n const relatedRecordsIds = await this.getRelatedEntityIdsFromUserKeys(fieldMetadata, record, key);\n if (relatedRecordsIds.length === 0) {\n return dtoRecord; // If no related records found, return the dtoRecord as is\n }\n\n if (fieldMetadata.relationType === RelationType.manyTomany || fieldMetadata.relationType === RelationType.oneToMany) {\n dtoRecord[`${fieldMetadata.name}Ids`] = relatedRecordsIds;\n dtoRecord[`${fieldMetadata.name}Command`] = RelationFieldsCommand.set; // Reset the relation field association with the related records IDs\n }\n else if (fieldMetadata.relationType === RelationType.manyToOne) {\n dtoRecord[`${fieldMetadata.name}Id`] = relatedRecordsIds.pop(); // For many-to-one relations, we need only one ID\n }\n return dtoRecord;\n }\n\n private async getRelatedEntityIdsFromUserKeys(fieldMetadata: FieldMetadata, record: Record<string, any>, key: string): Promise<Array<number>> {\n // For many-to-many or one-to-many relations, we expect the record cell to contains a comma-separated list of userKeys\n const relationUserKeys = record[key] ? String(record[key]).split(',').map((userKey: string) => userKey.trim()) : [];\n if (relationUserKeys.length === 0) return [];\n\n const coModelService = this.getModelService(fieldMetadata.relationCoModelSingularName);\n const coModelWithUserKeyField = await this.modelMetadataService.findOneBySingularName(fieldMetadata.relationCoModelSingularName, ['userKeyField']);\n const coModelUserKeyFieldName = coModelWithUserKeyField?.userKeyField?.name || 'id'; // Default to 'id' if not found\n\n\n // Set the relation basic filter dto filters with the userkeys and call the find method of the model service to get the related records\n const relationFilterDto = {\n filters: {\n [coModelUserKeyFieldName]: {\n $in: relationUserKeys, // Use the userKeyFieldName to filter by userKeys\n },\n },\n };\n\n // From the userKeys, we will get the IDs of the related records using the userKeyFieldName and throw an error if any of the userKeys is not found\n const relatedRecordsResult = await coModelService.find(relationFilterDto);\n if (!relatedRecordsResult || !relatedRecordsResult.records || relatedRecordsResult.records.length === 0 || relatedRecordsResult.records.length !== relationUserKeys.length) {\n throw new Error(`Invalid related records userKey values found for cell ${key} with value ${record[key]}`);\n }\n const relatedRecordsIds = relatedRecordsResult.records.map(record => record.id);\n return relatedRecordsIds;\n }\n}"]}
|