rez_core 1.0.47 → 1.0.48

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 (99) hide show
  1. package/dist/constant/global.constant.d.ts +2 -0
  2. package/dist/constant/global.constant.js +3 -1
  3. package/dist/constant/global.constant.js.map +1 -1
  4. package/dist/module/auth/guards/role.guard.js +3 -3
  5. package/dist/module/master/service/master.service.d.ts +7 -1
  6. package/dist/module/master/service/master.service.js +58 -3
  7. package/dist/module/master/service/master.service.js.map +1 -1
  8. package/dist/module/meta/controller/media.controller.d.ts +1 -0
  9. package/dist/module/meta/controller/media.controller.js +27 -0
  10. package/dist/module/meta/controller/media.controller.js.map +1 -1
  11. package/dist/module/meta/entity/field-group.entity.d.ts +9 -0
  12. package/dist/module/meta/entity/field-group.entity.js +47 -0
  13. package/dist/module/meta/entity/field-group.entity.js.map +1 -0
  14. package/dist/module/meta/entity/school.entity.d.ts +8 -0
  15. package/dist/module/meta/entity/school.entity.js +44 -0
  16. package/dist/module/meta/entity/school.entity.js.map +1 -0
  17. package/dist/module/meta/entity/schoolAddress.entity.d.ts +9 -0
  18. package/dist/module/meta/entity/schoolAddress.entity.js +48 -0
  19. package/dist/module/meta/entity/schoolAddress.entity.js.map +1 -0
  20. package/dist/module/meta/entity/section-master.entity.d.ts +10 -0
  21. package/dist/module/meta/entity/section-master.entity.js +51 -0
  22. package/dist/module/meta/entity/section-master.entity.js.map +1 -0
  23. package/dist/module/meta/entity.module.js +19 -0
  24. package/dist/module/meta/entity.module.js.map +1 -1
  25. package/dist/module/meta/repository/attribute-master.repository.d.ts +1 -0
  26. package/dist/module/meta/repository/attribute-master.repository.js +7 -0
  27. package/dist/module/meta/repository/attribute-master.repository.js.map +1 -1
  28. package/dist/module/meta/service/attribute-master.service.d.ts +6 -0
  29. package/dist/module/meta/service/attribute-master.service.js +28 -0
  30. package/dist/module/meta/service/attribute-master.service.js.map +1 -0
  31. package/dist/module/meta/service/entity-list.service.js +1 -1
  32. package/dist/module/meta/service/entity-list.service.js.map +1 -1
  33. package/dist/module/meta/service/entity-master.service.d.ts +1 -0
  34. package/dist/module/meta/service/entity-master.service.js +6 -0
  35. package/dist/module/meta/service/entity-master.service.js.map +1 -1
  36. package/dist/module/meta/service/field-group.service.d.ts +26 -0
  37. package/dist/module/meta/service/field-group.service.js +78 -0
  38. package/dist/module/meta/service/field-group.service.js.map +1 -0
  39. package/dist/module/meta/service/media-data.service.d.ts +1 -0
  40. package/dist/module/meta/service/media-data.service.js +15 -0
  41. package/dist/module/meta/service/media-data.service.js.map +1 -1
  42. package/dist/module/meta/service/section-master.service.d.ts +26 -0
  43. package/dist/module/meta/service/section-master.service.js +78 -0
  44. package/dist/module/meta/service/section-master.service.js.map +1 -0
  45. package/dist/module/meta/service/view-master.service.d.ts +5 -1
  46. package/dist/module/meta/service/view-master.service.js +32 -2
  47. package/dist/module/meta/service/view-master.service.js.map +1 -1
  48. package/dist/module/module/service/module-access.service.d.ts +3 -1
  49. package/dist/module/module/service/module-access.service.js +19 -3
  50. package/dist/module/module/service/module-access.service.js.map +1 -1
  51. package/dist/tsconfig.build.tsbuildinfo +1 -1
  52. package/package.json +1 -1
  53. package/src/constant/global.constant.ts +3 -1
  54. package/src/module/auth/guards/jwt.guard.ts +22 -22
  55. package/src/module/auth/guards/role.guard.ts +68 -68
  56. package/src/module/auth/services/jwt.service.ts +11 -11
  57. package/src/module/auth/strategies/local.strategy.ts +13 -13
  58. package/src/module/dev/dev.module.ts +12 -12
  59. package/src/module/dev/service/dev.service.ts +7 -7
  60. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  61. package/src/module/enterprise/entity/organization.entity.ts +80 -80
  62. package/src/module/master/service/master.service.ts +84 -3
  63. package/src/module/meta/controller/media.controller.ts +27 -1
  64. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  65. package/src/module/meta/entity/field-group.entity.ts +25 -0
  66. package/src/module/meta/entity/preference.entity.ts +65 -65
  67. package/src/module/meta/entity/school.entity.ts +23 -0
  68. package/src/module/meta/entity/schoolAddress.entity.ts +25 -0
  69. package/src/module/meta/entity/section-master.entity.ts +28 -0
  70. package/src/module/meta/entity.module.ts +19 -0
  71. package/src/module/meta/repository/attribute-master.repository.ts +11 -1
  72. package/src/module/meta/repository/preference.repository.ts +20 -20
  73. package/src/module/meta/service/attribute-master.service.ts +17 -0
  74. package/src/module/meta/service/entity-list.service.ts +1 -1
  75. package/src/module/meta/service/entity-master.service.ts +7 -0
  76. package/src/module/meta/service/field-group.service.ts +104 -0
  77. package/src/module/meta/service/media-data.service.ts +22 -9
  78. package/src/module/meta/service/section-master.service.ts +104 -0
  79. package/src/module/meta/service/view-master.service.ts +42 -4
  80. package/src/module/module/controller/menu.controller.ts +15 -15
  81. package/src/module/module/entity/module-access.entity.ts +22 -22
  82. package/src/module/module/entity/module-action.entity.ts +19 -19
  83. package/src/module/module/service/module-access.service.ts +32 -13
  84. package/src/module/user/controller/user.controller.ts +28 -28
  85. package/src/module/user/dto/update-user.dto.ts +4 -4
  86. package/src/module/user/entity/user-role-mapping.entity.ts +21 -21
  87. package/src/module/user/entity/user-session.entity.ts +61 -61
  88. package/src/module/user/repository/userSession.repository.ts +33 -33
  89. package/src/resources/dev.properties.yaml +2 -2
  90. package/src/utils/service/encryptUtil.service.ts +97 -97
  91. package/src/utils/service/excelUtil.service.ts +15 -15
  92. package/src/utils/service/reflection-helper.service.ts +53 -53
  93. package/.idea/250218_nodejs_core.iml +0 -12
  94. package/.idea/codeStyles/Project.xml +0 -59
  95. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  96. package/.idea/dataSources.xml +0 -12
  97. package/.idea/modules.xml +0 -8
  98. package/.idea/prettier.xml +0 -6
  99. package/.idea/vcs.xml +0 -6
@@ -4,17 +4,22 @@ import {
4
4
  HttpStatus,
5
5
  Post,
6
6
  Res,
7
+ Get,
8
+ Param,
7
9
  UseGuards,
8
10
  } from '@nestjs/common';
9
11
  import { MediaDataService } from '../service/media-data.service';
10
12
  import { JwtAuthGuard } from '../../auth/guards/jwt.guard';
11
- import { Response } from 'express';
13
+ import e, { Response } from 'express';
14
+ import { ENTITYTYPE_MEDIA } from 'src/constant/global.constant';
15
+ import { MediaData } from '../entity/media-data.entity';
12
16
 
13
17
  @Controller('media')
14
18
  // @UseGuards(JwtAuthGuard)
15
19
  export class MediaController {
16
20
  constructor(private readonly mediaDataService: MediaDataService) {}
17
21
 
22
+ // Method for initiating an upload
18
23
  @Post('initiate-upload')
19
24
  async initiateUpload(
20
25
  @Body()
@@ -42,4 +47,25 @@ export class MediaController {
42
47
  throw new Error('Something went wrong!');
43
48
  }
44
49
  }
50
+
51
+ // Method to fetch the download URL for a media file
52
+ @Get('download/:id')
53
+ async getDownloadUrl(@Param('id') id: number, @Res() res: Response) {
54
+ try {
55
+
56
+ const entityData = await this.mediaDataService.getEntityData(ENTITYTYPE_MEDIA, id);
57
+ let mediaData = entityData as MediaData;
58
+ const downloadUrl = await this.mediaDataService.getMediaDownloadUrl(mediaData.media_url);
59
+ res.status(HttpStatus.OK).json({
60
+ message: 'Download URL fetched successfully',
61
+ success: true,
62
+ data: { downloadUrl },
63
+ });
64
+ } catch (error) {
65
+ res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({
66
+ message: error.message || 'Error fetching download URL',
67
+ success: false,
68
+ });
69
+ }
70
+ }
45
71
  }
