- Vamos começar criando um novo controlador especificamente para os cursos. Crie o arquivo coursesController.ts na pasta controllers e adicione o código abaixo:
// src/controllers/courseController.ts
import { Request, Response } from 'express'
export const coursesController = {
// GET /courses/:id
show: async (req: Request, res: Response) => {
const { id } = req.params
}
}
- Vamos criar um serviço courseService.ts e incluir nele o método findByIdWithEpisodes:
- Obs.: Repare que estamos ordenando os episódios para que eles já sejam enviados na ordem correta para serem assistidos.
// src/services/courseService.ts
import { Course } from "../models"
export const courseService = {
findByIdWithEpisodes: async (id: string) => {
const courseWithEpisodes = await Course.findByPk(id, {
attributes: ['id', 'name', 'synopsis', ['thumbnail_url', 'thumbnailUrl']],
include: {
association: 'episodes',
attributes: [
'id',
'name',
'synopsis',
'order',
['video_url', 'videoUrl'],
['seconds_long', 'secondsLong']
],
order: [['order', 'ASC']],
separate: true
}
})
return courseWithEpisodes
},
}
- Adicione o nome da associação no arquivo index.ts da pasta models:
// src/models/index.ts
// ...
Course.hasMany(Episode, { as: 'episodes' })
// ...
- Agora só precisamos utilizar o método findByIdWithEpisodes no controlador e retornar o resultado na resposta:
// src/controllers/courseController.ts
import { Request, Response } from 'express'
import { courseService } from '../services/courseService'
export const coursesController = {
// GET /courses/:id
show: async (req: Request, res: Response) => {
const { id } = req.params
try {
const course = await courseService.findByIdWithEpisodes(id)
return res.json(course)
} catch (err) {
if (err instanceof Error) {
return res.status(400).json({ message: err.message })
}
}
}
}
- Por fim, incluímos a rota GET contendo o parâmetro :id no arquivo de rotas:
// src/routes.ts
import express from 'express'
import { categoriesController } from './controllers/categoriesController'
import { coursesController } from './controllers/coursesController'
const router = express.Router()
// ...
router.get('/courses/:id', coursesController.show)
export { router }
- Agora já podemos testar e ver que o curso está sendo retornado com todos os seus episódios em ordem.