Skip to content

Commit

Permalink
✨feat(produto): implementa um modelo de domínio rico | Parte 11
Browse files Browse the repository at this point in the history
- Define contratos através de interface e tipo para auxiliar na garantia de integridades dos dados
- Cria a entidade produto aplicando conceitos de invariantes de classe, construtores privados, métodos de fábrica estáticos, set com modificadores de acesso privado e validação de estados válidos e lançamento de exceções
- Altera o index para ajustar as importações dos elementos da entidade categoria
  • Loading branch information
diegoarmandoo committed Aug 28, 2023
1 parent b6fef44 commit c9dc215
Show file tree
Hide file tree
Showing 4 changed files with 229 additions and 3 deletions.
6 changes: 3 additions & 3 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { Categoria } from "./modules/catalogo/domain/categoria.entity";
import { RecuperarCategoriaProps } from "./modules/catalogo/domain/categoria.types";
import { readFile, writeFile } from "fs";
import { Categoria } from "./modules/catalogo/domain/categoria/categoria.entity";
import { RecuperarCategoriaProps } from "./modules/catalogo/domain/categoria/categoria.types";
import { CategoriaMap } from "./modules/catalogo/mappers/categoria.map";
import { DomainException } from "./shared/domain/domain.exception";
import { readFile, writeFile } from "fs";