@@ -1,6 +1,6 @@
1
- import { EntityTab } from './entity-tab.dto';
2
-
3
- export class EntityListData {
4
- entity_list: any;
5
- entity_tabs: EntityTab[];
6
- }
1
+ import { EntityTab } from './entity-tab.dto';
2
+
3
+ export class EntityListData {
4
+ entity_list: any;
5
+ entity_tabs: EntityTab[];
6
+ }
@@ -0,0 +1,25 @@
1
+ import { ENTITYTYPE_FIELDMASTER } from 'src/constant/global.constant';
2
+ import { BaseEntity } from './base-entity.entity';
3
+ import { Column, Entity } from 'typeorm';
4
+
5
+ @Entity({ name: 'cr_field_group' })
6
+ export class FieldGroup extends BaseEntity {
7
+ constructor() {
8
+ super();
9
+ this.entity_type = ENTITYTYPE_FIELDMASTER;
10
+ }
11
+ @Column({ length: 50, nullable: true })
12
+ mapped_entity_type: string;
13
+
14
+ @Column({ length: 50, nullable: true })
15
+ field_type: string;
16
+
17
+ @Column({ nullable: true })
18
+ description: string;
19
+
20
+ @Column({ type: 'varchar', nullable: true })
21
+ label: string;
22
+
23
+ @Column({ type: 'int', nullable: true })
24
+ view_id: number;
25
+ }
@@ -1,65 +1,65 @@
1
- import { BaseEntity } from './base-entity.entity';
2
- import { Column, Entity } from 'typeorm';
3
- import { ENTITYTYPE_PREFERENCEMASTER } from '../../../constant/global.constant';
4
-
5
- @Entity({ name: 'cr_preference_master' })
6
- export class PreferenceMaster extends BaseEntity {
7
- constructor() {
8
- super();
9
- this.entity_type = ENTITYTYPE_PREFERENCEMASTER;
10
- }
11
-
12
- @Column({ name: 'appcode', type: 'varchar', length: 200, nullable: true })
13
- appCode: string;
14
-
15
- @Column({
16
- name: 'display_name',
17
- type: 'varchar',
18
- length: 200,
19
- nullable: true,
20
- })
21
- display_name: string;
22
-
23
- @Column({
24
- name: 'preference_key',
25
- type: 'varchar',
26
- length: 200,
27
- nullable: true,
28
- })
29
- preference_key: string;
30
-
31
- @Column({
32
- name: 'preference_value',
33
- type: 'varchar',
34
- length: 200,
35
- nullable: true,
36
- })
37
- preference_value: string;
38
-
39
- @Column({
40
- name: 'description',
41
- type: 'varchar',
42
- length: 2000,
43
- nullable: true,
44
- })
45
- description: string;
46
-
47
- @Column({ name: 'reflect_on', type: 'varchar', length: 200, nullable: true })
48
- reflect_on: string;
49
-
50
- @Column({
51
- name: 'default_value',
52
- type: 'varchar',
53
- length: 200,
54
- nullable: true,
55
- })
56
- default_value: string;
57
-
58
- @Column({
59
- name: 'possible_values',
60
- type: 'varchar',
61
- length: 200,
62
- nullable: true,
63
- })
64
- possible_values: string;
65
- }
1
+ import { BaseEntity } from './base-entity.entity';
2
+ import { Column, Entity } from 'typeorm';
3
+ import { ENTITYTYPE_PREFERENCEMASTER } from '../../../constant/global.constant';
4
+
5
+ @Entity({ name: 'cr_preference_master' })
6
+ export class PreferenceMaster extends BaseEntity {
7
+ constructor() {
8
+ super();
9
+ this.entity_type = ENTITYTYPE_PREFERENCEMASTER;
10
+ }
11
+
12
+ @Column({ name: 'appcode', type: 'varchar', length: 200, nullable: true })
13
+ appCode: string;
14
+
15
+ @Column({
16
+ name: 'display_name',
17
+ type: 'varchar',
18
+ length: 200,
19
+ nullable: true,
20
+ })
21
+ display_name: string;
22
+
23
+ @Column({
24
+ name: 'preference_key',
25
+ type: 'varchar',
26
+ length: 200,
27
+ nullable: true,
28
+ })
29
+ preference_key: string;
30
+
31
+ @Column({
32
+ name: 'preference_value',
33
+ type: 'varchar',
34
+ length: 200,
35
+ nullable: true,
36
+ })
37
+ preference_value: string;
38
+
39
+ @Column({
40
+ name: 'description',
41
+ type: 'varchar',
42
+ length: 2000,
43
+ nullable: true,
44
+ })
45
+ description: string;
46
+
47
+ @Column({ name: 'reflect_on', type: 'varchar', length: 200, nullable: true })
48
+ reflect_on: string;
49
+
50
+ @Column({
51
+ name: 'default_value',
52
+ type: 'varchar',
53
+ length: 200,
54
+ nullable: true,
55
+ })
56
+ default_value: string;
57
+
58
+ @Column({
59
+ name: 'possible_values',
60
+ type: 'varchar',
61
+ length: 200,
62
+ nullable: true,
63
+ })
64
+ possible_values: string;
65
+ }
@@ -0,0 +1,23 @@
1
+ import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
2
+
3
+ @Entity({ name: 'eth_school_temp' })
4
+ export class SchoolEntity {
5
+
6
+ @PrimaryGeneratedColumn()
7
+ id: number;
8
+
9
+ @Column({})
10
+ code: string;
11
+
12
+ @Column({})
13
+ name:string;
14
+
15
+ @Column({})
16
+ logo:string;
17
+
18
+ @Column({nullable:true})
19
+ parent_id:number;
20
+
21
+ @Column({nullable:true})
22
+ parent_type:string;
23
+ }
@@ -0,0 +1,25 @@
1
+ import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
2
+
3
+ @Entity({ name: 'eth_school_address_temp' })
4
+ export class SchoolAddressEntity {
5
+ @PrimaryGeneratedColumn()
6
+ id: number;
7
+
8
+ @Column({})
9
+ code: string;
10
+
11
+ @Column({})
12
+ city: string;
13
+
14
+ @Column({})
15
+ state: string;
16
+
17
+ @Column({})
18
+ school_id: number;
19
+
20
+ @Column({})
21
+ parent_type: string;
22
+
23
+ @Column({})
24
+ parent_id: number;
25
+ }
@@ -0,0 +1,28 @@
1
+ import { ENTITYTYPE_SECTIONMASTER } from 'src/constant/global.constant';
2
+ import { BaseEntity } from './base-entity.entity';
3
+ import { Column, Entity } from 'typeorm';
4
+
5
+ @Entity({ name: 'cr_section_master' })
6
+ export class SectionMaster extends BaseEntity {
7
+ constructor() {
8
+ super();
9
+ this.entity_type = ENTITYTYPE_SECTIONMASTER;
10
+ }
11
+ @Column({ length: 50, nullable: true })
12
+ mapped_entity_type: string;
13
+
14
+ @Column({ length: 50, nullable: true })
15
+ section_type: string;
16
+
17
+ @Column({ nullable: true })
18
+ description: string;
19
+
20
+ @Column({ type: 'varchar', nullable: true })
21
+ tooltip: string;
22
+
23
+ @Column({ type: 'int', nullable: true })
24
+ visible_in_add: number;
25
+
26
+ @Column({ type: 'int', nullable: true })
27
+ position: number;
28
+ }
@@ -24,6 +24,14 @@ import { MediaDataService } from './service/media-data.service';
24
24
  import { MediaDataRepository } from './repository/media-data.repository';
