import { v4 as uuidv4 } from "uuid"; import { z } from "zod"; import { Result } from "../result"; import { ValueObject } from "./value-object"; const UUIDSchema = z.string().uuid({ message: "Invalid UUID format" }); export class UniqueID extends ValueObject { static create(id?: string, generateOnEmpty: boolean = false): Result { if (!id) { return generateOnEmpty ? UniqueID.generateNewID() : Result.fail(new Error("ID is null or empty")); } const result = UniqueID.validate(id.trim()); return result.success ? Result.ok(new UniqueID(result.data)) : Result.fail(new Error(result.error.errors[0].message)); } static generate(): UniqueID { return new UniqueID(uuidv4()); } static validate(id: string) { const schema = z.string().uuid({ message: "Invalid UUID format" }); return schema.safeParse(id.trim()); } static generateNewID(): Result { return Result.ok(new UniqueID(uuidv4())); } }