import { BaseEntity, Column, Entity, IsNull, Not, OneToMany, PrimaryGeneratedColumn, VirtualColumn } from "typeorm"; import Item from "../../../domain/entities/item"; import User from "../../../domain/entities/user"; import ItemType from "../../../domain/entities/vo/itemType.vo"; import { StockRecord } from "./stock.record"; @Entity("items", { synchronize: true }) export class ItemRecord extends BaseEntity { @PrimaryGeneratedColumn("uuid") id: string; @Column() name: string; @Column() description: string; @Column({ type: "simple-enum", enum: ItemType }) type: ItemType; @Column() price: number; @Column() image: string; @Column({ nullable: true }) link?: string; @Column({ nullable: true }) dueDate?: Date; @Column({ default: true }) visible: boolean; @Column({ default: true }) available: boolean; @Column({ nullable: true }) onClickRedirect?: string; @OneToMany(() => StockRecord, (stock) => stock.item, { eager: true }) stock: StockRecord[]; toAsyncEntity = async (user?: User): Promise => { return new Item({ id: this.id, name: this.name, description: this.description, price: this.price, type: this.type, link: this.link, dueDate: this.dueDate, image: this.image, user: user, visible: this.visible, onClickRedirect: this.onClickRedirect, totalCodes: this.stock?.length, couponsAvailable: (await StockRecord.findAndCountBy({ item: { id: this.id }, encodedCode: Not(IsNull()), assignedToId: IsNull() }))[1], couponsTaken: (await StockRecord.findAndCountBy({ item: { id: this.id }, encodedCode: Not(IsNull()), assignedToId: Not(IsNull()) }))[1], availableStock: (await StockRecord.findAndCountBy({ item: { id: this.id }, assignedToId: IsNull() }))[1], assigned: !user ? 0 : ((await StockRecord.findAndCountBy({ item: { id: this.id }, assignedToId: user?.id }))[1]) }); }; toEntity = (): Item => { return new Item({ id: this.id, name: this.name, description: this.description, price: this.price, type: this.type, link: this.link, dueDate: this.dueDate, image: this.image, availableStock: this.stock?.length, assigned: 0, onClickRedirect: this.onClickRedirect, }); }; }