Pular para o conteúdo principal

Dto

Um Dto (Data Transfer Object) e um Value Object especializado para transporte de dados em contextos HTTP. Possui campos pre-definidos para status, body, headers, query parameters e path parameters.

Assinatura

abstract class Dto<
TProps extends TDtoPropsBase,
TPropsJson extends TDtoPropsJson,
> extends ValueObject<TProps, TPropsJson> {
public constructor();
}

Interfaces base

TDtoPropsBase

Define a estrutura das propriedades internas do Dto, usando TypeFields:

export interface TDtoPropsBase {
status?: FHttpStatus;
body?: unknown;
headers?: Record<string, TypeField<unknown>>;
query?: Record<string, TypeField<unknown>>;
params?: Record<string, TypeField<unknown>>;
[key: string]: unknown;
}

TDtoPropsJson

Define a estrutura da representacao JSON (primitivos):

export interface TDtoPropsJson {
status?: THttpStatus;
body?: unknown;
headers?: Record<string, unknown>;
query?: Record<string, unknown>;
params?: Record<string, unknown>;
[key: string]: unknown;
}

Campos pre-definidos

CampoTipo (Props)Tipo (JSON)Descricao
status?FHttpStatusTHttpStatus (number)Codigo HTTP da resposta
body?unknownunknownCorpo da requisicao/resposta
headers?Record<string, TypeField>Record<string, unknown>Headers HTTP tipados
query?Record<string, TypeField>Record<string, unknown>Query parameters tipados
params?Record<string, TypeField>Record<string, unknown>Path parameters tipados

Todos os campos sao opcionais. A interface aceita propriedades adicionais via index signature ([key: string]: unknown).

Exemplo

import { Dto, TDtoPropsBase, TDtoPropsJson, FHttpStatus, FString, FId } from "tyforge";

// 1. Defina os tipos
interface ICriarUsuarioDtoProps extends TDtoPropsBase {
body: {
nome: FString;
email: FString;
};
params: {
tenantId: FId;
};
}

interface ICriarUsuarioDtoJson extends TDtoPropsJson {
body: {
nome: string;
email: string;
};
params: {
tenantId: string;
};
}

// 2. Implemente o Dto
class CriarUsuarioDto extends Dto<ICriarUsuarioDtoProps, ICriarUsuarioDtoJson> {
protected readonly _classInfo = {
name: "CriarUsuarioDto",
version: "1.0.0",
description: "DTO para criacao de usuario",
};

body: { nome: FString; email: FString };
params: { tenantId: FId };

private constructor(props: ICriarUsuarioDtoProps) {
super();
this.body = props.body;
this.params = props.params;
}

static create(props: ICriarUsuarioDtoProps): CriarUsuarioDto {
return new CriarUsuarioDto(props);
}
}

// 3. Use o Dto
const dto = CriarUsuarioDto.create({
body: {
nome: FString.createOrThrow("Maria Silva"),
email: FString.createOrThrow("maria@email.com"),
},
params: {
tenantId: FId.generate(),
},
});

// Serializar — TypeFields sao desembrulhados automaticamente
const json = dto.toJSON();
// {
// body: { nome: "Maria Silva", email: "maria@email.com" },
// params: { tenantId: "uuid-aqui" }
// }

Comparacao

Por herdar de ValueObject, o Dto utiliza comparacao estrutural via JSON.stringify:

dto1.equals(dto2); // true se todos os campos forem identicos

Relacao com Schema Builder

Dtos podem ser combinados com o SchemaBuilder para validar dados de entrada e construir o Dto de forma segura:

import { SchemaBuilder, FString, FEmail } from 'tyforge';
import type { ISchema } from 'tyforge';

const schema = {
nome: { type: FString, required: true },
email: { type: FEmail, required: true },
} satisfies ISchema;

const validator = SchemaBuilder.compile(schema);
const result = validator.create(requestBody);
// Result com TypeFields validados, prontos para construir o Dto