- Vamos começar adicionando um método getRandomFeaturedCourses no serviço para obter os cursos em destaque, embaralhá-los e então pegar 3 deles:
- Obs.: A quantidade de 3 cursos foi escolhida arbitrariamente, mas poderia facilmente ser um valor determinado na requisição para deixar o comportamento mais controlável.
// src/services/courseService.ts
// ..
return courseWithEpisodes
},
getRandomFeaturedCourses: async () => {
const featuredCourses = await Course.findAll({
attributes: ['id', 'name', 'synopsis', ['thumbnail_url', 'thumbnailUrl']],
where: {
featured: true
}
})
const randomFeaturedCourses = featuredCourses.sort(() => 0.5 - Math.random())
return randomFeaturedCourses.slice(0, 3)
},
}
- Agora criamos um método no controlador para retornar a resposta:
// src/controllers/coursesController.ts
// ...
},
featured: async (req: Request, res: Response) => {
try {
const featuredCourses = await courseService.getRandomFeaturedCourses()
return res.json(featuredCourses)
} catch (err) {
if (err instanceof Error) {
return res.status(400).json({ message: err.message })
}
}
}
}
- E por fim criamos a rota passando o método do controlador:
- Obs.: Como já temos uma rota com parâmetro começando em /courses é imprescindível que a rota featured fique acima dela, para que “featured” não seja entendido com um valor do parâmetro :id ao chamar a rota.
// src/routes.ts
import express from 'express'
import { categoriesController } from './controllers/categoriesController'
import { coursesController } from './controllers/coursesController'
const router = express.Router()
// ...
router.get('/courses/featured', coursesController.featured)
router.get('/courses/:id', coursesController.show)
export { router }
- Teste a rota e verifique que 3 cursos em destaque são retornados aleatoriamente a cada requisição.