Domain Models
O TyForge fornece blocos de construção para Domain-Driven Design (DDD) com suporte a serialização automática de TypeFields, comparação por identidade ou estrutura, e emissão de eventos de domínio.
Hierarquia de classes
Classe base: Class
Toda hierarquia parte de Class, que exige que cada subclasse defina seus metadados:
abstract class Class {
protected abstract readonly _classInfo: TClassInfo;
public getClassInfo(): TClassInfo;
}
type TClassInfo = {
name: string;
version: string;
description: string;
};
ClassDomainModels<TProps, TPropsJson>
Classe intermediária que adiciona os métodos de serialização:
toJSON(config?)
Converte todas as propriedades da instância para seus valores primitivos. TypeFields são automaticamente desembrulhados via getValue(). Objetos aninhados com toJSON() são recursivamente convertidos.
const json = entidade.toJSON();
// Todas as propriedades TypeField são convertidas para primitivos
// Com configuração de data
const jsonDateStr = entidade.toJSON({ date: "string" });
// Campos FDate são serializados como string no formato específico
Configuração de data:
{ date: "string" }(padrão) — camposFDatesão convertidos viatoString()no formato da subclasse{ date: "date" }— camposFDateretornam o objetoDatenativo
toPrimitives<TInput, TOutput>(input)
Método estático utilitário para converter qualquer objeto com TypeFields para primitivos:
const primitivos = ClassDomainModels.toPrimitives<TProps, TPropsJson>(props);
deepUnwrap(input, config?)
Método privado que realiza o unwrap recursivo:
- Arrays — cada item é processado recursivamente
- Objetos com
toJSON()— delegam para seu própriotoJSON() - Objetos com
getValue()(TypeFields) — retornam o valor primitivo - Campos
FDatecomconfig.date === "string"— retornamtoString() - Campos
undefined— são omitidos do resultado - Outros valores — retornados sem modificação
Exposição e redação de campos
O toJSON() suporta controle de visibilidade por campo via a propriedade expose do schema. Isso permite omitir ou redactar campos sensíveis na serialização, sem necessidade de lógica manual.
Configuração no schema
Cada campo do schema aceita a propriedade expose com tres niveis:
import { FString, FEmail } from "tyforge";
import type { ISchema } from "tyforge";
const userSchema = {
name: { type: FString, expose: "public" },
email: { type: FEmail, expose: "private" },
passwordHash: { type: FString, expose: "redacted" },
} satisfies ISchema;
Níveis de visibilidade
| Nível | Valor numérico | Descrição |
|---|---|---|
"public" | 1 | Visível em todas as serializações |
"private" | 2 | Visível apenas quando solicitado explicitamente |
"redacted" | 3 | Substituído por "[REDACTED]" na maioria dos contextos |
A hierarquia segue a ordem: public < private < redacted. Um campo só é incluído no JSON se seu nível de visibilidade for menor ou igual ao nível solicitado.
Uso do toJSON com exposeLevel
O método toJSON aceita um segundo parâmetro opcional exposeLevel:
// Serialização pública — campos private e redacted ficam como "[REDACTED]"
const publicJson = entity.toJSON({ date: "string" }, "public");
// Serialização privada — campos redacted ficam como "[REDACTED]"
const privateJson = entity.toJSON({ date: "string" }, "private");
// Serialização completa — todos os campos visíveis
const fullJson = entity.toJSON({ date: "string" }, "redacted");
Se exposeLevel não for informado, o padrão é "public".
Campo _schema
Para que a redação funcione, o domain model deve definir o campo protegido _schema apontando para o schema utilizado:
class User extends Aggregate<TUserProps, TUserJson> {
protected readonly _schema = userSchema;
// ...
}
Se _schema não estiver definido, o toJSON() inclui todos os campos sem redação.
Função getVisibilityLevel
A função utilitária getVisibilityLevel converte um TExposeLevel para seu valor numérico:
import { getVisibilityLevel } from "tyforge";
getVisibilityLevel("public"); // 1
getVisibilityLevel("private"); // 2
getVisibilityLevel("redacted"); // 3
Próximos passos
- Entity — identidade e comparação por ID
- Value Object — comparação estrutural
- Aggregate — domain events
- Dto — Data Transfer Objects com TypeFields