25
25
  import { MediaController } from './controller/media.controller';
26
26
  import { ViewMaster } from './entity/view-master.entity';
27
+ import { SchoolEntity } from './entity/school.entity';
28
+ import { SchoolAddressEntity } from './entity/schoolAddress.entity';
29
+ import { AttributeMasterService } from './service/attribute-master.service';
30
+ import { SectionMasterService } from './service/section-master.service';
31
+ import { SectionMaster } from './entity/section-master.entity';
32
+ import { FieldGroup } from './entity/field-group.entity';
33
+ import { FieldGroupService } from './service/field-group.service';
34
+ import { ViewMasterService } from './service/view-master.service';
27
35
 
28
36
  @Module({
29
37
  imports: [
@@ -35,6 +43,10 @@ import { ViewMaster } from './entity/view-master.entity';
35
43
  EntityTableColumn,
36
44
  MediaData,
37
45
  ViewMaster,
46
+ SchoolEntity,
47
+ SchoolAddressEntity,
48
+ SectionMaster,
49
+ FieldGroup,
38
50
  ]),
39
51
  UtilsModule,
40
52
  ],
@@ -52,6 +64,10 @@ import { ViewMaster } from './entity/view-master.entity';
52
64
  EntityListService,
53
65
  MediaDataRepository,
