Dev Doido.

Criando o AddCategoryController no CrazyStack Node.js

Gustavo Miranda
Gustavo Miranda
- ... visualizações

Bem-vindo à aula de Criando o AddCategoryController! Neste curso, você aprenderá como construir uma funcionalidade importante para aplicações web: adicionar categorias a um sistema. Aprenderá a trabalhar com rotas, controllers, validações e interações com o banco de dados. Ao final desta aula, você terá desenvolvido habilidades fundamentais para criar aplicações web dinâmicas e escaláveis. Vamos começar!

Este artigo servirá como uma espécie de documentação de alguns códigos vistos durante as aulas apenas como material complementar.

import {
  HttpRequest,
  HttpResponse,
  Validation,
  badRequest,
  ok,
} from "@/application/helpers";
import { Controller } from "@/application/infra/contracts";
import { AddCategory } from "@/slices/category/useCases";

export class AddCategoryController extends Controller {
  constructor(
    private readonly validation: Validation,
    private readonly addCategory: AddCategory
  ) {
    super();
  }
  async execute(httpRequest: HttpRequest<any>): Promise<HttpResponse<any>> {
    const errors = this.validation.validate(httpRequest?.body);
    if (errors?.length > 0) {
      return badRequest(errors);
    }
    const categoryCreated = await this.addCategory({
      ...httpRequest?.body,
      createdById: httpRequest?.userId,
    });
    return ok(categoryCreated);
  }
}

Este é o código do AddCategoryController, responsável por adicionar uma categoria. Ele é uma classe que implementa a interface Controller. O construtor recebe duas dependências: a validação e o caso de uso AddCategory. O método execute recebe como entrada uma requisição HTTP, e retorna uma resposta HTTP.

Antes de prosseguir com a execução do caso de uso, é feita uma validação dos dados da requisição, caso existam erros de validação, é retornado um bad request. Caso contrário, o caso de uso é invocado com os dados da requisição e o ID do usuário que fez a requisição. A resposta é um objeto com a categoria criada.

import { makeLogController } from "@/application/decorators/logControllerFactory";
import { makeValidationComposite } from "@/application/factories";
import { Controller } from "@/application/infra/contracts";
import { makeAddCategoryFactory } from "@/slices/category/useCases";
import { AddCategoryController } from "@/slices/category/controllers";

export const makeAddCategoryController = (): Controller => {
  const requiredFields = ["name"];
  return makeLogController(
    "addCategory",
    new AddCategoryController(
      makeValidationComposite(requiredFields),
      makeAddCategoryFactory()
    )
  );
};

Este é um código de factory que é responsável por criar uma instância do controlador AddCategoryController. A factory usa as factories makeValidationComposite e makeAddCategoryFactory para criar uma instância da camada de validação e da camada de caso de uso, respectivamente. Além disso, a factory também usa o makeLogController para adicionar a capacidade de log ao controlador antes de retorná-lo.

A factory makeValidationComposite é chamada com o array de campos obrigatórios "name" e retorna uma instância da camada de validação. A factory makeAddCategoryFactory não precisa de nenhum parâmetro e retorna uma instância da camada de caso de uso.

Finalmente, a factory makeLogController é chamada com os nomes "addCategory" e a instância do controlador AddCategoryController criada com as factories anteriores como parâmetros. Isso adiciona a capacidade de log ao controlador e retorna a instância modificada.

https://github.com/gumiranda/CrazyStackNodeJs/commit/4dd1d8657acd8e91e27e23e669c38285ebc36f89

LINK DO REPOSITÓRIO