Files
cloud-host/backend/src/users/entities/user.entity.ts
T
keyhan 22359be40e fix(platform): apply production hardening from audit plan
Close billing, tenancy, migration, build, and CI/CD gaps identified in the
audit: wallet/gateway guards, full-UUID namespaces, idempotent migrations with
base schema, stateful service stability, safer Dockerfiles/git builds, and
platform chart hardening (Redis auth, RollingUpdate, backups, Swagger off).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 19:35:07 +03:30

63 lines
1.7 KiB
TypeScript

import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
OneToMany,
} from 'typeorm';
import { Exclude } from 'class-transformer';
import { UserRole } from '../../common/enums';
import { Application } from '../../applications/entities/application.entity';
@Entity('users')
export class User {
@PrimaryGeneratedColumn('uuid')
id: string;
// Phone is the login identifier (required at registration). Email is an
// optional contact field only — it is never used to authenticate.
// Both are unique; Postgres treats NULLs as distinct, so accounts missing
// either coexist freely.
// NOTE: nullable string columns MUST declare an explicit `type` — TypeScript
// reflects the `string | null` union as `Object`, which TypeORM rejects with
// DataTypeNotSupportedError and crashes the backend at metadata build.
@Column({ type: 'varchar', unique: true, nullable: true })
phone: string | null; // canonical E.164, e.g. +989121234567
@Column({ type: 'varchar', unique: true, nullable: true })
email: string | null;
@Column({ default: false })
phoneVerified: boolean;
/** Bcrypt hash — never serialized into API responses. */
@Exclude({ toPlainOnly: true })
@Column()
password: string;
@Column()
firstName: string;
@Column()
lastName: string;
@Column({ type: 'enum', enum: UserRole, default: UserRole.USER })
role: UserRole;
@Column({ default: true })
isActive: boolean;
@Column({ nullable: true })
namespace: string; // K8s namespace assigned to user
@OneToMany(() => Application, (app: Application) => app.user)
applications: Application[];
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}