diff --git a/src/modules/auth/entities/user.entity.ts b/src/modules/auth/entities/user.entity.ts index b12342a..51806a1 100644 --- a/src/modules/auth/entities/user.entity.ts +++ b/src/modules/auth/entities/user.entity.ts @@ -31,12 +31,18 @@ export class User { @Column({ type: 'varchar', length: 100, nullable: true }) last_name: string | null; + @Column({ type: 'varchar', length: 200, nullable: true }) + display_name: string | null; + @Column({ type: 'varchar', length: 255, nullable: true }) avatar_url: string | null; @Column({ type: 'varchar', length: 20, nullable: true }) phone: string | null; + @Column({ type: 'boolean', default: false }) + phone_verified: boolean; + @Column({ type: 'enum', enum: ['active', 'inactive', 'suspended', 'pending_verification'], @@ -45,6 +51,9 @@ export class User { }) status: string; + @Column({ type: 'boolean', default: false }) + is_owner: boolean; + @Column({ type: 'boolean', default: false }) email_verified: boolean; @@ -63,6 +72,15 @@ export class User { @Column({ type: 'timestamp with time zone', nullable: true }) mfa_enabled_at: Date | null; + @Column({ type: 'timestamp with time zone', nullable: true }) + password_changed_at: Date | null; + + @Column({ type: 'int', default: 0 }) + failed_login_attempts: number; + + @Column({ type: 'timestamp with time zone', nullable: true }) + locked_until: Date | null; + @Column({ type: 'timestamp with time zone', nullable: true }) last_login_at: Date | null; @@ -72,6 +90,12 @@ export class User { @Column({ type: 'jsonb', nullable: true }) metadata: Record | null; + @Column({ type: 'jsonb', nullable: true }) + preferences: Record | null; + + @Column({ type: 'timestamp with time zone', nullable: true }) + last_activity_at: Date | null; + @CreateDateColumn({ type: 'timestamp with time zone' }) created_at: Date; diff --git a/src/modules/rbac/entities/role.entity.ts b/src/modules/rbac/entities/role.entity.ts index 4026c32..d123f20 100644 --- a/src/modules/rbac/entities/role.entity.ts +++ b/src/modules/rbac/entities/role.entity.ts @@ -26,9 +26,22 @@ export class Role { @Index() code: string; + @Column({ type: 'varchar', length: 50, nullable: true }) + @Index() + slug: string | null; + @Column({ type: 'text', nullable: true }) description: string | null; + @Column({ type: 'jsonb', nullable: true }) + permissions: string[] | null; + + @Column({ type: 'uuid', nullable: true }) + parent_role_id: string | null; + + @Column({ type: 'int', default: 0 }) + level: number; + @Column({ type: 'boolean', default: false }) is_system: boolean; diff --git a/src/modules/tenants/entities/tenant.entity.ts b/src/modules/tenants/entities/tenant.entity.ts index de0f0d6..847fd07 100644 --- a/src/modules/tenants/entities/tenant.entity.ts +++ b/src/modules/tenants/entities/tenant.entity.ts @@ -36,9 +36,26 @@ export class Tenant { @Column({ type: 'uuid', nullable: true }) plan_id: string | null; + @Column({ + type: 'enum', + enum: ['trialing', 'active', 'past_due', 'cancelled', 'unpaid'], + enumName: 'tenants.subscription_status', + nullable: true, + }) + subscription_status: 'trialing' | 'active' | 'past_due' | 'cancelled' | 'unpaid' | null; + + @Column({ type: 'varchar', length: 255, nullable: true }) + stripe_customer_id: string | null; + + @Column({ type: 'varchar', length: 255, nullable: true }) + stripe_subscription_id: string | null; + @Column({ type: 'timestamp with time zone', nullable: true }) trial_ends_at: Date | null; + @Column({ type: 'timestamp with time zone', nullable: true }) + subscription_ends_at: Date | null; + @Column({ type: 'jsonb', nullable: true }) settings: Record | null; @@ -50,4 +67,7 @@ export class Tenant { @UpdateDateColumn({ type: 'timestamp with time zone' }) updated_at: Date; + + @Column({ type: 'timestamp with time zone', nullable: true }) + deleted_at: Date | null; }