Files
gridpilot.gg/core/identity/domain/entities/Company.ts
2026-01-07 13:26:31 +01:00

98 lines
2.2 KiB
TypeScript

import { UserId } from '../value-objects/UserId';
export interface CompanyProps {
id: string;
name: string;
ownerUserId: UserId;
contactEmail: string | undefined;
createdAt: Date;
}
export class Company {
private readonly id: string;
private readonly name: string;
private readonly ownerUserId: UserId;
private readonly contactEmail: string | undefined;
private readonly createdAt: Date;
private constructor(props: CompanyProps) {
this.validateName(props.name);
this.id = props.id;
this.name = props.name;
this.ownerUserId = props.ownerUserId;
this.contactEmail = props.contactEmail;
this.createdAt = props.createdAt;
}
private validateName(name: string): void {
const trimmed = name?.trim();
if (!trimmed) {
throw new Error('Company name cannot be empty');
}
if (trimmed.length < 2) {
throw new Error('Company name must be at least 2 characters long');
}
if (trimmed.length > 100) {
throw new Error('Company name must be no more than 100 characters');
}
}
public static create(props: {
name: string;
ownerUserId: UserId;
contactEmail?: string;
}): Company {
return new Company({
id: this.generateId(),
name: props.name,
ownerUserId: props.ownerUserId,
contactEmail: props.contactEmail,
createdAt: new Date(),
});
}
public static rehydrate(props: {
id: string;
name: string;
ownerUserId: string;
contactEmail?: string;
createdAt: Date;
}): Company {
return new Company({
id: props.id,
name: props.name,
ownerUserId: UserId.fromString(props.ownerUserId),
contactEmail: props.contactEmail,
createdAt: props.createdAt,
});
}
private static generateId(): string {
// Simple UUID-like generation for now
return `comp_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
}
public getId(): string {
return this.id;
}
public getName(): string {
return this.name;
}
public getOwnerUserId(): UserId {
return this.ownerUserId;
}
public getContactEmail(): string | undefined {
return this.contactEmail;
}
public getCreatedAt(): Date {
return this.createdAt;
}
}