54
66
  MediaDataService,
67
+ AttributeMasterService,
68
+ SectionMasterService,
69
+ FieldGroupService,
70
+ { provide: 'ViewMasterService', useClass: ViewMasterService },
55
71
  ],
56
72
  exports: [
57
73
  EntityMasterService,
@@ -61,6 +77,9 @@ import { ViewMaster } from './entity/view-master.entity';
61
77
  EntityTableService,
62
78
  EntityTableColumnService,
63
79
  MediaDataService,
80
+ SectionMasterService,
81
+ FieldGroupService,
82
+ 'ViewMasterService',
64
83
  ],
65
84
  controllers: [EntityController, MasterController, MediaController],
66
85
  })
@@ -1,7 +1,7 @@
1
1
  import { Injectable } from '@nestjs/common';
2
2
  import { InjectRepository } from '@nestjs/typeorm';
3
3
  import { AttributeMaster } from '../entity/attribute-master.entity';
4
- import { Repository } from 'typeorm';
4
+ import { In, Repository } from 'typeorm';
5
5
 
6
6
  @Injectable()
7
7
  export class AttributeMasterRepository {
@@ -25,4 +25,14 @@ export class AttributeMasterRepository {
25
25
  },
26
26
  });
27
27
  }
28
+
29
+
30
+ async findAttributesByMappedEntityType(entityType: string): Promise<AttributeMaster[]> {
31
+ return await this.attributeMasterRepository.find({
32
+ where: {
33
+ mapped_entity_type: In([entityType, 'DEF']),
34
+ },
35
+ });
36
+ }
37
+
28
38
  }
