Domain Models
O TyForge fornece blocos de construcao para Domain-Driven Design (DDD) com suporte a serializacao automatica de TypeFields, comparacao por identidade ou estrutura, e emissao de eventos de dominio.
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 intermediaria que adiciona os metodos de serializacao:
toJSON(config?)
Converte todas as propriedades da instancia para seus valores primitivos. TypeFields sao automaticamente desembrulhados via getValue(). Objetos aninhados com toJSON() sao recursivamente convertidos.
const json = entidade.toJSON();
// Todas as propriedades TypeField sao convertidas para primitivos
// Com configuracao de data
const jsonDateStr = entidade.toJSON({ date: "string" });
// Campos FDate sao serializados como string no formato especifico
Configuracao de data:
{ date: "string" }(padrao) — camposFDatesao convertidos viatoString()no formato da subclasse{ date: "date" }— camposFDateretornam o objetoDatenativo
toPrimitives<TInput, TOutput>(input)
Metodo estatico utilitario para converter qualquer objeto com TypeFields para primitivos:
const primitivos = ClassDomainModels.toPrimitives<TProps, TPropsJson>(props);
deepUnwrap(input, config?)
Metodo privado que realiza o unwrap recursivo:
- Arrays — cada item e processado recursivamente
- Objetos com
toJSON()— delegam para seu propriotoJSON() - Objetos com
getValue()(TypeFields) — retornam o valor primitivo - Campos
FDatecomconfig.date === "string"— retornamtoString() - Campos
undefined— sao omitidos do resultado - Outros valores — retornados sem modificacao
Exposicao e redacao de campos
O toJSON() suporta controle de visibilidade por campo via a propriedade expose do schema. Isso permite omitir ou redactar campos sensiveis na serializacao, sem necessidade de logica manual.
Configuracao 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;
Niveis de visibilidade
| Nivel | Valor numerico | Descricao |
|---|---|---|
"public" | 1 | Visivel em todas as serializacoes |
"private" | 2 | Visivel apenas quando solicitado explicitamente |
"redacted" | 3 | Substituido por "[REDACTED]" na maioria dos contextos |
A hierarquia segue a ordem: public < private < redacted. Um campo so e incluido no JSON se seu nivel de visibilidade for menor ou igual ao nivel solicitado.
Uso do toJSON com exposeLevel
O metodo toJSON aceita um segundo parametro opcional exposeLevel:
// Serializacao publica — campos private e redacted ficam como "[REDACTED]"
const publicJson = entity.toJSON({ date: "string" }, "public");
// Serializacao privada — campos redacted ficam como "[REDACTED]"
const privateJson = entity.toJSON({ date: "string" }, "private");
// Serializacao completa — todos os campos visiveis
const fullJson = entity.toJSON({ date: "string" }, "redacted");
Se exposeLevel nao for informado, o padrao e "public".
Campo _schema
Para que a redacao 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 nao estiver definido, o toJSON() inclui todos os campos sem redacao.
Funcao getVisibilityLevel
A funcao utilitaria getVisibilityLevel converte um TExposeLevel para seu valor numerico:
import { getVisibilityLevel } from "tyforge";
getVisibilityLevel("public"); // 1
getVisibilityLevel("private"); // 2
getVisibilityLevel("redacted"); // 3
Proximos passos
- Entity — identidade e comparacao por ID
- Value Object — comparacao estrutural
- Aggregate — domain events
- Dto — Data Transfer Objects com TypeFields