Como sugestão, durante os estudos, verifiquei que é possível usarmos diretamente o "middleware body de validação" de Adotantes e Pets diretamente na RequestBody.ts. Por exemplo...
Em vez de usarmos dessa maneira:
import express, { RequestHandler } from 'express';
import AdotanteRepository from '../repositories/AdotanteRepository';
import { AppDataSource } from '../db/data-source';
import AdotanteController from '../controller/AdotanteController';
import { middlewareValidadorBodyAdotante } from '../middleware/validators/adotanteRequestBody';
import { middlewareValidadorBodyEndereco } from '../middleware/validators/enderecoRequestBody';
const router = express.Router();
const adotanteRepository = new AdotanteRepository(AppDataSource.getRepository("Adotante"));
const adotanteController = new AdotanteController(adotanteRepository);
const validateBodyAdotante: RequestHandler = (req, res, next) => middlewareValidadorBodyAdotante(req, res, next);
const validateBodyEndereco: RequestHandler = (req, res, next) => middlewareValidadorBodyEndereco(req, res, next);
router.post("/", validateBodyAdotante, (req, res) => adotanteController.criaAdotante(req, res));
router.get("/", (req, res) => adotanteController.listaAdotantes(req, res));
router.put("/:id", (req, res) => adotanteController.atualizaAdotante(req, res));
router.delete("/:id", (req, res) => adotanteController.deletaAdotante(req, res));
router.patch("/:id", validateBodyEndereco, (req, res) => adotanteController.atualizaEnderecoAdotante(req, res));
export default router;
Podemos usar diretamente os middlewares importados, já que o next utilizados neles estão no contexto dos métodos REST do router:
import express from 'express';
import AdotanteRepository from '../repositories/AdotanteRepository';
import { AppDataSource } from '../db/data-source';
import AdotanteController from '../controller/AdotanteController';
import { middlewareValidadorBodyAdotante } from '../middleware/validators/adotanteRequestBody';
import { middlewareValidadorBodyEndereco } from '../middleware/validators/enderecoRequestBody';
const router = express.Router();
const adotanteRepository = new AdotanteRepository(AppDataSource.getRepository("Adotante"));
const adotanteController = new AdotanteController(adotanteRepository);
router.post("/", middlewareValidadorBodyAdotante, (req, res) => adotanteController.criaAdotante(req, res));
router.get("/", (req, res) => adotanteController.listaAdotantes(req, res));
router.put("/:id", (req, res) => adotanteController.atualizaAdotante(req, res));
router.delete("/:id", (req, res) => adotanteController.deletaAdotante(req, res));
router.patch("/:id", middlewareValidadorBodyEndereco, (req, res) => adotanteController.atualizaEnderecoAdotante(req, res));
export default router;
Dessa forma, na minha opinião deixamos o código um pouco mais direto e simplificado, sem importação do RequestHandle do express.
No caso dos Pets, fica desse modo:
import express from 'express';
import PetController from '../controller/PetController';
import PetRepository from '../repositories/PetRepository';
import { AppDataSource } from '../db/data-source';
import { middlewareValidadorBodyPet } from '../middleware/validators/petRequestBody';
const router = express.Router();
const petRepository = new PetRepository(
AppDataSource.getRepository("Pet"),
AppDataSource.getRepository("Adotante")
);
const petController = new PetController(petRepository);
router.post("/", middlewareValidadorBodyPet, (req, res) => petController.criaPet(req, res))
.put("/:id", (req, res) => petController.atualizaPet(req, res))
.delete("/:id", (req, res) => petController.deletaPet(req, res))
.get("/", (req, res) => petController.listaPets(req, res))
.put("/:pet_id/:id_adotante", (req, res) => petController.adotaPet(req, res))
.get("/filtroPorte", (req, res) => petController.buscaPetPeloPorte(req, res))
.get("/filtro", (req, res) => petController.buscaPetPorCampoGenerico(req, res));
export default router;
Bom, achei interessante essa abordagem/opção e fica a observação :)