From 860246ad5d85230cef9f5b33a6962084d6845e7b Mon Sep 17 00:00:00 2001 From: abdulmujibOladayo Date: Sat, 21 Feb 2026 14:50:05 +0100 Subject: [PATCH] designed the entity and database schema for the assets module --- backend/src/assets/asset-document.entity.ts | 35 ++++++ backend/src/assets/asset-history.entity.ts | 43 ++++++++ backend/src/assets/asset-note.entity.ts | 31 ++++++ backend/src/assets/asset.entity.ts | 111 ++++++++++++++++++++ 4 files changed, 220 insertions(+) create mode 100644 backend/src/assets/asset-document.entity.ts create mode 100644 backend/src/assets/asset-history.entity.ts create mode 100644 backend/src/assets/asset-note.entity.ts create mode 100644 backend/src/assets/asset.entity.ts diff --git a/backend/src/assets/asset-document.entity.ts b/backend/src/assets/asset-document.entity.ts new file mode 100644 index 0000000..e773b1a --- /dev/null +++ b/backend/src/assets/asset-document.entity.ts @@ -0,0 +1,35 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + ManyToOne, + CreateDateColumn, +} from 'typeorm'; +import { User } from '../users/user.entity'; + +@Entity('asset_documents') +export class AssetDocument { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + assetId: string; + + @Column() + name: string; + + @Column() + url: string; + + @Column({ default: 'application/octet-stream' }) + type: string; + + @Column({ nullable: true }) + size: number | null; + + @ManyToOne(() => User, { eager: true }) + uploadedBy: User; + + @CreateDateColumn() + createdAt: Date; +} diff --git a/backend/src/assets/asset-history.entity.ts b/backend/src/assets/asset-history.entity.ts new file mode 100644 index 0000000..69c08eb --- /dev/null +++ b/backend/src/assets/asset-history.entity.ts @@ -0,0 +1,43 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + ManyToOne, + JoinColumn, + CreateDateColumn, +} from 'typeorm'; +import { Asset } from './asset.entity'; +import { User } from '../users/user.entity'; +import { AssetHistoryAction } from './enums'; + +@Entity('asset_history') +export class AssetHistory { + @PrimaryGeneratedColumn('uuid') + id: string; + + @ManyToOne(() => Asset, { onDelete: 'CASCADE' }) + @JoinColumn({ name: 'assetId' }) + asset: Asset; + + @Column() + assetId: string; + + @Column({ type: 'enum', enum: AssetHistoryAction }) + action: AssetHistoryAction; + + @Column() + description: string; + + @Column({ type: 'jsonb', nullable: true }) + previousValue: Record | null; + + @Column({ type: 'jsonb', nullable: true }) + newValue: Record | null; + + @ManyToOne(() => User, { eager: true, nullable: true }) + @JoinColumn({ name: 'performedById' }) + performedBy: User | null; + + @CreateDateColumn() + createdAt: Date; +} diff --git a/backend/src/assets/asset-note.entity.ts b/backend/src/assets/asset-note.entity.ts new file mode 100644 index 0000000..451429d --- /dev/null +++ b/backend/src/assets/asset-note.entity.ts @@ -0,0 +1,31 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + ManyToOne, + JoinColumn, + CreateDateColumn, + UpdateDateColumn, +} from 'typeorm'; +import { User } from '../users/user.entity'; + +@Entity('asset_notes') +export class AssetNote { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + assetId: string; + + @Column('text') + content: string; + + @ManyToOne(() => User, { eager: true }) + createdBy: User; + + @CreateDateColumn() + createdAt: Date; + + @UpdateDateColumn() + updatedAt: Date; +} diff --git a/backend/src/assets/asset.entity.ts b/backend/src/assets/asset.entity.ts new file mode 100644 index 0000000..7c19fb2 --- /dev/null +++ b/backend/src/assets/asset.entity.ts @@ -0,0 +1,111 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + ManyToOne, + JoinColumn, + CreateDateColumn, + UpdateDateColumn, +} from 'typeorm'; +import { User } from '../users/user.entity'; +import { Department } from '../departments/department.entity'; +import { Category } from '../categories/category.entity'; +import { AssetStatus, AssetCondition, StellarStatus } from './enums'; + +@Entity('assets') +export class Asset { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ unique: true }) + assetId: string; + + @Column() + name: string; + + @Column({ nullable: true, type: 'text' }) + description: string | null; + + @ManyToOne(() => Category, { eager: true, nullable: false }) + @JoinColumn({ name: 'categoryId' }) + category: Category; + + @Column({ nullable: true }) + serialNumber: string | null; + + @Column({ nullable: true, type: 'date' }) + purchaseDate: Date | null; + + @Column({ nullable: true, type: 'decimal', precision: 15, scale: 2 }) + purchasePrice: number | null; + + @Column({ nullable: true, type: 'decimal', precision: 15, scale: 2 }) + currentValue: number | null; + + @Column({ nullable: true, type: 'date' }) + warrantyExpiration: Date | null; + + @Column({ type: 'enum', enum: AssetStatus, default: AssetStatus.ACTIVE }) + status: AssetStatus; + + @Column({ type: 'enum', enum: AssetCondition, default: AssetCondition.NEW }) + condition: AssetCondition; + + @ManyToOne(() => Department, { eager: true, nullable: false }) + @JoinColumn({ name: 'departmentId' }) + department: Department; + + @Column({ nullable: true }) + location: string | null; + + @ManyToOne(() => User, { eager: true, nullable: true }) + @JoinColumn({ name: 'assignedToId' }) + assignedTo: User | null; + + @Column({ type: 'simple-array', nullable: true }) + imageUrls: string[] | null; + + @Column({ type: 'jsonb', nullable: true }) + customFields: Record | null; + + @Column({ type: 'simple-array', nullable: true }) + tags: string[] | null; + + @Column({ nullable: true }) + manufacturer: string | null; + + @Column({ nullable: true }) + model: string | null; + + @Column({ nullable: true }) + barcode: string | null; + + @Column({ nullable: true }) + qrCode: string | null; + + @Column({ nullable: true, type: 'text' }) + notes: string | null; + + @Column({ nullable: true }) + stellarAssetId: string | null; + + @Column({ nullable: true }) + stellarTxHash: string | null; + + @Column({ type: 'enum', enum: StellarStatus, default: StellarStatus.NOT_REGISTERED }) + stellarStatus: StellarStatus; + + @ManyToOne(() => User, { nullable: true }) + @JoinColumn({ name: 'createdById' }) + createdBy: User | null; + + @ManyToOne(() => User, { nullable: true }) + @JoinColumn({ name: 'updatedById' }) + updatedBy: User | null; + + @CreateDateColumn() + createdAt: Date; + + @UpdateDateColumn() + updatedAt: Date; +}