@punks/backend-entity-manager 0.0.91 → 0.0.93

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/cjs/index.js +108 -13
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/__test__/entity/foo.d.ts +1 -1
  4. package/dist/cjs/types/__test__/providers/typeorm/entity/foo.d.ts +1 -1
  5. package/dist/cjs/types/abstractions/configuration.d.ts +1 -1
  6. package/dist/cjs/types/abstractions/import.d.ts +2 -0
  7. package/dist/cjs/types/abstractions/serializer.d.ts +7 -2
  8. package/dist/cjs/types/base/serializer.d.ts +7 -3
  9. package/dist/cjs/types/commands/import.d.ts +5 -0
  10. package/dist/cjs/types/platforms/nest/__test__/server/app/appCompanies/appCompany.serializer.d.ts +1 -1
  11. package/dist/cjs/types/platforms/nest/__test__/server/app/appDivisions/appDivision.serializer.d.ts +1 -1
  12. package/dist/cjs/types/platforms/nest/__test__/server/app/appOrganizations/appOrganization.serializer.d.ts +1 -1
  13. package/dist/cjs/types/platforms/nest/__test__/server/app/appRoles/appRole.serializer.d.ts +1 -1
  14. package/dist/cjs/types/platforms/nest/__test__/server/app/appTenants/appTenant.serializer.d.ts +1 -1
  15. package/dist/cjs/types/platforms/nest/__test__/server/app/appUserGroupMembers/appUserGroupMember.serializer.d.ts +1 -1
  16. package/dist/cjs/types/platforms/nest/__test__/server/app/appUserGroups/appUserGroup.serializer.d.ts +1 -1
  17. package/dist/cjs/types/platforms/nest/__test__/server/app/appUserProfiles/appUserProfile.serializer.d.ts +1 -1
  18. package/dist/cjs/types/platforms/nest/__test__/server/app/appUserRoles/appUserRole.serializer.d.ts +1 -1
  19. package/dist/cjs/types/platforms/nest/__test__/server/app/appUsers/appUser.serializer.d.ts +1 -1
  20. package/dist/cjs/types/platforms/nest/__test__/server/entities/foos/foo.serializer.d.ts +1 -1
  21. package/dist/cjs/types/platforms/nest/base/entityActions.d.ts +1 -1
  22. package/dist/cjs/types/platforms/nest/base/entityManager.d.ts +1 -1
  23. package/dist/cjs/types/platforms/nest/base/entitySerializer.d.ts +1 -1
  24. package/dist/cjs/types/providers/services.d.ts +3 -3
  25. package/dist/esm/index.js +109 -14
  26. package/dist/esm/index.js.map +1 -1
  27. package/dist/esm/types/__test__/entity/foo.d.ts +1 -1
  28. package/dist/esm/types/__test__/providers/typeorm/entity/foo.d.ts +1 -1
  29. package/dist/esm/types/abstractions/configuration.d.ts +1 -1
  30. package/dist/esm/types/abstractions/import.d.ts +2 -0
  31. package/dist/esm/types/abstractions/serializer.d.ts +7 -2
  32. package/dist/esm/types/base/serializer.d.ts +7 -3
  33. package/dist/esm/types/commands/import.d.ts +5 -0
  34. package/dist/esm/types/platforms/nest/__test__/server/app/appCompanies/appCompany.serializer.d.ts +1 -1
  35. package/dist/esm/types/platforms/nest/__test__/server/app/appDivisions/appDivision.serializer.d.ts +1 -1
  36. package/dist/esm/types/platforms/nest/__test__/server/app/appOrganizations/appOrganization.serializer.d.ts +1 -1
  37. package/dist/esm/types/platforms/nest/__test__/server/app/appRoles/appRole.serializer.d.ts +1 -1
  38. package/dist/esm/types/platforms/nest/__test__/server/app/appTenants/appTenant.serializer.d.ts +1 -1
  39. package/dist/esm/types/platforms/nest/__test__/server/app/appUserGroupMembers/appUserGroupMember.serializer.d.ts +1 -1
  40. package/dist/esm/types/platforms/nest/__test__/server/app/appUserGroups/appUserGroup.serializer.d.ts +1 -1
  41. package/dist/esm/types/platforms/nest/__test__/server/app/appUserProfiles/appUserProfile.serializer.d.ts +1 -1
  42. package/dist/esm/types/platforms/nest/__test__/server/app/appUserRoles/appUserRole.serializer.d.ts +1 -1
  43. package/dist/esm/types/platforms/nest/__test__/server/app/appUsers/appUser.serializer.d.ts +1 -1
  44. package/dist/esm/types/platforms/nest/__test__/server/entities/foos/foo.serializer.d.ts +1 -1
  45. package/dist/esm/types/platforms/nest/base/entityActions.d.ts +1 -1
  46. package/dist/esm/types/platforms/nest/base/entityManager.d.ts +1 -1
  47. package/dist/esm/types/platforms/nest/base/entitySerializer.d.ts +1 -1
  48. package/dist/esm/types/providers/services.d.ts +3 -3
  49. package/dist/index.d.ts +22 -11
  50. package/package.json +3 -3
