Pular para o conteúdo principal

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

Carregando diagrama...

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) — campos FDate sao convertidos via toString() no formato da subclasse
  • { date: "date" } — campos FDate retornam o objeto Date nativo

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:

  1. Arrays — cada item e processado recursivamente
  2. Objetos com toJSON() — delegam para seu proprio toJSON()
  3. Objetos com getValue() (TypeFields) — retornam o valor primitivo
  4. Campos FDate com config.date === "string" — retornam toString()
  5. Campos undefined — sao omitidos do resultado
  6. 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

NivelValor numericoDescricao
"public"1Visivel em todas as serializacoes
"private"2Visivel apenas quando solicitado explicitamente
"redacted"3Substituido 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