diff --git a/src/index.ts b/src/index.ts index aca674f..28a21cf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -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 { diff --git a/src/modules/catalogo/domain/produto/produto.entity.ts b/src/modules/catalogo/domain/produto/produto.entity.ts new file mode 100644 index 0000000..b8903ee --- /dev/null +++ b/src/modules/catalogo/domain/produto/produto.entity.ts @@ -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 implements IProduto { + + /////////////////////// + //Atributos de Classe// + /////////////////////// + + private _nome: string; + private _descricao: string; + private _valor: number; + private _categorias: Array; + + /////////////// + //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 { + return this._categorias; + } + + private set categorias(value: Array) { + + 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 }; diff --git a/src/modules/catalogo/domain/produto/produto.exception.ts b/src/modules/catalogo/domain/produto/produto.exception.ts new file mode 100644 index 0000000..3882ee1 --- /dev/null +++ b/src/modules/catalogo/domain/produto/produto.exception.ts @@ -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 +} + + + diff --git a/src/modules/catalogo/domain/produto/produto.types.ts b/src/modules/catalogo/domain/produto/produto.types.ts new file mode 100644 index 0000000..106160a --- /dev/null +++ b/src/modules/catalogo/domain/produto/produto.types.ts @@ -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 +} + +//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; + +//Atributos que são necessários para recuperar uma categoria +//Tipo representa um dos estados do ciclo de vida da entidade +type RecuperarProdutoProps = Required; + +export { + IProduto, + CriarProdutoProps, + RecuperarProdutoProps +} \ No newline at end of file