Loading...
Loading...
[Pragmatic DDD Architecture] Guide for creating DDD Entities and Aggregates. Use when defining new domain entities with business rules, private state, and getters. Covers entity instantiation via objects, integration with Value Objects, and the rule against using setters.
npx skill4agent add leif-sync/pragmatic-ddd entitiesUUIDfolderIduserIdUUIDprivateprivate readonlysetupdate(data)rename(newName: FolderName)setName(newName: string)paramsconstructor(params: { ... })infrastructure/getId()getName()<EntityName>SnapshottoSnapshot().toBranded()import { UUID, type BrandedUUID } from "@/shared/domain/value-objects/uuid";
import { FolderName, type BrandedFolderName } from "../value-objects/folderName";
// 1. Snapshot definition (No private fields like password hashes)
export type FolderSnapshot = {
folderId: BrandedUUID;
folderName: BrandedFolderName;
createdAt: Date;
updatedAt: Date;
};
export class Folder {
// 2. Private properties, strictly typed with VOs
private readonly folderId: UUID;
private folderName: FolderName;
private readonly createdAt: Date;
private updatedAt: Date;
// 3. Object parameter constructor
constructor(params: {
folderId: UUID;
folderName: FolderName;
createdAt: Date;
updatedAt: Date;
}) {
this.folderId = params.folderId;
this.folderName = params.folderName;
this.createdAt = params.createdAt;
this.updatedAt = params.updatedAt;
}
// 4. Domain behavior (mutates state with intent)
rename(newName: FolderName): void {
// Optionally apply business rules here before mutation
this.folderName = newName;
this.updatedAt = new Date();
}
// 5. Explicit Getters
getId(): UUID {
return this.folderId;
}
getName(): FolderName {
return this.folderName;
}
getCreatedAt(): Date {
return this.createdAt;
}
getUpdatedAt(): Date {
return this.updatedAt;
}
// 6. Snapshot builder
toSnapshot(): FolderSnapshot {
return {
folderId: this.folderId.toBranded(),
folderName: this.folderName.toBranded(),
createdAt: this.createdAt,
updatedAt: this.updatedAt,
};
}
}ResultneverthrowUUID.from()FolderName.from()new <Entity>({ ... })UUID.random().toSnapshot()SnapshotWorkspaceTeamMembers