@@ -67,7 +67,7 @@ export interface FooUpdateDto {
67
67
  age: number;
68
68
  };
69
69
  }
70
- export declare class FooSerializer extends EntitySerializer<FooEntity> {
70
+ export declare class FooSerializer extends EntitySerializer<FooEntity, string> {
71
71
  constructor(entityName: string);
72
72
  protected getDefinition(): EntitySerializerSheetDefinition<FooEntity>;
73
73
  }
@@ -81,7 +81,7 @@ export declare class FooConverter implements IEntityConverter<FooEntity, FooDto,
81
81
  createDtoToEntity(input: FooCreateInput): Partial<FooEntity>;
82
82
  updateDtoToEntity(input: FooUpdateInput): Partial<FooEntity>;
83
83
  }
84
- export declare class FooSerializer extends EntitySerializer<FooEntity> {
84
+ export declare class FooSerializer extends EntitySerializer<FooEntity, string> {
85
85
  protected getDefinition(): EntitySerializerSheetDefinition<FooEntity>;
86
86
  }
87
87
  export declare const registerFooTypeOrmEntity: (container: IEntityManagerServiceRoot, dataSource: DataSource, options?: {
@@ -30,7 +30,7 @@ export interface IEntityManagerServiceRoot {
30
30
  export interface IEntityManagerServiceCollection<TEntity, TEntityId> {
31
31
  getServiceLocator(): EntityServiceLocator<TEntity, TEntityId>;
32
32
  mapCrudOperations<TEntitySearchParameters extends IEntitySearchParameters<TSorting, TCursor>, TSorting extends SortingType, TCursor, TFacets extends IEntityFacets, TEntitiesQueryBuilder extends IEntitiesQueryBuilder<TEntity, TEntitySearchParameters, TSorting, TCursor, TFacets, unknown>>(input: EntitiesMapOperationsInput<TEntitiesQueryBuilder>): IEntityManagerServiceCollection<TEntity, TEntityId>;
33
- addSerializer<TEntitySerializer extends IEntitySerializer<TEntity>>(serializer: TEntitySerializer): IEntityManagerServiceCollection<TEntity, TEntityId>;
33
+ addSerializer<TEntitySerializer extends IEntitySerializer<TEntity, TEntityId>>(serializer: TEntitySerializer): IEntityManagerServiceCollection<TEntity, TEntityId>;
34
34
  addConverter<TEntityDto, TListItemDto, TEntityCreateInput, TEntityUpdateInput, TEntityConverter extends IEntityConverter<TEntity, TEntityDto, TListItemDto, TEntityCreateInput, TEntityUpdateInput>>(converter: TEntityConverter): IEntityManagerServiceCollection<TEntity, TEntityId>;
35
35
  addAdapter<TEntityCreateData, TEntityUpdateData, TEntityAdapter extends IEntityAdapter<TEntity, TEntityCreateData, TEntityUpdateData>>(adapter: TEntityAdapter): IEntityManagerServiceCollection<TEntity, TEntityId>;
36
36
  addAuthorization<TEntityAuthorizationMiddleware extends IEntityAuthorizationMiddleware<TEntity, TAuthenticationContext, TUserContext>, TAuthenticationContext extends IAuthenticationContext<TUserContext>, TUserContext>({ middleware, }: {
@@ -2,7 +2,9 @@
2
2
  import { EntitySerializationFormat } from "./serializer";
3
3
  export type EntitiesImportInput = {
4
4
  format: EntitySerializationFormat;
5
+ fileName: string;
5
6
  content: Buffer;
7
+ contentType: string;
6
8
  };
7
9
  export type EntitiesImportStatistics = {
8
10
  importedCount: number;
@@ -6,6 +6,7 @@ export type EntitySerializerColumnDefinition<TEntity> = {
6
6
  sampleValue?: any;
7
7
  parser?: (value: any) => any;
8
8
  converter?: (value: any, item: TEntity) => any;
9
+ idColumn?: boolean;
9
10
  };
10
11
  export type EntitySerializerSheetDefinition<TEntity> = {
11
12
  columns: EntitySerializerColumnDefinition<TEntity>[];
@@ -20,8 +21,12 @@ export declare enum EntitySerializationFormat {
20
21
  Json = "json",
21
22
  Xlsx = "xlsx"
22
23
  }
23
- export interface IEntitySerializer<TEntity> {
24
+ export type ImportEntry<TEntity, TEntityId> = {
25
+ id?: TEntityId;
26
+ item: TEntity;
27
+ };
28
+ export interface IEntitySerializer<TEntity, TEntityId> {
24
29
  serialize(data: TEntity[], format: EntitySerializationFormat): Promise<EntityExportFile>;
25
- parse(data: Buffer, format: EntitySerializationFormat): Promise<TEntity[]>;
30
+ parse(data: Buffer, format: EntitySerializationFormat): Promise<ImportEntry<TEntity, TEntityId>[]>;
26
31
  createSample(format: EntitySerializationFormat): Promise<EntityExportFile>;
27
32
  }
@@ -1,10 +1,14 @@
1
1
  /// <reference types="node" />
2
2
  import { EntitySerializationFormat, IEntitySerializer } from "../abstractions";
3
- import { EntityExportFile, EntitySerializerSheetDefinition } from "../abstractions/serializer";
4
- export declare abstract class EntitySerializer<TEntity> implements IEntitySerializer<TEntity> {
3
+ import { EntityExportFile, EntitySerializerSheetDefinition, ImportEntry } from "../abstractions/serializer";
4
+ export declare abstract class EntitySerializer<TEntity, TEntityId> implements IEntitySerializer<TEntity, TEntityId> {
5
5
  protected readonly entityName: string;
6
6
  constructor(entityName: string);
7
- parse(data: Buffer, format: EntitySerializationFormat): Promise<TEntity[]>;
7
+ parse(data: Buffer, format: EntitySerializationFormat): Promise<ImportEntry<TEntity, TEntityId>[]>;
8
+ private parseCsv;
9
+ private parseXlsx;
10
+ private convertSheetRecord;
11
+ private parseColumnValue;
8
12
  createSample(format: EntitySerializationFormat): Promise<EntityExportFile>;
9
13
  private buildSampleFile;
10
14
  serialize(data: TEntity[], format: EntitySerializationFormat): Promise<EntityExportFile>;
@@ -7,4 +7,9 @@ export declare class EntitiesImportCommand<TEntity> implements IEntitiesImportCo
7
7
  private readonly settings;
8
8
  constructor(services: EntityServiceLocator<TEntity, unknown>, settings: EntitiesImportExportSettings);
9
9
  execute(input: EntitiesImportInput): Promise<EntitiesImportResult>;
10
+ private importEntity;
11
+ private parseImportFile;
12
+ private uploadImportFile;
13
+ private buildAbsoluteBucketPath;
14
+ private get bucket();
10
15
  }
@@ -1,6 +1,6 @@
1
1
  import { NestEntitySerializer } from "../../../../base";
2
2
  import { EntitySerializerSheetDefinition } from "../../../../../../abstractions";
3
3
  import { AppCompanyEntity } from "../../database/core/entities/appCompany.entity";
4
- export declare class AppCompanySerializer extends NestEntitySerializer<AppCompanyEntity> {
4
+ export declare class AppCompanySerializer extends NestEntitySerializer<AppCompanyEntity, string> {
5
5
  protected getDefinition(): EntitySerializerSheetDefinition<AppCompanyEntity>;
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { NestEntitySerializer } from "../../../../base";
2
2
  import { EntitySerializerSheetDefinition } from "../../../../../../abstractions";
3
3
  import { AppDivisionEntity } from "../../database/core/entities/appDivision.entity";
4
- export declare class AppDivisionSerializer extends NestEntitySerializer<AppDivisionEntity> {
4
+ export declare class AppDivisionSerializer extends NestEntitySerializer<AppDivisionEntity, string> {
5
5
  protected getDefinition(): EntitySerializerSheetDefinition<AppDivisionEntity>;
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { NestEntitySerializer } from "../../../../base";
2
2
  import { EntitySerializerSheetDefinition } from "../../../../../../abstractions";
3
3
  import { AppOrganizationEntity } from "../../database/core/entities/appOrganization.entity";
4
- export declare class AppOrganizationSerializer extends NestEntitySerializer<AppOrganizationEntity> {
4
+ export declare class AppOrganizationSerializer extends NestEntitySerializer<AppOrganizationEntity, string> {
5
5
  protected getDefinition(): EntitySerializerSheetDefinition<AppOrganizationEntity>;
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { NestEntitySerializer } from "../../../../base";
2
2
  import { EntitySerializerSheetDefinition } from "../../../../../../abstractions";
3
3
  import { AppRoleEntity } from "../../database/core/entities/appRole.entity";
4
- export declare class AppRoleSerializer extends NestEntitySerializer<AppRoleEntity> {
4
+ export declare class AppRoleSerializer extends NestEntitySerializer<AppRoleEntity, string> {
5
5
  protected getDefinition(): EntitySerializerSheetDefinition<AppRoleEntity>;
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { NestEntitySerializer } from "../../../../base";
2
2
  import { EntitySerializerSheetDefinition } from "../../../../../../abstractions";
3
3
  import { AppTenantEntity } from "../../database/core/entities/appTenant.entity";
4
- export declare class AppTenantSerializer extends NestEntitySerializer<AppTenantEntity> {
4
+ export declare class AppTenantSerializer extends NestEntitySerializer<AppTenantEntity, string> {
5
5
  protected getDefinition(): EntitySerializerSheetDefinition<AppTenantEntity>;
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { NestEntitySerializer } from "../../../../base";
2
2
  import { EntitySerializerSheetDefinition } from "../../../../../../abstractions";
3
3
  import { AppUserGroupMemberEntity } from "../../database/core/entities/appUserGroupMember.entity";
4
- export declare class AppUserGroupMemberSerializer extends NestEntitySerializer<AppUserGroupMemberEntity> {
4
+ export declare class AppUserGroupMemberSerializer extends NestEntitySerializer<AppUserGroupMemberEntity, string> {
5
5
  protected getDefinition(): EntitySerializerSheetDefinition<AppUserGroupMemberEntity>;
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { NestEntitySerializer } from "../../../../base";
2
2
  import { EntitySerializerSheetDefinition } from "../../../../../../abstractions";
3
3
  import { AppUserGroupEntity } from "../../database/core/entities/appUserGroup.entity";
4
- export declare class AppUserGroupSerializer extends NestEntitySerializer<AppUserGroupEntity> {
4
+ export declare class AppUserGroupSerializer extends NestEntitySerializer<AppUserGroupEntity, string> {
5
5
  protected getDefinition(): EntitySerializerSheetDefinition<AppUserGroupEntity>;
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { NestEntitySerializer } from "../../../../base";
2
2
  import { EntitySerializerSheetDefinition } from "../../../../../../abstractions";
3
3
  import { AppUserProfileEntity } from "../../database/core/entities/appUserProfile.entity";
4
- export declare class AppUserProfileSerializer extends NestEntitySerializer<AppUserProfileEntity> {
4
+ export declare class AppUserProfileSerializer extends NestEntitySerializer<AppUserProfileEntity, string> {
5
5
  protected getDefinition(): EntitySerializerSheetDefinition<AppUserProfileEntity>;
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { NestEntitySerializer } from "../../../../base";
2
2
  import { EntitySerializerSheetDefinition } from "../../../../../../abstractions";
3
3
  import { AppUserRoleEntity } from "../../database/core/entities/appUserRole.entity";
4
- export declare class AppUserRoleSerializer extends NestEntitySerializer<AppUserRoleEntity> {
4
+ export declare class AppUserRoleSerializer extends NestEntitySerializer<AppUserRoleEntity, string> {
5
5
  protected getDefinition(): EntitySerializerSheetDefinition<AppUserRoleEntity>;
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { NestEntitySerializer } from "../../../../base";
2
2
  import { EntitySerializerSheetDefinition } from "../../../../../../abstractions";
3
3
  import { AppUserEntity } from "../../database/core/entities/appUser.entity";
4
- export declare class AppUserSerializer extends NestEntitySerializer<AppUserEntity> {
4
+ export declare class AppUserSerializer extends NestEntitySerializer<AppUserEntity, string> {
5
5
  protected getDefinition(): EntitySerializerSheetDefinition<AppUserEntity>;
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { EntityManagerRegistry, EntitySerializerSheetDefinition, NestEntitySerializer } from "../../../../../..";
2
2
  import { FooEntity } from "../../database/core/entities/foo.entity";
3
- export declare class FooSerializer extends NestEntitySerializer<FooEntity> {
3
+ export declare class FooSerializer extends NestEntitySerializer<FooEntity, string> {
4
4
  constructor(registry: EntityManagerRegistry);
5
5
  protected getDefinition(): EntitySerializerSheetDefinition<FooEntity>;
6
6
  }
@@ -3,7 +3,7 @@ import { IEntitiesDeleteParameters } from "../../../abstractions/commands";
3
3
  import { EntityServiceLocator } from "../../../providers/services";
4
4
  import { EntityManagerRegistry } from "../ioc";
5
5
  export declare abstract class NestEntityActions<TEntity, TEntityId, TEntityCreateDto, TEntityUpdateDto, TEntityDto, TEntityListItemDto, TEntitiesDeleteParameters extends IEntitiesDeleteParameters<TSorting>, TEntitySearchParameters extends IEntitySearchParameters<TSorting, TCursor>, TSorting extends SortingType, TCursor, TFacets extends IEntityFacets> {
6
- protected readonly services: EntityServiceLocator<TEntity, TEntityId>;
6
+ protected readonly services: EntityServiceLocator<TEntity, unknown>;
7
7
  private actionsInstance;
8
8
  constructor(entityName: string, registry: EntityManagerRegistry);
9
9
  get manager(): IEntityActions<TEntity, TEntityId, TEntityCreateDto, TEntityUpdateDto, TEntityDto, TEntityListItemDto, TEntitiesDeleteParameters, TEntitySearchParameters, TSorting, TCursor, TFacets>;
@@ -3,7 +3,7 @@ import { IEntitiesDeleteParameters } from "../../../abstractions/commands";
3
3
  import { EntityServiceLocator } from "../../../providers/services";
4
4
  import { EntityManagerRegistry } from "../ioc/registry";
5
5
  export declare abstract class NestEntityManager<TEntity, TEntityId, TEntityCreateData, TEntityUpdateData, TEntitiesDeleteParameters extends IEntitiesDeleteParameters<TSorting>, TEntitySearchParameters extends IEntitySearchParameters<TSorting, TCursor>, TSorting extends SortingType, TCursor, TFacets extends IEntityFacets> {
6
- protected readonly services: EntityServiceLocator<TEntity, TEntityId>;
6
+ protected readonly services: EntityServiceLocator<TEntity, unknown>;
7
7
  private managerInstance;
8
8
  constructor(entityName: string, registry: EntityManagerRegistry);
9
9
  get manager(): IEntityManager<TEntity, TEntityId, TEntityCreateData, TEntityUpdateData, TEntitiesDeleteParameters, TEntitySearchParameters, TSorting, TCursor, TFacets>;
@@ -1,7 +1,7 @@
1
1
  import { EntitySerializer } from "../../../base/serializer";
2
2
  import { EntityServiceLocator } from "../../../providers/services";
3
3
  import { EntityManagerRegistry } from "../ioc";
4
- export declare abstract class NestEntitySerializer<TEntity> extends EntitySerializer<TEntity> {
4
+ export declare abstract class NestEntitySerializer<TEntity, TEntityId> extends EntitySerializer<TEntity, TEntityId> {
5
5
  protected readonly services: EntityServiceLocator<TEntity, unknown>;
6
6
  constructor(entityName: string, registry: EntityManagerRegistry);
7
7
  }
@@ -31,7 +31,7 @@ export declare class EntityServiceLocator<TEntity, TEntityId> {
31
31
  resolveConnectorDeleteManager<TEntityId>(): IEntityConnectorDeleteManager<TEntity, TEntityId>;
32
32
  resolveConnectorsConfiguration(): IConnectorsConfiguration<TEntity>;
33
33
  resolveConverter<TEntityDto, TListItemDto, TEntityCreateDto, TEntityUpdateDto>(): IEntityConverter<TEntity, TEntityDto, TListItemDto, TEntityCreateDto, TEntityUpdateDto> | undefined;
34
- resolveSerializer(): IEntitySerializer<TEntity>;
34
+ resolveSerializer(): IEntitySerializer<TEntity, TEntityId>;
35
35
  resolveAdapter<TEntityCreateData, TEntityUpdateData>(): IEntityAdapter<TEntity, TEntityCreateData, TEntityUpdateData> | undefined;
36
36
  resolveAuthorizationMiddleware<TAuthenticationContext extends IAuthenticationContext<TUserContext>, TUserContext>(): IEntityAuthorizationMiddleware<TEntity, TAuthenticationContext, TUserContext> | undefined;
37
37
  resolveGetQuery<TEntityId>(): IEntityGetQuery<TEntity, TEntityId>;
@@ -103,8 +103,8 @@ export declare class EntitiesServiceLocator {
103
103
  resolveAdapter<TEntity, TEntityCreateData, TEntityUpdateData>(entityName: string): IEntityAdapter<TEntity, TEntityCreateData, TEntityUpdateData> | undefined;
104
104
  registerConverter<TEntity, TEntityDto, TListItemDto, TEntityCreateDto, TEntityUpdateDto>(entityName: string, instance: IEntityConverter<TEntity, TEntityDto, TListItemDto, TEntityCreateDto, TEntityUpdateDto>): void;
105
105
  resolveConverter<TEntity, TEntityDto, TListItemDto, TEntityCreateDto, TEntityUpdateDto>(entityName: string): IEntityConverter<TEntity, TEntityDto, TListItemDto, TEntityCreateDto, TEntityUpdateDto> | undefined;
106
- registerSerializer<TEntity>(entityName: string, instance: IEntitySerializer<TEntity>): void;
107
- resolveSerializer<TEntity>(entityName: string): IEntitySerializer<TEntity>;
106
+ registerSerializer<TEntity, TEntityId>(entityName: string, instance: IEntitySerializer<TEntity, TEntityId>): void;
107
+ resolveSerializer<TEntity, TEntityId>(entityName: string): IEntitySerializer<TEntity, TEntityId>;
108
108
  resolveAuthorizationMiddleware<TEntity, TAuthenticationContext extends IAuthenticationContext<TUserContext>, TUserContext>(entityName: string): IEntityAuthorizationMiddleware<TEntity, TAuthenticationContext, TUserContext> | undefined;
109
109
  registerAuthorizationMiddleware<TEntity, TAuthenticationContext extends IAuthenticationContext<TUserContext>, TUserContext>(entityName: string, instance: IEntityAuthorizationMiddleware<TEntity, TAuthenticationContext, TUserContext>): void;
110
110
  resolveGetQuery<TEntity, TEntityId>(entityName: string): IEntityGetQuery<TEntity, TEntityId>;
package/dist/esm/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Log, excelBuild, csvBuild, isNullOrUndefined, sort, byField, toDict, newUuid as newUuid$1, ensureTailingSlash, removeUndefinedProps } from '@punks/backend-core';
1
+ import { Log, csvParse, excelParse, excelBuild, csvBuild, isNullOrUndefined, sort, byField, toDict, newUuid as newUuid$1, ensureTailingSlash, removeUndefinedProps } from '@punks/backend-core';
2
2
  import { applyDecorators, Injectable, SetMetadata, Global, Module, Scope, Logger, StreamableFile, HttpException, HttpStatus } from '@nestjs/common';
3
3
  import { ApiProperty } from '@nestjs/swagger';
4
4
  import { Reflector } from '@nestjs/core';
@@ -120,12 +120,47 @@ class EntitySeeder {
120
120
  }
121
121
  }
122
122
 
123
+ const DEFAULT_DELIMITER = ";";
123
124
  class EntitySerializer {
124
125
  constructor(entityName) {
125
126
  this.entityName = entityName;
126
127
  }
127
128
  async parse(data, format) {
128
- throw new Error("Method not implemented.");
129
+ switch (format) {
130
+ case EntitySerializationFormat.Csv:
131
+ return this.parseCsv(data);
132
+ case EntitySerializationFormat.Xlsx:
133
+ return this.parseXlsx(data);
134
+ default:
135
+ throw new Error(`Format ${format} not supported`);
136
+ }
137
+ }
138
+ parseCsv(data) {
139
+ const records = csvParse(data, DEFAULT_DELIMITER);
140
+ return records.map((x) => this.convertSheetRecord(x));
141
+ }
142
+ parseXlsx(data) {
143
+ const records = excelParse(data);
144
+ return records.map((x) => this.convertSheetRecord(x));
145
+ }
146
+ convertSheetRecord(record) {
147
+ if (!record._type || record._type !== this.entityName) {
148
+ throw new Error(`Invalid record type ${record._type}`);
149
+ }
150
+ const definition = this.getDefinition();
151
+ const entity = {};
152
+ for (const column of definition.columns) {
153
+ entity[column.selector] = this.parseColumnValue(record, column);
154
+ }
155
+ const idField = definition.columns.find((x) => x.idColumn || x.selector === "id");
156
+ return {
157
+ id: idField ? entity[idField.selector] : undefined,
158
+ item: entity,
159
+ };
160
+ }
161
+ parseColumnValue(row, definition) {
162
+ const rawValue = row[definition.name];
163
+ return definition.parser ? definition.parser(rawValue) : rawValue;
129
164
  }
130
165
  async createSample(format) {
131
166
  return await this.buildSampleFile(format);
@@ -149,7 +184,9 @@ class EntitySerializer {
149
184
  name: c.name,
150
185
  value: () => c.sampleValue ?? "",
151
186
  })),
152
- ]), "utf-8"),
187
+ ], {
188
+ delimiter: DEFAULT_DELIMITER,
189
+ }), "utf-8"),
153
190
  };
154
191
  case EntitySerializationFormat.Xlsx:
155
192
  return {
@@ -188,10 +225,18 @@ class EntitySerializer {
188
225
  return {
189
226
  fileName,
190
227
  contentType: "text/csv",
191
- content: Buffer.from(csvBuild(data, this.getDefinition().columns.map((c) => ({
192
- name: c.name,
193
- value: (item) => this.getColumnValue(item, c),
194
- }))), "utf-8"),
228
+ content: Buffer.from(csvBuild(data, [
229
+ {
230
+ name: "_type",
231
+ value: () => this.entityName,
232
+ },
233
+ ...this.getDefinition().columns.map((c) => ({
234
+ name: c.name,
235
+ value: (item) => this.getColumnValue(item, c),
236
+ })),
237
+ ], {
238
+ delimiter: DEFAULT_DELIMITER,
239
+ }), "utf-8"),
195
240
  };
196
241
  case EntitySerializationFormat.Xlsx:
197
242
  return {
@@ -200,11 +245,17 @@ class EntitySerializer {
200
245
  content: Buffer.from(excelBuild({
201
246
  data,
202
247
  sheetName: this.entityName,
203
- columns: this.getDefinition().columns.map((c) => ({
204
- header: c.name,
205
- value: (item) => this.getColumnValue(item, c),
206
- headerSize: c.colSpan,
207
- })),
248
+ columns: [
249
+ {
250
+ header: "_type",
251
+ value: () => this.entityName,
252
+ },
253
+ ...this.getDefinition().columns.map((c) => ({
254
+ header: c.name,
255
+ value: (item) => this.getColumnValue(item, c),
256
+ headerSize: c.colSpan,
257
+ })),
258
+ ],
208
259
  })),
209
260
  };
210
261
  case EntitySerializationFormat.Json:
@@ -943,8 +994,52 @@ class EntitiesImportCommand {
943
994
  this.services = services;
944
995
  this.settings = settings;
945
996
  }
946
- execute(input) {
947
- throw new Error("Method not implemented.");
997
+ async execute(input) {
998
+ await this.uploadImportFile({
999
+ content: input.content,
1000
+ contentType: input.contentType,
1001
+ fileName: input.fileName,
1002
+ });
1003
+ const importEntities = await this.parseImportFile(input.content, input.format);
1004
+ for (const entry of importEntities) {
1005
+ await this.importEntity(entry);
1006
+ }
1007
+ return {
1008
+ statistics: {
1009
+ importedCount: importEntities.length,
1010
+ createdCount: 0,
1011
+ unchangedCount: 0,
1012
+ updatedCount: 0,
1013
+ },
1014
+ };
1015
+ }
1016
+ async importEntity(entry) {
1017
+ try {
1018
+ if (!entry.id) {
1019
+ return this.services.resolveCreateCommand().execute(entry.item);
1020
+ }
1021
+ return this.services.resolveUpsertCommand().execute(entry.id, entry.item);
1022
+ }
1023
+ catch (error) {
1024
+ throw new Error(`Error importing entry with id ${entry.id}`);
1025
+ }
1026
+ }
1027
+ async parseImportFile(content, format) {
1028
+ return await this.services.resolveSerializer().parse(content, format);
1029
+ }
1030
+ async uploadImportFile(file) {
1031
+ await this.bucket.fileUpload({
1032
+ bucket: this.settings.exportBucket.bucket,
1033
+ filePath: this.buildAbsoluteBucketPath(file.fileName),
1034
+ content: file.content,
1035
+ contentType: file.contentType,
1036
+ });
1037
+ }
1038
+ buildAbsoluteBucketPath(relativePath) {
1039
+ return `${this.settings.exportBucket.rootFolderPath ?? ""}/imports/${createDayPath(new Date())}/${relativePath}`;
1040
+ }
1041
+ get bucket() {
1042
+ return this.services.getRootServices().resolveBucketProvider();
948
1043
  }
949
1044
  }
950
1045