-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
✨feat(produto): implementa um modelo de domínio rico | Parte 11
- 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
1 parent
b6fef44
commit c9dc215
Showing
4 changed files
with
229 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 }; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |