2025-01-29 19:02:59 +00:00
|
|
|
import { v4 as uuidv4 } from "uuid";
|
|
|
|
|
import { z } from "zod";
|
2025-02-01 21:48:13 +00:00
|
|
|
import { Result } from "../result";
|
2025-01-29 19:02:59 +00:00
|
|
|
import { ValueObject } from "./value-object";
|
|
|
|
|
|
2025-02-04 18:25:10 +00:00
|
|
|
export const UNDEFINED_ID = undefined;
|
|
|
|
|
|
|
|
|
|
export class UniqueID extends ValueObject<string | undefined> {
|
|
|
|
|
protected readonly _hasId!: boolean;
|
|
|
|
|
|
|
|
|
|
protected constructor(id?: string) {
|
|
|
|
|
super(id);
|
|
|
|
|
this._hasId = id != UNDEFINED_ID;
|
|
|
|
|
}
|
2025-01-29 19:02:59 +00:00
|
|
|
|
|
|
|
|
static create(id?: string, generateOnEmpty: boolean = false): Result<UniqueID, Error> {
|
2025-02-04 18:25:10 +00:00
|
|
|
if (id === null) {
|
|
|
|
|
return Result.fail(new Error("ID cannot be null"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const trimmedId = id?.trim();
|
|
|
|
|
if (!trimmedId) {
|
|
|
|
|
return generateOnEmpty ? UniqueID.generateNewID() : Result.ok(new UniqueID(UNDEFINED_ID));
|
2025-01-29 19:02:59 +00:00
|
|
|
}
|
|
|
|
|
|
2025-02-04 18:25:10 +00:00
|
|
|
const result = UniqueID.validate(trimmedId);
|
2025-01-29 19:02:59 +00:00
|
|
|
|
|
|
|
|
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<UniqueID, never> {
|
|
|
|
|
return Result.ok(new UniqueID(uuidv4()));
|
|
|
|
|
}
|
2025-02-04 18:25:10 +00:00
|
|
|
|
|
|
|
|
static generateUndefinedID(): Result<UniqueID, never> {
|
|
|
|
|
return Result.ok(new UniqueID(UNDEFINED_ID));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
isDefined(): boolean {
|
|
|
|
|
return this._hasId;
|
|
|
|
|
}
|
2025-01-29 19:02:59 +00:00
|
|
|
}
|