@@ -1,20 +1,20 @@
1
- import { Injectable } from '@nestjs/common';
2
- import { InjectRepository } from '@nestjs/typeorm';
3
- import { PreferenceMaster } from '../entity/preference.entity';
4
- import { Repository } from 'typeorm';
5
-
6
- @Injectable()
7
- export class PreferenceRepository {
8
- constructor(
9
- @InjectRepository(PreferenceMaster)
10
- private readonly preferenceRepository: Repository<PreferenceMaster>,
11
- ) {}
12
-
13
- async findByPreferenceKey(
14
- preferenceKey: string,
15
- ): Promise<PreferenceMaster | null> {
16
- return await this.preferenceRepository.findOne({
17
- where: { preference_key: preferenceKey },
18
- });
19
- }
20
- }
1
+ import { Injectable } from '@nestjs/common';
2
+ import { InjectRepository } from '@nestjs/typeorm';
3
+ import { PreferenceMaster } from '../entity/preference.entity';
4
+ import { Repository } from 'typeorm';
5
+
6
+ @Injectable()
7
+ export class PreferenceRepository {
8
+ constructor(
9
+ @InjectRepository(PreferenceMaster)
10
+ private readonly preferenceRepository: Repository<PreferenceMaster>,
11
+ ) {}
12
+
13
+ async findByPreferenceKey(
14
+ preferenceKey: string,
15
+ ): Promise<PreferenceMaster | null> {
16
+ return await this.preferenceRepository.findOne({
17
+ where: { preference_key: preferenceKey },
18
+ });
19
+ }
20
+ }
@@ -0,0 +1,17 @@
1
+ import { Injectable } from "@nestjs/common";
2
+ import { InjectRepository } from "@nestjs/typeorm";
3
+ import { In } from "typeorm";
4
+ import { AttributeMasterRepository } from "../repository/attribute-master.repository";
5
+
6
+
7
+ @Injectable()
8
+ export class AttributeMasterService {
9
+ constructor(
10
+ private readonly attributeMasterRepository: AttributeMasterRepository,
11
+ ) {}
12
+
13
+ async findAttributesByMappedEntityType(entity_type){
14
+ return await this.attributeMasterRepository.findAttributesByMappedEntityType(entity_type);
15
+ }
16
+
17
+ }
@@ -155,7 +155,7 @@ export class EntityListService {
155
155
  FROM ${tableName} WHERE 1=1 `;
156
156
  const argsObjectList: any[] = [];
157
157
  if (parentId) {
158
- query += `AND parent_id = ? AND parent_type = ? `;
158
+ query += ` AND parent_id = ? AND parent_type = ? `;
159
159
  argsObjectList.push(parentId);
160
160
  argsObjectList.push(parentType);
161
161
  }
@@ -24,6 +24,13 @@ export class EntityMasterService {
24
24
  return entityMaster;
25
25
  }
26
26
 
27
+ async getEntityByTableName(tableName: string) {
28
+ const entityMaster = await this.entityMasterRepository.findOne({
29
+ where: { db_table_name: tableName },
30
+ });
31
+ return entityMaster;
32
+ }
33
+
27
34
  async save(entityMaster: EntityMaster) {
28
35
  return await this.entityMasterRepository.save(entityMaster);
29
36
  }
@@ -0,0 +1,104 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { EntityServiceImpl } from './entity-service-impl.service';
3
+ import { BaseEntity } from '../entity/base-entity.entity';
4
+ import { UserData } from '../../user/entity/user.entity';
5
+ import { EntityManager } from 'typeorm';
6
+ import { ViewMaster } from '../entity/view-master.entity';
7
+
8
+ @Injectable()
9
+ export class FieldGroupService extends EntityServiceImpl {
10
+ constructor() {
11
+ super();
12
+ }
13
+
14
+ async createEntity(
15
+ entityData: BaseEntity,
16
+ loggedInUser: UserData | null,
17
+ manager?: EntityManager,
18
+ ): Promise<BaseEntity> {
19
+ const entityMaster = await this.entityMasterService.getEntityData(
20
+ entityData.entity_type,
21
+ );
22
+ entityData.parent_id = entityMaster.id;
23
+ entityData.parent_type = entityMaster.entity_type;
24
+
25
+ const savedEntity = await super.createEntity(
26
+ entityData,
27
+ loggedInUser,
28
+ manager,
29
+ );
30
+ return savedEntity;
31
+ }
32
+
33
+ async updateEntity(
34
+ entityData: ViewMaster,
35
+ loggedInUserData: UserData | null,
36
+ ): Promise<BaseEntity> {
37
+ return entityData;
38
+ }
39
+
40
+ parseLayout(layoutJson: any) {
41
+ const stepsData: {
42
+ stepType: string;
43
+ stepId: string;
44
+ stepLabel: string;
45
+ stepPosition: number;
46
+ fields: {
47
+ type: string;
48
+ label: string;
49
+ id: string;
50
+ }[];
51
+ }[] = [];
52
+
53
+ if (layoutJson?.form?.children && Array.isArray(layoutJson.form.children)) {
54
+ const firstChild = layoutJson.form.children[0];
55
+ console.log('First Child:', firstChild);
56
+
57
+ if (firstChild.type === 'wizard' && Array.isArray(firstChild.steps)) {
58
+ console.log('Wizard Steps:', firstChild.steps);
59
+ let i = 0;
60
+ for (const step of firstChild.steps) {
61
+ if (step.type === 'step') {
62
+ const fields = this.extractFields(step.fields);
63
+
64
+ stepsData.push({
65
+ stepType: step.type,
66
+ stepId: step.id,
67
+ stepLabel: step.label,
68
+ stepPosition: ++i,
69
+ fields: fields,
70
+ });
71
+ }
72
+ }
73
+ }
74
+ }
75
+ return stepsData;
76
+ }
77
+
78
+ extractFields(fieldsArray: any[]): {
79
+ type: string;
80
+ label: string;
81
+ id: string;
82
+ }[] {
83
+ const extractedFields: { type: string; label: string; id: string }[] = [];
84
+
85
+ function traverse(fields: any[]) {
86
+ for (const field of fields) {
87
+ if (field.type === 'field-set') {
88
+ extractedFields.push({
89
+ type: field.type,
90
+ label: field.label || 'No Label',
91
+ id: field.id || 'No ID',
92
+ });
93
+ }
94
+ if (Array.isArray(field.fields)) {
95
+ traverse(field.fields); // 📢 Recursive call
96
+ }
97
+ }
98
+ }
99
+
100
+ traverse(fieldsArray);
101
+
102
+ return extractedFields;
103
+ }
104
+ }
@@ -10,17 +10,16 @@ import { v4 as uuidv4 } from 'uuid';
10
10
  @Injectable()
11
11
  export class MediaDataService extends EntityServiceImpl {
12
12
 
13
-
14
13
  constructor(
15
14
  private readonly configService: ConfigService,
16
15
  private readonly mediaRepository: MediaDataRepository,
17
16
  ) {
18
17
  super();
19
18
  }
20
-
21
- s3AccessKeyID=this.configService.get('AWS.S3.AWS_ACCESS_KEY_ID')
22
- s3AccessKeySecret=this.configService.get('AWS.S3.AWS_SECRET_KEY')
23
- s3Region=this.configService.get('AWS.S3.AWS_REGION')
19
+
20
+ s3AccessKeyID = this.configService.get('AWS.S3.AWS_ACCESS_KEY_ID');
21
+ s3AccessKeySecret = this.configService.get('AWS.S3.AWS_SECRET_KEY');
22
+ s3Region = this.configService.get('AWS.S3.AWS_REGION');
24
23
  bucketName = this.configService.get<string>('AWS.S3.BUCKET_NAME');
25
24
 
26
25
  s3 = new S3({
@@ -29,15 +28,13 @@ export class MediaDataService extends EntityServiceImpl {
29
28
  region: this.s3Region,
30
29
  signatureVersion: 'v4',
31
30
  });
32
-
33
-
31
+
34
32
  async generateMediaUploadDetails(
35
33
  fileName: string,
36
34
  mappedAttributeKey: string,
37
35
  mappedEntityType?: string,
38
36
  mappedEntityId?: number,
39
37
  ) {
40
-
41
38
  if (!fileName || !mappedAttributeKey) {
42
39
  return null;
43
40
  }
@@ -45,7 +42,7 @@ export class MediaDataService extends EntityServiceImpl {
45
42
 
46
43
  const id = uuidv4();
47
44
  const s3Key = `uploads/${id}.${ext}`;
48
- console.log(s3Key)
45
+ console.log(s3Key);
49
46
 
50
47
  const uploadUrl = await this.s3.getSignedUrlPromise('putObject', {
51
48
  Bucket: this.bucketName,
@@ -63,6 +60,7 @@ export class MediaDataService extends EntityServiceImpl {
63
60
  if (mappedEntityId) {
64
61
  mediaData.mapped_entity_id = mappedEntityId;
65
62
  }
63
+ mediaData.media_url = s3Key;
66
64
 
67
65
  let savedEntity = await super.createEntity(mediaData, null);
68
66
 
@@ -115,4 +113,19 @@ export class MediaDataService extends EntityServiceImpl {
115
113
  };
116
114
  return map[ext] || 'application/octet-stream';
117
115
  }
116
+
117
+ // New method to get the signed URL for the media (download link)
118
+ async getMediaDownloadUrl(s3Key: string): Promise<string> {
119
+ try {
120
+ const signedUrl = await this.s3.getSignedUrlPromise('getObject', {
121
+ Bucket: this.bucketName,
122
+ Key: s3Key,
123
+ Expires: 60 * 5, // URL valid for 5 mins
124
+ });
125
+ return signedUrl;
126
+ } catch (error) {
127
+ console.error('Error generating signed URL for media:', error);
128
+ throw new Error('Failed to generate signed URL');
129
+ }
130
+ }
118
131
  }