From 718da4b4bf5f8286bb77cc0372f10e913cbecc9d Mon Sep 17 00:00:00 2001 From: souravbhowmik1999 Date: Fri, 26 Dec 2025 13:01:27 +0530 Subject: [PATCH 1/2] db sync --- src/academicyears/academicyears.module.ts | 4 +- src/academicyears/academicyears.service.ts | 6 +- .../entities/academicyears-entity.ts | 38 +++++----- .../entity/automatic-member.entity.ts | 16 ++-- src/cohort/cohort.module.ts | 4 +- src/cohort/entities/cohort.entity.ts | 70 ++++++++--------- .../cohortAcademicYear.module.ts | 4 +- .../entities/cohortAcademicYear.entity.ts | 30 +++++--- src/cohortMembers/cohortMembers.module.ts | 4 +- .../entities/cohort-member.entity.ts | 35 ++++----- src/common/database.module.ts | 6 ++ src/fields/dto/field-values-create.dto.ts | 6 +- src/fields/dto/field-values-update.dto.ts | 11 ++- src/fields/dto/field-values.dto.ts | 6 +- src/fields/entities/fields-values.entity.ts | 21 +++-- src/fields/entities/fields.entity.ts | 52 ++----------- src/fields/fields.service.ts | 1 - src/forms/entities/form.entity.ts | 34 +++++---- src/location/entities/location.entity.ts | 18 +++-- .../dto/role-permission-create-dto.ts | 13 +++- .../entities/rolePermissionMapping.ts | 35 ++++----- .../role-permission-mapping.service.ts | 4 +- .../entities/assign-privilege.entity.ts | 22 +++--- .../entities/assign-role.entity.ts | 32 ++++---- src/rbac/privilege/dto/privilege.dto.ts | 22 ++++-- .../privilege/entities/privilege.entity.ts | 34 +++++---- src/rbac/privilege/privilege.service.ts | 11 ++- src/rbac/role/entities/role.entity.ts | 32 ++++---- src/sso/sso.module.ts | 4 +- src/tenant/entities/tenent.entity.ts | 76 ++++++++++--------- src/user/entities/user-entity.ts | 69 ++++++++--------- src/user/user.module.ts | 4 +- src/user/user.service.ts | 8 +- .../entities/tenant.entity.ts | 53 ------------- .../entities/user-tenant-mapping.entity.ts | 14 ++-- .../user-tenant-mapping.module.ts | 4 +- .../user-tenant-mapping.service.ts | 6 +- 37 files changed, 398 insertions(+), 411 deletions(-) delete mode 100644 src/userTenantMapping/entities/tenant.entity.ts diff --git a/src/academicyears/academicyears.module.ts b/src/academicyears/academicyears.module.ts index 5d956277..6a6dbd91 100644 --- a/src/academicyears/academicyears.module.ts +++ b/src/academicyears/academicyears.module.ts @@ -3,10 +3,10 @@ import { AcademicyearsController } from "./academicyears.controller"; import { TypeOrmModule } from "@nestjs/typeorm"; import { AcademicYear } from "./entities/academicyears-entity"; import { AcademicYearService } from "./academicyears.service"; -import { Tenants } from "src/userTenantMapping/entities/tenant.entity"; +import { Tenant } from "src/tenant/entities/tenent.entity"; @Module({ - imports: [TypeOrmModule.forFeature([AcademicYear, Tenants])], + imports: [TypeOrmModule.forFeature([AcademicYear, Tenant])], providers: [AcademicYearService], controllers: [AcademicyearsController], exports: [AcademicYearService], diff --git a/src/academicyears/academicyears.service.ts b/src/academicyears/academicyears.service.ts index 87f4e009..41d54e38 100644 --- a/src/academicyears/academicyears.service.ts +++ b/src/academicyears/academicyears.service.ts @@ -8,15 +8,15 @@ import { API_RESPONSES } from "@utils/response.messages"; import { APIID } from "@utils/api-id.config"; import APIResponse from "src/common/responses/response"; import { AcademicYearSearchDto } from "./dto/academicyears-search.dto"; -import { Tenants } from "src/userTenantMapping/entities/tenant.entity"; +import { Tenant } from "src/tenant/entities/tenent.entity"; @Injectable() export class AcademicYearService { constructor( @InjectRepository(AcademicYear) private readonly academicYearRespository: Repository, - @InjectRepository(Tenants) - private readonly tenantRepository: Repository + @InjectRepository(Tenant) + private readonly tenantRepository: Repository ) { } public async createAcademicYear( diff --git a/src/academicyears/entities/academicyears-entity.ts b/src/academicyears/entities/academicyears-entity.ts index 61621b19..69669479 100644 --- a/src/academicyears/entities/academicyears-entity.ts +++ b/src/academicyears/entities/academicyears-entity.ts @@ -11,38 +11,40 @@ export class AcademicYear { @PrimaryGeneratedColumn("uuid") id: string; - @Column({ type: "date", name: "startDate" }) + @Column({ type: "date", name: "startDate", nullable: false }) startDate: string; - @Column({ type: "date", name: "endDate" }) + @Column({ type: "date", name: "endDate", nullable: false }) endDate: string; - @Column({ type: "varchar", length: 15, name: "session" }) - session: string; + @Column({ type: "varchar", length: 15, name: "session", nullable: true }) + session: string | null; @CreateDateColumn({ - type: "timestamp", + type: "timestamptz", name: "createdAt", - default: () => "CURRENT_TIMESTAMP", + default: () => "now()", + nullable: true, }) - createdAt: Date; + createdAt: Date | null; @UpdateDateColumn({ - type: "timestamp", + type: "timestamptz", name: "updatedAt", - default: () => "CURRENT_TIMESTAMP", + default: () => "now()", + nullable: true, }) - updatedAt: Date; + updatedAt: Date | null; - @Column({ type: "uuid", nullable: true }) - createdBy: string; + @Column({ type: "boolean", name: "isActive", default: true, nullable: true }) + isActive: boolean | null; - @Column({ type: "uuid", nullable: true }) - updatedBy: string; + @Column({ type: "uuid", name: "tenantId", nullable: true }) + tenantId: string | null; - @Column({ type: "boolean", name: "isActive", default: true }) - isActive: boolean; + @Column({ type: "uuid", name: "updatedBy", nullable: true }) + updatedBy: string | null; - @Column("uuid", { nullable: false }) - tenantId: string; + @Column({ type: "uuid", name: "createdBy", nullable: true }) + createdBy: string | null; } diff --git a/src/automatic-member/entity/automatic-member.entity.ts b/src/automatic-member/entity/automatic-member.entity.ts index f962f714..ed73a767 100644 --- a/src/automatic-member/entity/automatic-member.entity.ts +++ b/src/automatic-member/entity/automatic-member.entity.ts @@ -5,18 +5,22 @@ export class AutomaticMember { @PrimaryGeneratedColumn('uuid') id: string; - @Column('uuid') + @Column('uuid', { nullable: false }) userId: string; - @Column('jsonb') + @Column('jsonb', { nullable: false }) rules: any; - @Column('uuid') + @Column('uuid', { nullable: false }) tenantId: string; - @Column({ default: true }) + @Column({ type: "bool", default: true, nullable: false }) isActive: boolean; - @CreateDateColumn() - createdAt: Date; + @CreateDateColumn({ + type: "timestamp", + default: () => "CURRENT_TIMESTAMP", + nullable: true, + }) + createdAt: Date | null; } diff --git a/src/cohort/cohort.module.ts b/src/cohort/cohort.module.ts index 9725eafa..7eadb48b 100644 --- a/src/cohort/cohort.module.ts +++ b/src/cohort/cohort.module.ts @@ -16,7 +16,7 @@ import { AcademicYearService } from "src/academicyears/academicyears.service"; import { AcademicYear } from "src/academicyears/entities/academicyears-entity"; import { CohortMembersService } from "src/cohortMembers/cohortMembers.service"; import { User } from "src/user/entities/user-entity"; -import { Tenants } from "src/userTenantMapping/entities/tenant.entity"; +import { Tenant } from "src/tenant/entities/tenent.entity"; import { AutomaticMember } from "src/automatic-member/entity/automatic-member.entity"; import { AutomaticMemberService } from "src/automatic-member/automatic-member.service"; import { KafkaService } from "../kafka/kafka.service"; @@ -39,7 +39,7 @@ import { KafkaModule } from "../kafka/kafka.module"; CohortAcademicYear, AcademicYear, User, - Tenants, + Tenant, AutomaticMember ]), HttpModule, diff --git a/src/cohort/entities/cohort.entity.ts b/src/cohort/entities/cohort.entity.ts index b7026144..42226920 100644 --- a/src/cohort/entities/cohort.entity.ts +++ b/src/cohort/entities/cohort.entity.ts @@ -13,51 +13,53 @@ export class Cohort { @PrimaryGeneratedColumn("uuid") cohortId: string; - @Column({ nullable: true }) - parentId: string; + @CreateDateColumn({ + type: "timestamptz", + default: () => "now()", + nullable: false, + }) + createdAt: Date; - @Column({ nullable: true }) - name: string; + @UpdateDateColumn({ + type: "timestamptz", + default: () => "now()", + nullable: false, + }) + updatedAt: Date; - @Column({ nullable: true }) - type: string; + @Column({ type: "bool", nullable: false }) + attendanceCaptureImage: boolean; - @Column() - status: string; + @Column({ type: "varchar", nullable: true }) + parentId: string | null; - @Column({ type: "json", nullable: true }) - image: string[]; // JSON field to store array of program images + @Column({ type: "varchar", length: 255, nullable: true }) + name: string | null; - @Column({ nullable: true }) - referenceId: string; + @Column({ type: "varchar", length: 255, nullable: true }) + type: string | null; - @Column({ nullable: true }) - metadata: string; + @Column({ type: "jsonb", nullable: true }) + image: any; - @Column({ nullable: true }) - tenantId: string; + @Column({ type: "varchar", nullable: true }) + referenceId: string | null; - @Column({ nullable: true }) - programId: string; + @Column({ type: "varchar", nullable: true }) + metadata: string | null; - @Column() - attendanceCaptureImage: boolean; + @Column({ type: "uuid", nullable: false }) + tenantId: string; - @CreateDateColumn({ - type: "timestamp with time zone", - default: () => "CURRENT_TIMESTAMP", - }) - createdAt: Date; + @Column({ type: "varchar", nullable: true }) + programId: string | null; - @UpdateDateColumn({ - type: "timestamp with time zone", - default: () => "CURRENT_TIMESTAMP", - }) - updatedAt: Date; + @Column({ type: "uuid", nullable: true }) + createdBy: string | null; - @Column() - createdBy: string; + @Column({ type: "uuid", nullable: true }) + updatedBy: string | null; - @Column() - updatedBy: string; + @Column({ type: "varchar", nullable: true }) + status: string | null; } diff --git a/src/cohortAcademicYear/cohortAcademicYear.module.ts b/src/cohortAcademicYear/cohortAcademicYear.module.ts index 114c6350..ac8d9bec 100644 --- a/src/cohortAcademicYear/cohortAcademicYear.module.ts +++ b/src/cohortAcademicYear/cohortAcademicYear.module.ts @@ -5,7 +5,7 @@ import { CohortAcademicYearController } from "./cohortAcademicYear.controller"; import { TypeOrmModule } from "@nestjs/typeorm"; import { Cohort } from "src/cohort/entities/cohort.entity"; import { AcademicYear } from "src/academicyears/entities/academicyears-entity"; -import { Tenants } from "src/userTenantMapping/entities/tenant.entity"; +import { Tenant } from "src/tenant/entities/tenent.entity"; import { AcademicyearsModule } from "src/academicyears/academicyears.module"; @@ -16,7 +16,7 @@ import { AcademicyearsModule } from "src/academicyears/academicyears.module"; CohortAcademicYear, Cohort, AcademicYear, - Tenants + Tenant ]), ], controllers: [CohortAcademicYearController], diff --git a/src/cohortAcademicYear/entities/cohortAcademicYear.entity.ts b/src/cohortAcademicYear/entities/cohortAcademicYear.entity.ts index ac740b66..16caf420 100644 --- a/src/cohortAcademicYear/entities/cohortAcademicYear.entity.ts +++ b/src/cohortAcademicYear/entities/cohortAcademicYear.entity.ts @@ -11,21 +11,29 @@ export class CohortAcademicYear { @PrimaryGeneratedColumn("uuid") cohortAcademicYearId: string; - @Column({ type: "uuid" }) + @Column({ type: "uuid", nullable: false }) + academicYearId: string; + + @Column({ type: "uuid", nullable: false }) cohortId: string; - @Column({ type: "uuid" }) - academicYearId: string; + @CreateDateColumn({ + type: "timestamptz", + default: () => "now()", + nullable: true, + }) + createdAt: Date | null; - @Column({ type: "uuid" }) + @UpdateDateColumn({ + type: "timestamptz", + default: () => "now()", + nullable: true, + }) + updatedAt: Date | null; + + @Column({ type: "uuid", nullable: false }) createdBy: string; - @Column({ type: "uuid" }) + @Column({ type: "uuid", nullable: false }) updatedBy: string; - - @CreateDateColumn({ type: "date", default: () => "CURRENT_DATE" }) - createdAt: Date; - - @UpdateDateColumn({ type: "date", default: () => "CURRENT_DATE" }) - updatedAt: Date; } diff --git a/src/cohortMembers/cohortMembers.module.ts b/src/cohortMembers/cohortMembers.module.ts index de2d3c7a..27425467 100644 --- a/src/cohortMembers/cohortMembers.module.ts +++ b/src/cohortMembers/cohortMembers.module.ts @@ -9,7 +9,7 @@ import { User } from "src/user/entities/user-entity"; import { Cohort } from "src/cohort/entities/cohort.entity"; import { CohortAcademicYear } from "src/cohortAcademicYear/entities/cohortAcademicYear.entity"; import { AcademicYear } from "src/academicyears/entities/academicyears-entity"; -import { Tenants } from "src/userTenantMapping/entities/tenant.entity"; +import { Tenant } from "src/tenant/entities/tenent.entity"; import { KafkaModule } from "src/kafka/kafka.module"; import { FieldsModule } from "src/fields/fields.module"; import { UserModule } from "src/user/user.module"; @@ -25,7 +25,7 @@ import { NotificationRequest } from "src/common/utils/notification.axios"; Cohort, CohortAcademicYear, AcademicYear, - Tenants + Tenant ]), HttpModule, FieldsModule, diff --git a/src/cohortMembers/entities/cohort-member.entity.ts b/src/cohortMembers/entities/cohort-member.entity.ts index b9d00199..1828cd83 100644 --- a/src/cohortMembers/entities/cohort-member.entity.ts +++ b/src/cohortMembers/entities/cohort-member.entity.ts @@ -19,34 +19,35 @@ export class CohortMembers { @PrimaryGeneratedColumn("uuid") cohortMembershipId: string; - @Column({ type: "uuid" }) - cohortId: string; + @CreateDateColumn({ type: "date", default: () => "now()", nullable: true }) + createdAt: Date | null; - @Column({ type: "uuid" }) - cohortAcademicYearId: string; + @UpdateDateColumn({ type: "date", default: () => "now()", nullable: true }) + updatedAt: Date | null; - @Column({ type: "uuid" }) - userId: string; - - @CreateDateColumn({ type: "date", default: () => "CURRENT_DATE" }) - createdAt: Date; - - @UpdateDateColumn({ type: "date", default: () => "CURRENT_DATE" }) - updatedAt: Date; + @Column({ type: "uuid", nullable: true }) + cohortId: string | null; @Column({ type: "uuid", nullable: true }) - createdBy: string; + userId: string | null; @Column({ type: "uuid", nullable: true }) - updatedBy: string; + createdBy: string | null; - @Column({ type: "varchar" }) - statusReason: string; + @Column({ type: "uuid", nullable: true }) + updatedBy: string | null; @Column({ type: "enum", enum: MemberStatus, default: MemberStatus.ACTIVE, + nullable: true, }) - status: MemberStatus; + status: MemberStatus | null; + + @Column({ type: "text", nullable: true }) + statusReason: string | null; + + @Column({ type: "uuid", nullable: true }) + cohortAcademicYearId: string | null; } diff --git a/src/common/database.module.ts b/src/common/database.module.ts index e02a2195..723468ac 100644 --- a/src/common/database.module.ts +++ b/src/common/database.module.ts @@ -17,6 +17,12 @@ import { User } from "src/user/entities/user-entity"; // User // ], autoLoadEntities: true, + // Both synchronize and migrations enabled + // - synchronize: Auto-syncs entity changes (will error if structure differs - that's expected) + // - migrations: Used for creating new tables via migration scripts + synchronize: true, + migrations: ['dist/migrations/*.js'], + migrationsRun: true, // Auto-run migrations on startup extra: { max: 20, // Number of connections in the pool (default is 10) idleTimeoutMillis: 30000, // 30 seconds diff --git a/src/fields/dto/field-values-create.dto.ts b/src/fields/dto/field-values-create.dto.ts index cbe212c0..46d40d20 100644 --- a/src/fields/dto/field-values-create.dto.ts +++ b/src/fields/dto/field-values-create.dto.ts @@ -7,9 +7,13 @@ export class FieldValuesCreateDto { //value @Expose() - value: string; + value: string[]; constructor(obj: any) { Object.assign(this, obj); + // Normalize value: convert string to array, keep array as is + if (this.value !== undefined && this.value !== null) { + this.value = Array.isArray(this.value) ? this.value : [this.value]; + } } } diff --git a/src/fields/dto/field-values-update.dto.ts b/src/fields/dto/field-values-update.dto.ts index e6ce51db..c515ee3a 100644 --- a/src/fields/dto/field-values-update.dto.ts +++ b/src/fields/dto/field-values-update.dto.ts @@ -20,14 +20,19 @@ export class FieldValuesUpdateDto { //value @ApiProperty({ - type: String, - description: "The value of the field values", + type: [String], + description: "The value of the field values (can be string or array of strings)", default: "", }) @Expose() - value: string; + value: string[]; constructor(obj: any) { Object.assign(this, obj); + // Normalize value: convert string to array, keep array as is + const originalValue = obj?.value; + if (originalValue !== undefined && originalValue !== null && originalValue !== "") { + this.value = Array.isArray(originalValue) ? originalValue : [originalValue]; + } } } diff --git a/src/fields/dto/field-values.dto.ts b/src/fields/dto/field-values.dto.ts index 65f1c057..b89a9f29 100644 --- a/src/fields/dto/field-values.dto.ts +++ b/src/fields/dto/field-values.dto.ts @@ -21,7 +21,7 @@ export class FieldValuesDto { //value @Expose() - value: string; + value: string[]; //itemId @Expose() @@ -37,5 +37,9 @@ export class FieldValuesDto { constructor(obj: any) { Object.assign(this, obj); + // Normalize value: convert string to array, keep array as is + if (this.value !== undefined && this.value !== null) { + this.value = Array.isArray(this.value) ? this.value : [this.value]; + } } } diff --git a/src/fields/entities/fields-values.entity.ts b/src/fields/entities/fields-values.entity.ts index d6b6a873..f7fc41b9 100644 --- a/src/fields/entities/fields-values.entity.ts +++ b/src/fields/entities/fields-values.entity.ts @@ -15,8 +15,8 @@ export class FieldValues { @PrimaryGeneratedColumn("uuid", { name: "fieldValuesId" }) fieldValuesId: string = uuidv4(); - @Column("varchar", { length: 255, nullable: false }) - value: string; + @Column("text", { array: true, nullable: false }) + value: string[]; @Column("uuid", { nullable: false }) itemId: string; @@ -24,13 +24,6 @@ export class FieldValues { @Column("uuid", { nullable: false }) fieldId: string; - @Column("uuid", { nullable: true }) - tenantId?: string; - - @Column("varchar", { nullable: true }) - contextType?: string; - - @CreateDateColumn({ type: "timestamptz", default: () => "now()", @@ -46,10 +39,16 @@ export class FieldValues { updatedAt: Date; @Column("uuid", { nullable: true }) - createdBy?: string; + createdBy: string | null; + + @Column("uuid", { nullable: true }) + updatedBy: string | null; + + @Column("text", { nullable: true }) + contextType: string | null; @Column("uuid", { nullable: true }) - updatedBy?: string; + tenantId: string | null; @ManyToOne(() => Fields, (field) => field.fieldValues) @JoinColumn({ name: "fieldId" }) diff --git a/src/fields/entities/fields.entity.ts b/src/fields/entities/fields.entity.ts index 0e16315a..6b01222b 100644 --- a/src/fields/entities/fields.entity.ts +++ b/src/fields/entities/fields.entity.ts @@ -25,13 +25,7 @@ export class Fields { fieldId: string; @Column("varchar", { nullable: true }) - assetId?: string; - - @Column("varchar", { nullable: false }) - context: string; - - @Column("varchar", { nullable: true }) - groupId?: string; + context: string | null; @Column("varchar", { nullable: false }) name: string; @@ -39,9 +33,6 @@ export class Fields { @Column("varchar", { nullable: false }) label: string; - @Column("varchar", { nullable: true }) - defaultValue?: string; - @Column({ type: "enum", enum: FieldType, @@ -50,32 +41,11 @@ export class Fields { }) type: FieldType; - @Column("varchar", { nullable: true }) - note?: string; - - @Column("text", { nullable: true }) - description?: string; - - @Column("text", { nullable: false }) - state: string; - @Column("bool", { nullable: false }) required: boolean; - @Column("int4", { nullable: false }) - ordering: number; - - @Column("varchar", { nullable: true }) - metadata?: string; - - @Column("varchar", { nullable: true }) - access?: string; - - @Column("bool", { nullable: false }) - onlyUseInSubform: boolean; - - @Column("uuid", { nullable: false }) - tenantId: string; + @Column("uuid", { nullable: true }) + tenantId: string | null; @CreateDateColumn({ type: "timestamptz", @@ -92,19 +62,13 @@ export class Fields { updatedAt: Date; @Column("varchar", { nullable: true }) - createdBy?: string; - - @Column("varchar", { nullable: true }) - updatedBy?: string; - - @Column("uuid", { nullable: true }) - contextId?: string; + createdBy: string | null; @Column("varchar", { nullable: true }) - render?: string; + updatedBy: string | null; @Column("varchar", { nullable: true }) - contextType?: string; + contextType: string | null; @Column("jsonb", { nullable: true }) fieldParams?: object; @@ -119,6 +83,6 @@ export class Fields { @Column({ type: "jsonb", nullable: true }) sourceDetails: any; - @Column({ type: "varchar" }) - dependsOn: string; + @Column({ type: "varchar", nullable: true }) + dependsOn: string | null; } diff --git a/src/fields/fields.service.ts b/src/fields/fields.service.ts index 5dba22a4..0455c7c8 100644 --- a/src/fields/fields.service.ts +++ b/src/fields/fields.service.ts @@ -1675,7 +1675,6 @@ export class FieldsService { fieldId: data?.fieldId, name: data?.name, label: data?.label, - order: data?.ordering, isRequired: data?.fieldAttributes?.isRequired, isEditable: data?.fieldAttributes?.isEditable, isHidden: data?.fieldAttributes?.isHidden, diff --git a/src/forms/entities/form.entity.ts b/src/forms/entities/form.entity.ts index 37cfcdbc..e325537d 100644 --- a/src/forms/entities/form.entity.ts +++ b/src/forms/entities/form.entity.ts @@ -11,30 +11,38 @@ export class Form { @PrimaryGeneratedColumn("uuid") formid: string; - @CreateDateColumn({ type: "timestamptz" }) + @CreateDateColumn({ + type: "timestamptz", + default: () => "now()", + nullable: false, + }) createdat: Date; - @UpdateDateColumn({ type: "timestamptz" }) + @UpdateDateColumn({ + type: "timestamptz", + default: () => "now()", + nullable: false, + }) updatedat: Date; - @Column({ type: "varchar", length: 255 }) + @Column({ type: "varchar", length: 255, nullable: false }) title: string; - @Column({ type: "uuid" }) - tenantId: string; - @Column({ type: "varchar", length: 255, nullable: true }) - context: string; + context: string | null; @Column({ type: "varchar", length: 50, nullable: true }) - contextType: string; + contextType: string | null; @Column({ type: "jsonb", nullable: true }) - fields: object; + fields: object | null; + + @Column({ type: "uuid", nullable: true }) + tenantId: string | null; - @Column({ type: 'uuid'}) - createdBy: string; + @Column({ type: "uuid", nullable: true }) + createdBy: string | null; - @Column({ type: 'uuid'}) - updatedBy: string; + @Column({ type: "uuid", nullable: true }) + updatedBy: string | null; } diff --git a/src/location/entities/location.entity.ts b/src/location/entities/location.entity.ts index 8f11e8f4..ec0a5d7a 100644 --- a/src/location/entities/location.entity.ts +++ b/src/location/entities/location.entity.ts @@ -1,15 +1,19 @@ -import { Entity, Column, PrimaryColumn } from "typeorm"; +import { Entity, Column, PrimaryGeneratedColumn } from "typeorm"; @Entity({ name: "location" }) export class Location { - @PrimaryColumn({ type: "varchar" }) + @PrimaryGeneratedColumn("uuid") id: string; - @Column({ type: "varchar" }) + + @Column({ type: "varchar", length: 50, nullable: false }) code: string; - @Column({ type: "varchar" }) + + @Column({ type: "varchar", length: 255, nullable: false, name: "name" }) name: string; - @Column({ type: "varchar" }) - parentid: string; - @Column({ type: "varchar" }) + + @Column({ type: "uuid", nullable: true, name: "parentid" }) + parentid: string | null; + + @Column({ type: "varchar", length: 100, nullable: false }) type: string; } diff --git a/src/permissionRbac/rolePermissionMapping/dto/role-permission-create-dto.ts b/src/permissionRbac/rolePermissionMapping/dto/role-permission-create-dto.ts index 40e9ef77..2daef8be 100644 --- a/src/permissionRbac/rolePermissionMapping/dto/role-permission-create-dto.ts +++ b/src/permissionRbac/rolePermissionMapping/dto/role-permission-create-dto.ts @@ -2,6 +2,17 @@ export class RolePermissionCreateDto { roleTitle: string; module: string; apiPath: string; - requestType: string; + requestType: string[]; rolePermissionId?: string; + + constructor(obj: any) { + Object.assign(this, obj); + // Normalize requestType: convert string to array, keep array as is + const originalRequestType = obj?.requestType; + if (originalRequestType !== undefined && originalRequestType !== null) { + this.requestType = Array.isArray(originalRequestType) + ? originalRequestType + : [originalRequestType]; + } + } } diff --git a/src/permissionRbac/rolePermissionMapping/entities/rolePermissionMapping.ts b/src/permissionRbac/rolePermissionMapping/entities/rolePermissionMapping.ts index efc65372..dd268a95 100644 --- a/src/permissionRbac/rolePermissionMapping/entities/rolePermissionMapping.ts +++ b/src/permissionRbac/rolePermissionMapping/entities/rolePermissionMapping.ts @@ -11,34 +11,35 @@ export class RolePermission { @PrimaryGeneratedColumn("uuid") rolePermissionId: string; - @Column() - roleTitle: string; - - @Column() + @Column({ type: "varchar", nullable: false }) module: string; - @Column() - requestType: string; - - @Column() + @Column({ type: "varchar", nullable: false }) apiPath: string; - @Column({ type: "uuid" }) - createdBy: string; - - @Column({ type: "uuid" }) - updatedBy: string; @CreateDateColumn({ type: "timestamptz", default: () => "now()", - nullable: false, + nullable: true, }) - createdAt: Date; + createdAt: Date | null; @UpdateDateColumn({ type: "timestamptz", default: () => "now()", - nullable: false, + nullable: true, }) - updatedAt: Date; + updatedAt: Date | null; + + @Column({ type: "uuid", nullable: true }) + createdBy: string | null; + + @Column({ type: "uuid", nullable: true }) + updatedBy: string | null; + + @Column({ type: "varchar", nullable: true }) + roleTitle: string | null; + + @Column("text", { array: true, nullable: true }) + requestType: string[] | null; } diff --git a/src/permissionRbac/rolePermissionMapping/role-permission-mapping.service.ts b/src/permissionRbac/rolePermissionMapping/role-permission-mapping.service.ts index 30c118c5..9fbfcb78 100644 --- a/src/permissionRbac/rolePermissionMapping/role-permission-mapping.service.ts +++ b/src/permissionRbac/rolePermissionMapping/role-permission-mapping.service.ts @@ -66,7 +66,7 @@ export class RolePermissionService { let result = await this.rolePermissionRepository.save({ roleTitle: permissionCreateDto.roleTitle, apiPath: permissionCreateDto.apiPath, - requestType: permissionCreateDto.requestType, + requestType: permissionCreateDto.requestType, // Already normalized in DTO constructor module: permissionCreateDto.module, }); return APIResponse.success( @@ -99,7 +99,7 @@ export class RolePermissionService { { roleTitle: rolePermissionCreateDto.roleTitle, apiPath: rolePermissionCreateDto.apiPath, - requestType: rolePermissionCreateDto.requestType, + requestType: rolePermissionCreateDto.requestType, // Already normalized in DTO constructor module: rolePermissionCreateDto.module, } ); diff --git a/src/rbac/assign-privilege/entities/assign-privilege.entity.ts b/src/rbac/assign-privilege/entities/assign-privilege.entity.ts index b26a6f4c..313ce812 100644 --- a/src/rbac/assign-privilege/entities/assign-privilege.entity.ts +++ b/src/rbac/assign-privilege/entities/assign-privilege.entity.ts @@ -12,12 +12,9 @@ export class RolePrivilegeMapping { @PrimaryGeneratedColumn("uuid", { name: "rolePrivilegesId" }) rolePrivilegesId: string; - @Column("uuid", { name: "roleId" }) + @Column("uuid", { name: "roleId", nullable: false }) roleId: string; - @Column("uuid", { name: "tenantId" }) - tenantId: string; - @Column("uuid", { name: "createdBy", nullable: true }) createdBy: string | null; @@ -26,18 +23,23 @@ export class RolePrivilegeMapping { @CreateDateColumn({ name: "createdAt", - type: "timestamp with time zone", - default: () => "CURRENT_TIMESTAMP", + type: "timestamptz", + default: () => "now()", + nullable: true, }) - createdAt: Date; + createdAt: Date | null; @UpdateDateColumn({ name: "updatedAt", - type: "timestamp with time zone", - default: () => "CURRENT_TIMESTAMP", + type: "timestamptz", + default: () => "now()", + nullable: true, }) - updatedAt: Date; + updatedAt: Date | null; @Column("uuid", { name: "privilegeId", nullable: true }) privilegeId: string | null; + + @Column("uuid", { name: "tenantId", nullable: true }) + tenantId: string | null; } diff --git a/src/rbac/assign-role/entities/assign-role.entity.ts b/src/rbac/assign-role/entities/assign-role.entity.ts index 82695f6e..aa3b79d5 100644 --- a/src/rbac/assign-role/entities/assign-role.entity.ts +++ b/src/rbac/assign-role/entities/assign-role.entity.ts @@ -14,32 +14,34 @@ export class UserRoleMapping { @PrimaryGeneratedColumn("uuid") userRolesId: string; - @Column("uuid") + @Column("uuid", { nullable: false }) userId: string; - @Column("uuid") - tenantId: string; - - @Column("uuid") + @Column("uuid", { nullable: false }) roleId: string; + @Column("uuid", { nullable: true }) + tenantId: string | null; + + @Column("uuid", { nullable: true }) + createdBy: string | null; + + @Column("uuid", { nullable: true }) + updatedBy: string | null; + @CreateDateColumn({ type: "timestamp with time zone", - default: () => "CURRENT_TIMESTAMP", + default: () => "now()", + nullable: true, }) - createdAt: Date; + createdAt: Date | null; @UpdateDateColumn({ type: "timestamp with time zone", - default: () => "CURRENT_TIMESTAMP", + default: () => "now()", + nullable: true, }) - updatedAt: Date; - - @Column() - createdBy: string; - - @Column() - updatedBy: string; + updatedAt: Date | null; // @ManyToOne(() => User, (user) => user.userRoleMappings) // @JoinColumn({ name: "userId" }) diff --git a/src/rbac/privilege/dto/privilege.dto.ts b/src/rbac/privilege/dto/privilege.dto.ts index 205bde1b..57a38a87 100644 --- a/src/rbac/privilege/dto/privilege.dto.ts +++ b/src/rbac/privilege/dto/privilege.dto.ts @@ -17,13 +17,16 @@ export class PrivilegeDto { description: "Privilege title", default: "", }) - @Expose() + @Expose({name: "title"}) @IsNotEmpty() + name: string; + + // 'title' property for service compatibility - always synced with 'name' title: string; @ApiProperty({ type: String, - description: "Privilege title", + description: "Privilege name", default: "", }) @IsNotEmpty() @@ -44,6 +47,12 @@ export class PrivilegeDto { constructor(obj: any) { Object.assign(this, obj); + // Map 'title' from API to 'name' for database, or use 'name' if present + if (obj) { + this.name = obj.name || obj.title; + // Keep 'title' in sync with 'name' for service compatibility + this.title = this.name; + } } } @@ -58,15 +67,16 @@ export class PrivilegeResponseDto { @Expose() privilegeId: string; - @Expose() - title: string; + @Expose({name: "title"}) + name: string; @Expose() code: string; - constructor(privilegeDto: PrivilegeDto) { + constructor(privilegeDto: PrivilegeDto | any) { this.privilegeId = privilegeDto.privilegeId; - this.title = privilegeDto.title; + // Handle both DTO (with name) and Entity (with name) - both map to 'name' internally + this.name = privilegeDto.name || (privilegeDto as any).title; this.code = privilegeDto.code; } } diff --git a/src/rbac/privilege/entities/privilege.entity.ts b/src/rbac/privilege/entities/privilege.entity.ts index d209d783..e589ea71 100644 --- a/src/rbac/privilege/entities/privilege.entity.ts +++ b/src/rbac/privilege/entities/privilege.entity.ts @@ -12,27 +12,29 @@ export class Privilege { @PrimaryGeneratedColumn("uuid") privilegeId: string; - @Column({ name: "name" }) - title: string; + @Column({ type: "varchar", length: 255, nullable: false }) + name: string; - @Column() - code: string; + @Column({ type: "varchar", length: 255, nullable: true }) + code: string | null; + + @Column("uuid", { nullable: true }) + createdBy: string | null; + + @Column("uuid", { nullable: true }) + updatedBy: string | null; @CreateDateColumn({ - type: "timestamp with time zone", - default: () => "CURRENT_TIMESTAMP", + type: "timestamptz", + default: () => "now()", + nullable: true, }) - createdAt: Date; + createdAt: Date | null; @UpdateDateColumn({ - type: "timestamp with time zone", - default: () => "CURRENT_TIMESTAMP", + type: "timestamptz", + default: () => "now()", + nullable: true, }) - updatedAt: Date; - - @Column() - createdBy: string; - - @Column() - updatedBy: string; + updatedAt: Date | null; } diff --git a/src/rbac/privilege/privilege.service.ts b/src/rbac/privilege/privilege.service.ts index 4e687787..c0a98805 100644 --- a/src/rbac/privilege/privilege.service.ts +++ b/src/rbac/privilege/privilege.service.ts @@ -51,8 +51,13 @@ export class PrivilegeService { privilegeDto.createdBy = loggedinUser; privilegeDto.updatedBy = loggedinUser; - // Create new privilege - const privilege = this.privilegeRepository.create(privilegeDto); + // Create new privilege - map title to name for entity + const entityData = { + ...privilegeDto, + name: privilegeDto.title, // Map title to name for database + }; + delete entityData.title; // Remove title as entity uses name + const privilege = this.privilegeRepository.create(entityData); const response = await this.privilegeRepository.save(privilege); privileges.push(new PrivilegeResponseDto(response)); } @@ -290,8 +295,8 @@ export class PrivilegeService { const result = await this.privilegeRepository.query(query, [roleId]); const privilegeResponseArray: PrivilegeResponseDto[] = result.map( (item: any) => { + // Map 'name' from database to 'title' in DTO (handled in constructor) const privilegeDto = new PrivilegeDto(item); - privilegeDto.title = item.name; return new PrivilegeResponseDto(privilegeDto); } ); diff --git a/src/rbac/role/entities/role.entity.ts b/src/rbac/role/entities/role.entity.ts index e5d2d520..de9caa65 100644 --- a/src/rbac/role/entities/role.entity.ts +++ b/src/rbac/role/entities/role.entity.ts @@ -12,30 +12,32 @@ export class Role { @PrimaryGeneratedColumn("uuid") roleId: string; - @Column({ name: "name" }) + @Column({ type: "varchar", length: 255, nullable: false, name:"name" }) title: string; - @Column() - code: string; + @Column({ type: "varchar", length: 255, nullable: true }) + code: string | null; - @Column("uuid") - tenantId: string; + @Column("uuid", { nullable: true }) + tenantId: string | null; @CreateDateColumn({ - type: "timestamp with time zone", - default: () => "CURRENT_TIMESTAMP", + type: "timestamptz", + default: () => "now()", + nullable: true, }) - createdAt: Date; + createdAt: Date | null; @UpdateDateColumn({ - type: "timestamp with time zone", - default: () => "CURRENT_TIMESTAMP", + type: "timestamptz", + default: () => "now()", + nullable: true, }) - updatedAt: Date; + updatedAt: Date | null; - @Column() - createdBy: string; + @Column("uuid", { nullable: true }) + createdBy: string | null; - @Column() - updatedBy: string; + @Column("uuid", { nullable: true }) + updatedBy: string | null; } diff --git a/src/sso/sso.module.ts b/src/sso/sso.module.ts index 305e595d..bacf37b7 100644 --- a/src/sso/sso.module.ts +++ b/src/sso/sso.module.ts @@ -16,7 +16,7 @@ import { RoleModule } from '../rbac/role/role.module'; import { UserTenantMappingModule } from '../userTenantMapping/user-tenant-mapping.module'; import { UserTenantMapping } from 'src/userTenantMapping/entities/user-tenant-mapping.entity'; import { User } from 'src/user/entities/user-entity'; -import { Tenants } from 'src/userTenantMapping/entities/tenant.entity'; +import { Tenant } from 'src/tenant/entities/tenent.entity'; import { KafkaModule } from 'src/kafka/kafka.module'; @Module({ @@ -36,7 +36,7 @@ import { KafkaModule } from 'src/kafka/kafka.module'; FieldValues, UserTenantMapping, User, - Tenants + Tenant ]) ], controllers: [SsoController], diff --git a/src/tenant/entities/tenent.entity.ts b/src/tenant/entities/tenent.entity.ts index fb19fec3..fdf236bb 100644 --- a/src/tenant/entities/tenent.entity.ts +++ b/src/tenant/entities/tenent.entity.ts @@ -5,6 +5,7 @@ import { Column, CreateDateColumn, UpdateDateColumn, + Generated, } from "typeorm"; export enum TenantStatus { @@ -16,68 +17,69 @@ export enum TenantStatus { @Entity("Tenants") export class Tenant { @PrimaryGeneratedColumn("uuid") - tenantId: string; // UUID field + tenantId: string; - @Column({ type: "text" }) - name: string; // Text field for tenant's name + @Column({ type: "text", nullable: false }) + name: string; @Column({ type: "text", nullable: true }) - type: string | null; // Text field for tenant's type + domain: string | null; - @Column({ type: "text", nullable: true }) - domain: string | null; // Text field for tenant's domain + @CreateDateColumn({ type: "timestamptz", default: () => "now()", nullable: false }) + createdAt: Date; - @CreateDateColumn({ type: "timestamptz", default: () => "CURRENT_TIMESTAMP" }) - createdAt: Date; // Timestamp for creation date with timezone + @UpdateDateColumn({ type: "timestamptz", default: () => "now()", nullable: false }) + updatedAt: Date; - @UpdateDateColumn({ type: "timestamptz", default: () => "CURRENT_TIMESTAMP" }) - updatedAt: Date; // Timestamp for last updated date with timezone + @Column({ type: "jsonb", nullable: true }) + params: Record | null; @Column({ type: "jsonb", nullable: true }) - params: Record; // JSONB field for additional parameters + programImages: string[] | null; - @Column({ type: "json", nullable: true }) - programImages: string[]; // JSON field to store array of program images + @Column({ type: "text", nullable: true }) + description: string | null; - @Column({ type: "text" }) - description: string; + @Column({ type: "uuid", nullable: true }) + createdBy: string | null; - @Column({ - type: "enum", - enum: TenantStatus, - default: TenantStatus.ACTIVE, - }) - status: TenantStatus; + @Column({ type: "uuid", nullable: true }) + updatedBy: string | null; @Column("int4", { nullable: false }) + @Generated("increment") @Min(0) @Max(999999) - ordering: number = 0; + ordering: number; @Column({ type: "text", nullable: true }) - programHead: string | null; // UUID of the user who created the tenant + programHead: string | null; - @Column({ type: 'varchar', length: 255, nullable: true }) - templateId: string; - - @Column({ type: "text" }) - contentFramework: string; + @Column({ + type: "text", + default: TenantStatus.ACTIVE, + nullable: false, + }) + status: TenantStatus; - @Column({ type: "text" }) - channelId: string; + @Column({ type: 'varchar', length: 255, nullable: true }) + templateId: string | null; - @Column({ type: "text" }) - collectionFramework: string; + @Column({ type: "text", nullable: true }) + contentFramework: string | null; - @Column({ type: "uuid", nullable: true }) - createdBy: string | null; // UUID of the user who created the tenant + @Column({ type: "text", nullable: true }) + collectionFramework: string | null; - @Column({ type: "uuid", nullable: true }) - updatedBy: string | null; // UUID of the user who last updated the tenant + @Column({ type: "text", nullable: true }) + channelId: string | null; @Column({ type: 'json', nullable: true }) contentFilter: any; @Column({ type: "uuid", nullable: true }) - parentId: string | null; // UUID of the parent tenant + parentId: string | null; + + @Column({ type: "text", nullable: true }) + type: string | null; } diff --git a/src/user/entities/user-entity.ts b/src/user/entities/user-entity.ts index 4b8fe797..c4a9ba3e 100644 --- a/src/user/entities/user-entity.ts +++ b/src/user/entities/user-entity.ts @@ -19,59 +19,49 @@ export class User { @PrimaryColumn({ type: "uuid" }) userId: string; - @Column({ unique: true }) + @Column({ type: 'varchar', length: 255, unique: true, nullable: false }) username: string; - @Column({ type: 'varchar', length: 50, nullable: false }) - firstName: string; - @Column({ type: 'varchar', length: 50, nullable: true }) - middleName: string; - - @Column({ type: 'varchar', length: 50, nullable: false }) - lastName: string; - - @Column({ type: 'varchar', length: 100, nullable: true }) - name: string; + firstName: string | null; - @Column({ type: 'enum', enum: ['male', 'female', 'transgender'], nullable: false }) - gender: string; + @Column({ type: 'varchar', length: 50, nullable: true }) + middleName: string | null; - @Column({ type: 'varchar', length: 50, nullable: false }) - enrollmentId: string; + @Column({ type: 'varchar', length: 50, nullable: true }) + lastName: string | null; - @Column({ type: "date", nullable: true }) - dob: Date; + @Column({ type: 'varchar', length: 400, nullable: true }) + name: string | null; - @Column({ nullable: true }) - email: string; + @Column({ type: 'enum', enum: ['male', 'female', 'transgender'], nullable: true }) + gender: string | null; - // @Column({ nullable: true }) - // district: string; + @Column({ type: 'varchar', length: 50, nullable: true, unique: true }) + enrollmentId: string | null; - // @Column({ nullable: true }) - // state: string; + @Column({ type: 'varchar', length: 255, nullable: true }) + email: string | null; - @Column({ nullable: true }) - address: string; + @Column({ type: 'varchar', length: 20, nullable: true }) + mobile: string | null; - @Column({ nullable: true }) - pincode: string; + @Column({ type: 'date', nullable: true }) + dob: Date | null; @CreateDateColumn({ type: "timestamp with time zone", default: () => "CURRENT_TIMESTAMP", + nullable: true, }) - createdAt: Date; + createdAt: Date | null; @UpdateDateColumn({ type: "timestamp with time zone", default: () => "CURRENT_TIMESTAMP", + nullable: true, }) - updatedAt: Date; - - @Column({ nullable: true }) - mobile: number; + updatedAt: Date | null; @Column('text', { array: true, nullable: true }) deviceId: string[]; @@ -79,21 +69,22 @@ export class User { @Column({ nullable: false, default: true }) temporaryPassword: boolean; - @Column({ nullable: true }) - createdBy: string; + @Column({ type: 'uuid', nullable: true }) + createdBy: string | null; - @Column({ nullable: true }) - updatedBy: string; + @Column({ type: 'uuid', nullable: true }) + updatedBy: string | null; @Column({ type: "enum", enum: UserStatus, default: UserStatus.ACTIVE, + nullable: true, }) - status: UserStatus; + status: UserStatus | null; - @Column({ nullable: true }) - reason: string; + @Column({ type: 'varchar', length: 255, nullable: true }) + reason: string | null; @Column({ type: "timestamptz", nullable: true }) lastLogin: Date | null; // Timestamp for last login diff --git a/src/user/user.module.ts b/src/user/user.module.ts index d3a305f4..1d0f1908 100644 --- a/src/user/user.module.ts +++ b/src/user/user.module.ts @@ -9,7 +9,7 @@ import { FieldValues } from "../fields/entities/fields-values.entity"; import { Fields } from "src/fields/entities/fields.entity"; import { CohortMembers } from "src/cohortMembers/entities/cohort-member.entity"; import { UserTenantMapping } from "src/userTenantMapping/entities/user-tenant-mapping.entity"; -import { Tenants } from "src/userTenantMapping/entities/tenant.entity"; +import { Tenant } from "src/tenant/entities/tenent.entity"; import { UserRoleMapping } from "src/rbac/assign-role/entities/assign-role.entity"; import { Cohort } from "src/cohort/entities/cohort.entity"; import { Role } from "src/rbac/role/entities/role.entity"; @@ -33,7 +33,7 @@ import { AuthUtils } from "src/common/utils/auth-util"; Fields, CohortMembers, UserTenantMapping, - Tenants, + Tenant, UserRoleMapping, Cohort, Role, diff --git a/src/user/user.service.ts b/src/user/user.service.ts index 4bb6143f..c61f27e2 100644 --- a/src/user/user.service.ts +++ b/src/user/user.service.ts @@ -22,7 +22,7 @@ import { HierarchicalLocationFiltersDto } from "./dto/user-hierarchical-search.d import { UserHierarchyViewDto } from "./dto/user-hierarchy-view.dto"; import { UserTenantMapping, UserTenantMappingStatus } from "src/userTenantMapping/entities/user-tenant-mapping.entity"; import { UserRoleMapping } from "src/rbac/assign-role/entities/assign-role.entity"; -import { Tenants } from "src/userTenantMapping/entities/tenant.entity"; +import { Tenant } from "src/tenant/entities/tenent.entity"; import { Cohort } from "src/cohort/entities/cohort.entity"; import { Role } from "src/rbac/role/entities/role.entity"; import { UserData } from "./user.controller"; @@ -82,8 +82,8 @@ export class UserService { private cohortMemberRepository: Repository, @InjectRepository(UserTenantMapping) private userTenantMappingRepository: Repository, - @InjectRepository(Tenants) - private tenantsRepository: Repository, + @InjectRepository(Tenant) + private tenantsRepository: Repository, @InjectRepository(UserRoleMapping) private userRoleMappingRepository: Repository, @InjectRepository(Role) @@ -2156,7 +2156,7 @@ export class UserService { user.lastName = userCreateDto?.lastName, user.gender = userCreateDto?.gender, user.email = userCreateDto?.email, - user.mobile = Number(userCreateDto?.mobile) || null, + user.mobile = userCreateDto?.mobile || null, user.createdBy = userCreateDto?.createdBy || userCreateDto?.createdBy; if (userCreateDto?.dob) { diff --git a/src/userTenantMapping/entities/tenant.entity.ts b/src/userTenantMapping/entities/tenant.entity.ts deleted file mode 100644 index b223121c..00000000 --- a/src/userTenantMapping/entities/tenant.entity.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { - Entity, - PrimaryGeneratedColumn, - Column, - CreateDateColumn, - UpdateDateColumn, -} from "typeorm"; - -export enum TenantStatus { - ACTIVE = "active", - INACTIVE = "inactive", - ARCHIVED = "archived", -} - -@Entity({ name: "Tenants" }) -export class Tenants { - @PrimaryGeneratedColumn("uuid") - tenantId: string; - - @Column() - name: string; - - @Column() - domain: string; - - @Column({ - type: "enum", - enum: TenantStatus, - default: TenantStatus.ACTIVE, - }) - status: TenantStatus; - - @Column({ type: "uuid", nullable: true }) - parentId: string; - - @Column({ type: "uuid", nullable: true }) - createdBy: string; - - @Column({ type: "uuid", nullable: true }) - updatedBy: string; - - @CreateDateColumn({ - type: "timestamp with time zone", - default: () => "CURRENT_TIMESTAMP", - }) - createdAt: Date; - - @UpdateDateColumn({ - type: "timestamp with time zone", - default: () => "CURRENT_TIMESTAMP", - }) - updatedAt: Date; -} diff --git a/src/userTenantMapping/entities/user-tenant-mapping.entity.ts b/src/userTenantMapping/entities/user-tenant-mapping.entity.ts index b3439d98..8d68c962 100644 --- a/src/userTenantMapping/entities/user-tenant-mapping.entity.ts +++ b/src/userTenantMapping/entities/user-tenant-mapping.entity.ts @@ -40,20 +40,22 @@ export class UserTenantMapping { @CreateDateColumn({ type: "timestamp with time zone", default: () => "CURRENT_TIMESTAMP", + nullable: true, }) - createdAt: Date; + createdAt: Date | null; @UpdateDateColumn({ type: "timestamp with time zone", default: () => "CURRENT_TIMESTAMP", + nullable: true, }) - updatedAt: Date; + updatedAt: Date | null; - @Column() - createdBy: string; + @Column({ type: "uuid", nullable: true }) + createdBy: string | null; - @Column() - updatedBy: string; + @Column({ type: "uuid", nullable: true }) + updatedBy: string | null; @ManyToOne(() => User, (user) => user.userTenantMapping) @JoinColumn({ name: "userId" }) diff --git a/src/userTenantMapping/user-tenant-mapping.module.ts b/src/userTenantMapping/user-tenant-mapping.module.ts index dfea8601..b9df66fc 100644 --- a/src/userTenantMapping/user-tenant-mapping.module.ts +++ b/src/userTenantMapping/user-tenant-mapping.module.ts @@ -5,7 +5,7 @@ import { TypeOrmModule } from "@nestjs/typeorm"; import { UserTenantMapping } from "./entities/user-tenant-mapping.entity"; import { UserTenantMappingService } from "./user-tenant-mapping.service"; import { User } from "src/user/entities/user-entity"; -import { Tenants } from "src/userTenantMapping/entities/tenant.entity"; +import { Tenant } from "src/tenant/entities/tenent.entity"; import { Role } from "src/rbac/role/entities/role.entity"; import { UserRoleMapping } from "src/rbac/assign-role/entities/assign-role.entity"; import { KafkaModule } from "src/kafka/kafka.module"; @@ -17,7 +17,7 @@ import { FieldsModule } from "src/fields/fields.module"; TypeOrmModule.forFeature([ UserTenantMapping, User, - Tenants, + Tenant, Role, UserRoleMapping, ]), diff --git a/src/userTenantMapping/user-tenant-mapping.service.ts b/src/userTenantMapping/user-tenant-mapping.service.ts index 3f8cd854..f0757db6 100644 --- a/src/userTenantMapping/user-tenant-mapping.service.ts +++ b/src/userTenantMapping/user-tenant-mapping.service.ts @@ -9,7 +9,7 @@ import { import { ErrorResponseTypeOrm } from "src/error-response-typeorm"; import { SuccessResponse } from "src/success-response"; import { User } from "src/user/entities/user-entity"; -import { Tenants } from "src/userTenantMapping/entities/tenant.entity"; +import { Tenant } from "src/tenant/entities/tenent.entity"; import { Role } from "src/rbac/role/entities/role.entity"; import { UserRoleMapping } from "src/rbac/assign-role/entities/assign-role.entity"; import APIResponse from "src/common/responses/response"; @@ -29,8 +29,8 @@ export class UserTenantMappingService { private userTenantMappingRepository: Repository, @InjectRepository(User) private userRepository: Repository, - @InjectRepository(Tenants) - private tenantsRepository: Repository, + @InjectRepository(Tenant) + private tenantsRepository: Repository, @InjectRepository(Role) private roleRepository: Repository, @InjectRepository(UserRoleMapping) From 04b8a5b68698f67de17190f26bbee0348d17c950 Mon Sep 17 00:00:00 2001 From: souravbhowmik1999 Date: Fri, 26 Dec 2025 17:11:36 +0530 Subject: [PATCH 2/2] add --- src/rbac/privilege/dto/privilege.dto.ts | 18 ++++-------------- .../privilege/entities/privilege.entity.ts | 4 ++-- src/rbac/privilege/privilege.service.ts | 9 ++------- 3 files changed, 8 insertions(+), 23 deletions(-) diff --git a/src/rbac/privilege/dto/privilege.dto.ts b/src/rbac/privilege/dto/privilege.dto.ts index 57a38a87..f7a590c2 100644 --- a/src/rbac/privilege/dto/privilege.dto.ts +++ b/src/rbac/privilege/dto/privilege.dto.ts @@ -17,11 +17,8 @@ export class PrivilegeDto { description: "Privilege title", default: "", }) - @Expose({name: "title"}) + @Expose() @IsNotEmpty() - name: string; - - // 'title' property for service compatibility - always synced with 'name' title: string; @ApiProperty({ @@ -47,12 +44,6 @@ export class PrivilegeDto { constructor(obj: any) { Object.assign(this, obj); - // Map 'title' from API to 'name' for database, or use 'name' if present - if (obj) { - this.name = obj.name || obj.title; - // Keep 'title' in sync with 'name' for service compatibility - this.title = this.name; - } } } @@ -67,16 +58,15 @@ export class PrivilegeResponseDto { @Expose() privilegeId: string; - @Expose({name: "title"}) - name: string; + @Expose() + title: string; @Expose() code: string; constructor(privilegeDto: PrivilegeDto | any) { this.privilegeId = privilegeDto.privilegeId; - // Handle both DTO (with name) and Entity (with name) - both map to 'name' internally - this.name = privilegeDto.name || (privilegeDto as any).title; + this.title = privilegeDto.title; this.code = privilegeDto.code; } } diff --git a/src/rbac/privilege/entities/privilege.entity.ts b/src/rbac/privilege/entities/privilege.entity.ts index e589ea71..91386fe4 100644 --- a/src/rbac/privilege/entities/privilege.entity.ts +++ b/src/rbac/privilege/entities/privilege.entity.ts @@ -12,8 +12,8 @@ export class Privilege { @PrimaryGeneratedColumn("uuid") privilegeId: string; - @Column({ type: "varchar", length: 255, nullable: false }) - name: string; + @Column({ type: "varchar", length: 255, nullable: false, name: "name" }) + title: string; @Column({ type: "varchar", length: 255, nullable: true }) code: string | null; diff --git a/src/rbac/privilege/privilege.service.ts b/src/rbac/privilege/privilege.service.ts index c0a98805..f6bb1c6a 100644 --- a/src/rbac/privilege/privilege.service.ts +++ b/src/rbac/privilege/privilege.service.ts @@ -51,13 +51,8 @@ export class PrivilegeService { privilegeDto.createdBy = loggedinUser; privilegeDto.updatedBy = loggedinUser; - // Create new privilege - map title to name for entity - const entityData = { - ...privilegeDto, - name: privilegeDto.title, // Map title to name for database - }; - delete entityData.title; // Remove title as entity uses name - const privilege = this.privilegeRepository.create(entityData); + // Create new privilege - DTO already uses 'name' which matches entity + const privilege = this.privilegeRepository.create(privilegeDto); const response = await this.privilegeRepository.save(privilege); privileges.push(new PrivilegeResponseDto(response)); }