- Vamos começar criando um novo método no controlador categoriesController.ts chamado show. Como iremos usá-lo para requisições GET na rota /categories/:id já sabemos que o id da categoria será recebido como parâmetro da requisição:
// src/controllers/categoriesController.ts
// ...
},
// GET /categories/:id
show: async (req: Request, res: Response) => {
const { id } = req.params
}
}
- No arquivo categoryService.ts, inclua o método findByIdWithCourses que irá obter uma categoria incluindo todos os cursos dela:
- Obs.: Vale destacar aqui que a sintaxe de atributos usando um array com duas strings serve para renomear o atributo que virá do banco (usando o AS do SQL). Nesse caso, como estamos especificando os atributos manualmente precisamos usar essa conversão para o padrão camelCase do javascript (não é obrigatório, mas por uma questão de consistência).
// src/services/categoryService.ts
// ...
total
}
},
findByIdWithCourses: async (id: string) => {
const categoryWithCourses = await Category.findByPk(id, {
attributes: ['id', 'name'],
include: {
association: 'courses',
attributes: ['id', 'name', 'synopsis', ['thumbnail_url', 'thumbnailUrl']],
}
})
return categoryWithCourses
}
}
- Adicione o nome da associação no arquivo index.ts da pasta models:
// src/models/index.ts
// ...
Category.hasMany(Course, { as: 'courses' })
// ...
- Agora no controlador podemos chamar este método para obter os cursos e retorná-los na resposta:
// src/controllers/categoriesController.ts
// ...
},
// GET /categories/:id
show: async (req: Request, res: Response) => {
const { id } = req.params
try {
const category = await categoryService.findByIdWithCourses(id)
return res.json(category)
} catch (err) {
if (err instanceof Error) {
return res.status(400).json({ message: err.message })
}
}
}
}
- Por fim, inclua a rota no arquivo de rotas, não se esquecendo do parâmetro :id, e teste-a:
// src/routes.ts
import express from 'express'
import { categoriesController } from './controllers/categoriesController'
const router = express.Router()
router.get('/categories', categoriesController.index)
router.get('/categories/:id', categoriesController.show)
export { router }