2
respostas

[RESOLVIDO] Problema no @Post de Array de produtos.

Olá galera, boa tarde! estou com uma duvida no Array de produto.

Quando tento passar um Array ele retorna o seguinte erro:

Exemplo!

Não sei como fazer para passar o array corretamente.

Se eu passar ele vazio, consigo cadastrar o produto.

exemplo

Segue meu código:

produto.controller

import { Body, Controller, Post, Get } from '@nestjs/common';
import { ProdutoRepository } from './produto.repository';
import { CriaProdutoDTO } from 'src/produtos/dto/CriaProduto.dto';
import { ProdutoEntity } from './validacao/produto.entity';
import { ListaProdutoDTO } from './dto/ListaProduto.dto';
import { v4 as uuid } from 'uuid';

@Controller('/produtos')
export class ProdutoController {
  constructor(private produtoRepository: ProdutoRepository) {}

  @Post()
  async criaProduto(@Body() dadosDoProduto: CriaProdutoDTO) {
    const produtoEntity = new ProdutoEntity();
    produtoEntity.caracteristicas = dadosDoProduto.caracteristicas;
    produtoEntity.categoria = dadosDoProduto.categoria;
    produtoEntity.descricao = dadosDoProduto.descricao;
    produtoEntity.imagens = dadosDoProduto.imagens;
    produtoEntity.nome = dadosDoProduto.nome;
    produtoEntity.quantidade = dadosDoProduto.quantidade;
    produtoEntity.valor = dadosDoProduto.valor;
    produtoEntity.id = uuid();
    this.produtoRepository.salvar(produtoEntity);
    return {
      produto: new ListaProdutoDTO(produtoEntity.id, produtoEntity.nome, produtoEntity.caracteristicas),
      message: 'Produto Criado com Sucesso.' };
  }
  @Get()
  async listProdutos() {
    const produtosSalvos = await this.produtoRepository.listar();
    const produtosLista = produtosSalvos.map(
      produtos => new ListaProdutoDTO(
        produtos.id,
        produtos.nome,
        produtos.caracteristicas
      )
    );
    return produtosLista;
  }
}

produto.repository

import { Injectable } from '@nestjs/common';
import { ProdutoEntity } from './validacao/produto.entity';

@Injectable()
export class ProdutoRepository {
  private produtos: ProdutoEntity[] = [];

  async salvar(produto: ProdutoEntity) {
    this.produtos.push(produto);
  }
  
  async listar() {
    return this.produtos;
  }
}

CriaProduto.dto

import { IsArray, IsNotEmpty, IsPositive, MaxLength, ValidateNested } from "class-validator";
import { CaracteristicaProdutoDTO } from "./CaracteristicaProduto.dto";
import { ImagemProdutoDTO } from "./ImagemProduto.dto";
import { Type } from "class-transformer";


export class CriaProdutoDTO {

    @IsNotEmpty({message: "Nome não pode ser vazio"})
    nome: string;
    
    valor: number;

    @IsPositive({message: "Quantidade tem que ser possitiva."})
    quantidade: number;

    @IsNotEmpty()
    @MaxLength(1000)
    descricao: string;

    @Type(() => CaracteristicaProdutoDTO)
    @IsArray()
    @ValidateNested()
    caracteristicas: CaracteristicaProdutoDTO[];

    @Type(() => CaracteristicaProdutoDTO)
    @IsArray()
    @ValidateNested()
    imagens: ImagemProdutoDTO[];

    @IsNotEmpty()
    categoria: string;
}

CaracteristicaProduto.dto

export class CaracteristicaProdutoDTO {
    nome: string;
    descricao: string;
  }

ImagemProduto.dto

export class ImagemProdutoDTO {
    nome: string;
    descricao: string;
  }

produto.entity

import { CaracteristicaProdutoDTO } from "../dto/CaracteristicaProduto.dto";
import { ImagemProdutoDTO } from "../dto/ImagemProduto.dto";

export class ProdutoEntity {
    id: string;
    nome: string;
    valor: number;
    quantidade: number;
    descricao: string;
    caracteristicas: CaracteristicaProdutoDTO[];
    imagens: ImagemProdutoDTO[];
    categoria: string;
}
2 respostas

@EDIT