try {

Expand Down
121 changes: 121 additions & 0 deletions src/modules/catalogo/domain/produto/produto.entity.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
import { Entity } from "../../../../shared/domain/entity";
import { ProdutoMap } from "../../mappers/produto.map";
import { Categoria } from "../categoria/categoria.entity";
import { DescricaoProdutoTamanhoMaximoInvalido, DescricaoProdutoTamanhoMinimoInvalido, NomeProdutoTamanhoMaximoInvalido, NomeProdutoTamanhoMinimoInvalido, QtdMaximaCategoriasProdutoInvalida, QtdMinimaCategoriasProdutoInvalida, ValorMinimoProdutoInvalido } from "./produto.exception";
import { CriarProdutoProps, IProduto, RecuperarProdutoProps } from "./produto.types";

class Produto extends Entity<IProduto> implements IProduto {

///////////////////////
//Atributos de Classe//
///////////////////////

private _nome: string;
private _descricao: string;
private _valor: number;
private _categorias: Array<Categoria>;

///////////////
//Gets e Sets//
///////////////

public get nome(): string {
return this._nome;
}

private set nome(value: string) {

if (value.trim().length < 5) {
throw new NomeProdutoTamanhoMinimoInvalido();
}

if (value.trim().length > 50) {
throw new NomeProdutoTamanhoMaximoInvalido();
}

this._nome = value;
}

public get descricao(): string {
return this._descricao;
}

private set descricao(value: string) {

if (value.trim().length < 10) {
throw new DescricaoProdutoTamanhoMinimoInvalido();
}

if (value.trim().length > 200) {
throw new DescricaoProdutoTamanhoMaximoInvalido();
}

this._descricao = value;
}

public get valor(): number {
return this._valor;
}

private set valor(value: number) {

if (value < 0) {
throw new ValorMinimoProdutoInvalido();
}

this._valor = value;
}

public get categorias(): Array<Categoria> {
return this._categorias;
}

private set categorias(value: Array<Categoria>) {

if (value.length < 1){
throw new QtdMinimaCategoriasProdutoInvalida();
}

if (value.length > 3){
throw new QtdMaximaCategoriasProdutoInvalida();
}

this._categorias = value;
}

//////////////
//Construtor//
//////////////

private constructor(produto:IProduto){
super(produto.id);
this.nome = produto.nome;
this.descricao = produto.descricao;
this.valor = produto.valor;
this.categorias = produto.categorias;
}

/////////////////////////
//Static Factory Method//
/////////////////////////

public static criar(props: CriarProdutoProps): Produto {
return new Produto(props);
}

public static recuperar(props: RecuperarProdutoProps): Produto {
return new Produto(props);
}

///////////
//Métodos//
///////////

public toDTO(): IProduto {
return ProdutoMap.toDTO(this);
}


}

export { Produto };
79 changes: 79 additions & 0 deletions src/modules/catalogo/domain/produto/produto.exception.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import { DomainException } from "../../../../shared/domain/domain.exception";

class ProdutoException extends DomainException {
constructor(message:string = '⚠️ Exceção de Domínio Genérica da Entidade Produto') {
super(message);
this.name = 'ProdutoException'
this.message = message;
}
}

class NomeProdutoTamanhoMinimoInvalido extends ProdutoException {
public constructor(message:string = '⚠️ O nome do produto não possui um tamanho mínimo válido.') {
super(message);
this.name = 'NomeProdutoTamanhoMinimoInvalido'
this.message = message;
}
}

class NomeProdutoTamanhoMaximoInvalido extends ProdutoException {
public constructor(message:string = '⚠️ O nome do produto não possui um tamanho máximo válido.') {
super(message);
this.name = 'NomeProdutoTamanhoMaximoInvalido'
this.message = message;
}
}

class DescricaoProdutoTamanhoMinimoInvalido extends ProdutoException {
public constructor(message:string = '⚠️ A descrição do produto não possui um tamanho mínimo válido.') {
super(message);
this.name = 'DescricaoProdutoTamanhoMinimoInvalido'
this.message = message;
}
}

class DescricaoProdutoTamanhoMaximoInvalido extends ProdutoException {
public constructor(message:string = '⚠️ A descrição do produto não possui um tamanho máximo válido.') {
super(message);
this.name = 'DescricaoProdutoTamanhoMaximoInvalido'
this.message = message;
}
}

class ValorMinimoProdutoInvalido extends ProdutoException {
public constructor(message:string = '⚠️ O valor mínimo do produto é inválido.') {
super(message);
this.name = 'ValorMinimoProdutoInvalido'
this.message = message;
}
}

class QtdMinimaCategoriasProdutoInvalida extends ProdutoException {
public constructor(message:string = '⚠️ A quantidade mínima de categorias produto é inválida.') {
super(message);
this.name = 'QtdMinimaCategoriasProdutoInvalida'
this.message = message;
}
}

class QtdMaximaCategoriasProdutoInvalida extends ProdutoException {
public constructor(message:string = '⚠️ A quantidade mínima de categorias do produto é inválida.') {
super(message);
this.name = 'QtdMinimaCategoriasProdutoInvalida'
this.message = message;
}
}

export {
ProdutoException,
NomeProdutoTamanhoMinimoInvalido,
NomeProdutoTamanhoMaximoInvalido,
DescricaoProdutoTamanhoMinimoInvalido,
DescricaoProdutoTamanhoMaximoInvalido,
ValorMinimoProdutoInvalido,
QtdMinimaCategoriasProdutoInvalida,
QtdMaximaCategoriasProdutoInvalida
}



26 changes: 26 additions & 0 deletions src/modules/catalogo/domain/produto/produto.types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { Categoria } from "../categoria/categoria.entity";

//Todos os atributos/propriedades que um produto deve ter no sistema
//Auxilia na criação de invariantes e modelos ricos
interface IProduto {
id?: string;
nome:string;
descricao:string;
valor: number;
categorias: Array<Categoria>
}

//Atributos que são necessários para criar um produto
//Tipo representa um dos estados do ciclo de vida da entidade
//Garantir a integridade dos dados de um objeto
type CriarProdutoProps = Omit<IProduto, "id">;

//Atributos que são necessários para recuperar uma categoria
//Tipo representa um dos estados do ciclo de vida da entidade
type RecuperarProdutoProps = Required<IProduto>;

export {
IProduto,
CriarProdutoProps,
RecuperarProdutoProps
}

0 comments on commit c9dc215

Please sign in to comment.