Descobri o problema e já resolvi.

Correção:

produto.controller

import { Body, Controller, Post, Get } from '@nestjs/common';
import { ProdutoRepository } from './produto.repository';
import { CriaProdutoDTO } from 'src/produtos/dto/CriaProduto.dto';
import { ProdutoEntity } from './validacao/produto.entity';
import { ListaProdutoDTO } from './dto/ListaProduto.dto';
import { v4 as uuid } from 'uuid';

@Controller('/produtos')
export class ProdutoController {
  constructor(private produtoRepository: ProdutoRepository) {}

  @Post()
  async criaProduto(@Body() dadosDoProduto: CriaProdutoDTO) {
    const produtoEntity = new ProdutoEntity();
    produtoEntity.caracteristicas = dadosDoProduto.caracteristicas;
    produtoEntity.categoria = dadosDoProduto.categoria;
    produtoEntity.descricao = dadosDoProduto.descricao;
    produtoEntity.imagens = dadosDoProduto.imagens;
    produtoEntity.nome = dadosDoProduto.nome;
    produtoEntity.quantidade = dadosDoProduto.quantidade;
    produtoEntity.valor = dadosDoProduto.valor;
    produtoEntity.id = uuid();
    this.produtoRepository.salvar(produtoEntity);
    return {
      produto: new ListaProdutoDTO(produtoEntity.id, produtoEntity.nome),
      message: 'Produto Criado com Sucesso.',
    };
  }
  @Get()
  async listProdutos() {
    const produtosSalvos = await this.produtoRepository.listar();
    const produtosLista = produtosSalvos.map(
      (produtos) => new ListaProdutoDTO(produtos.id, produtos.nome),
    );
    return produtosLista;
  }
}

CriaProduto.dto

import {
  IsArray,
  IsNotEmpty,
  IsPositive,
  MaxLength,
  ValidateNested,
} from 'class-validator';
import { CaracteristicaProdutoDTO } from './CaracteristicaProduto.dto';
import { ImagemProdutoDTO } from './ImagemProduto.dto';
import { Type } from 'class-transformer';

export class CriaProdutoDTO {
  @IsNotEmpty({ message: 'Nome não pode ser vazio' })
  nome: string;

  valor: number;

  @IsPositive({ message: 'Quantidade tem que ser possitiva.' })
  quantidade: number;

  @IsNotEmpty()
  @MaxLength(1000)
  descricao: string;

  @Type(() => CaracteristicaProdutoDTO)
  @IsArray()
  @ValidateNested()
  caracteristicas: CaracteristicaProdutoDTO;

  @Type(() => ImagemProdutoDTO)
  @IsArray()
  @ValidateNested()
  imagens: ImagemProdutoDTO;

  @IsNotEmpty()
  categoria: string;
}

CaracteristicaProduto.dto

import { IsNotEmpty } from 'class-validator';

export class CaracteristicaProdutoDTO {
  @IsNotEmpty()
  nome: string;
  @IsNotEmpty()
  descricao: string;
}

ImagemProduto.dto

import { IsNotEmpty } from 'class-validator';

export class ImagemProdutoDTO {
  @IsNotEmpty()
  url: string;
  @IsNotEmpty()
  descricao: string;
}

produto.entity

import { CaracteristicaProdutoDTO } from '../dto/CaracteristicaProduto.dto';
import { ImagemProdutoDTO } from '../dto/ImagemProduto.dto';

export class ProdutoEntity {
  id: string;
  nome: string;
  valor: number;
  quantidade: number;
  descricao: string;
  caracteristicas: CaracteristicaProdutoDTO;
  imagens: ImagemProdutoDTO;
  categoria: string;
}

Payload

{
"nome" : "Diego",
"quantidade" : 20,
"descricao" : "Diego",
"caracteristicas": [{"nome" : "Diego", "descricao" : "teste teste teste"}],
"imagens": [{"url": "google.com.br",  "descricao" : "teste teste teste"}],
"categoria" : "Diego"

}

Olá Diego, tudo bem com você?

Fico feliz em saber que conseguiu solucionar o erro apresentado, esse retorno informando a solução é muito importante.

Conte com o apoio do Fórum na sua jornada. Fico à disposição. Abraços e bons estudos!