From 8169f69a524e6543e58d67dbb1773559bd01c8d5 Mon Sep 17 00:00:00 2001 From: Artur Poffo Date: Thu, 22 Feb 2024 22:37:51 -0300 Subject: [PATCH] Feat(CourseTag, Course, Route): Fetch course tags route --- .../application/use-cases/upload-file.spec.ts | 2 +- src/infra/http/controllers/delete-class.ts | 2 +- src/infra/http/controllers/delete-course.ts | 2 +- src/infra/http/controllers/delete-module.ts | 2 +- .../http/controllers/edit-class-details.ts | 2 +- .../http/controllers/edit-course-details.ts | 2 +- .../http/controllers/edit-module-details.ts | 2 +- .../http/controllers/fetch-course-classes.ts | 2 +- .../http/controllers/fetch-course-modules.ts | 2 +- .../http/controllers/fetch-course-tags.ts | 45 +++++++++++++++++++ .../http/controllers/fetch-module-classes.ts | 2 +- src/infra/http/routes/course-tag.ts | 3 ++ 12 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 src/infra/http/controllers/fetch-course-tags.ts diff --git a/src/domain/storage/application/use-cases/upload-file.spec.ts b/src/domain/storage/application/use-cases/upload-file.spec.ts index bc95d16..18bf469 100644 --- a/src/domain/storage/application/use-cases/upload-file.spec.ts +++ b/src/domain/storage/application/use-cases/upload-file.spec.ts @@ -1,6 +1,6 @@ +import { InvalidMimeTypeError } from '@/core/errors/errors/invalid-mime-type-error' import { InMemoryFilesRepository } from '../../../../../test/repositories/in-memory-files-repository' import { FakeUploader } from '../../../../../test/storage/fake-uploader' -import { InvalidMimeTypeError } from './errors/invalid-mime-type-error' import { UploadFileUseCase } from './upload-file' let inMemoryFilesRepository: InMemoryFilesRepository diff --git a/src/infra/http/controllers/delete-class.ts b/src/infra/http/controllers/delete-class.ts index d05d6fa..1279d7f 100644 --- a/src/infra/http/controllers/delete-class.ts +++ b/src/infra/http/controllers/delete-class.ts @@ -5,7 +5,7 @@ import { type FastifyReply, type FastifyRequest } from 'fastify' import { z } from 'zod' const deleteClassParamsSchema = z.object({ - classId: z.string() + classId: z.string().uuid() }) export async function deleteClassController(request: FastifyRequest, reply: FastifyReply) { diff --git a/src/infra/http/controllers/delete-course.ts b/src/infra/http/controllers/delete-course.ts index 8eb0184..4be5075 100644 --- a/src/infra/http/controllers/delete-course.ts +++ b/src/infra/http/controllers/delete-course.ts @@ -5,7 +5,7 @@ import { type FastifyReply, type FastifyRequest } from 'fastify' import { z } from 'zod' const deleteCourseParamsSchema = z.object({ - courseId: z.string() + courseId: z.string().uuid() }) export async function deleteCourseController(request: FastifyRequest, reply: FastifyReply) { diff --git a/src/infra/http/controllers/delete-module.ts b/src/infra/http/controllers/delete-module.ts index 1e06739..5c76687 100644 --- a/src/infra/http/controllers/delete-module.ts +++ b/src/infra/http/controllers/delete-module.ts @@ -5,7 +5,7 @@ import { type FastifyReply, type FastifyRequest } from 'fastify' import { z } from 'zod' const deleteModuleParamsSchema = z.object({ - moduleId: z.string() + moduleId: z.string().uuid() }) export async function deleteModuleController(request: FastifyRequest, reply: FastifyReply) { diff --git a/src/infra/http/controllers/edit-class-details.ts b/src/infra/http/controllers/edit-class-details.ts index a794f65..3846581 100644 --- a/src/infra/http/controllers/edit-class-details.ts +++ b/src/infra/http/controllers/edit-class-details.ts @@ -15,7 +15,7 @@ const editClassDetailsBodySchema = z.object({ }) const editClassDetailsParamsSchema = z.object({ - classId: z.string() + classId: z.string().uuid() }) export async function editClassDetailsController(request: FastifyRequest, reply: FastifyReply) { diff --git a/src/infra/http/controllers/edit-course-details.ts b/src/infra/http/controllers/edit-course-details.ts index 1ecc054..5144517 100644 --- a/src/infra/http/controllers/edit-course-details.ts +++ b/src/infra/http/controllers/edit-course-details.ts @@ -14,7 +14,7 @@ const editCourseDetailsBodySchema = z.object({ }) const editCourseDetailsParamsSchema = z.object({ - courseId: z.string() + courseId: z.string().uuid() }) export async function editCourseDetailsController(request: FastifyRequest, reply: FastifyReply) { diff --git a/src/infra/http/controllers/edit-module-details.ts b/src/infra/http/controllers/edit-module-details.ts index 34a7a51..6fdc213 100644 --- a/src/infra/http/controllers/edit-module-details.ts +++ b/src/infra/http/controllers/edit-module-details.ts @@ -14,7 +14,7 @@ const editModuleDetailsBodySchema = z.object({ }) const editModuleDetailsParamsSchema = z.object({ - moduleId: z.string() + moduleId: z.string().uuid() }) export async function editModuleDetailsController(request: FastifyRequest, reply: FastifyReply) { diff --git a/src/infra/http/controllers/fetch-course-classes.ts b/src/infra/http/controllers/fetch-course-classes.ts index 9838fef..28c59ef 100644 --- a/src/infra/http/controllers/fetch-course-classes.ts +++ b/src/infra/http/controllers/fetch-course-classes.ts @@ -7,7 +7,7 @@ import { z } from 'zod' import { ClassPresenter } from '../presenters/class-presenter' const fetchCourseClassesParamsSchema = z.object({ - courseId: z.string() + courseId: z.string().uuid() }) export async function fetchCourseClassesController(request: FastifyRequest, reply: FastifyReply) { diff --git a/src/infra/http/controllers/fetch-course-modules.ts b/src/infra/http/controllers/fetch-course-modules.ts index d970b54..672a89d 100644 --- a/src/infra/http/controllers/fetch-course-modules.ts +++ b/src/infra/http/controllers/fetch-course-modules.ts @@ -7,7 +7,7 @@ import { z } from 'zod' import { ModulePresenter } from '../presenters/module-presenter' const fetchCourseModulesParamsSchema = z.object({ - courseId: z.string() + courseId: z.string().uuid() }) export async function fetchCourseModulesController(request: FastifyRequest, reply: FastifyReply) { diff --git a/src/infra/http/controllers/fetch-course-tags.ts b/src/infra/http/controllers/fetch-course-tags.ts new file mode 100644 index 0000000..f769c2d --- /dev/null +++ b/src/infra/http/controllers/fetch-course-tags.ts @@ -0,0 +1,45 @@ +import { ResourceNotFoundError } from '@/core/errors/errors/resource-not-found-error' +import { type Tag } from '@/domain/course-management/enterprise/entities/tag' +import { makeTagMapper } from '@/infra/database/prisma/mappers/factories/make-tag-mapper' +import { makeFetchCourseTagsUseCase } from '@/infra/use-cases/factories/make-fetch-course-tags-use-case' +import { type FastifyReply, type FastifyRequest } from 'fastify' +import { z } from 'zod' +import { TagPresenter } from '../presenters/tag-presenter' + +const fetchCourseTagsParamsSchema = z.object({ + courseId: z.string().uuid() +}) + +export async function fetchCourseTagsController(request: FastifyRequest, reply: FastifyReply) { + const { courseId } = fetchCourseTagsParamsSchema.parse(request.params) + + const fetchCourseTagsUseCase = makeFetchCourseTagsUseCase() + + const result = await fetchCourseTagsUseCase.exec({ + courseId + }) + + if (result.isLeft()) { + const error = result.value + + switch (error.constructor) { + case ResourceNotFoundError: + return await reply.status(404).send({ message: error.message }) + default: + return await reply.status(500).send({ message: error.message }) + } + } + + const tagMapper = makeTagMapper() + const { tags } = result.value + + const infraTags = await Promise.all( + tags.map(async (tag: Tag) => { + return await tagMapper.toPrisma(tag) + }) + ) + + return await reply.status(200).send({ + tags: infraTags.map(infraTag => TagPresenter.toHTTP(infraTag)) + }) +} diff --git a/src/infra/http/controllers/fetch-module-classes.ts b/src/infra/http/controllers/fetch-module-classes.ts index dd00e35..adec2e5 100644 --- a/src/infra/http/controllers/fetch-module-classes.ts +++ b/src/infra/http/controllers/fetch-module-classes.ts @@ -7,7 +7,7 @@ import { z } from 'zod' import { ClassPresenter } from '../presenters/class-presenter' const fetchModuleClassesParamsSchema = z.object({ - moduleId: z.string() + moduleId: z.string().uuid() }) export async function fetchModuleClassesController(request: FastifyRequest, reply: FastifyReply) { diff --git a/src/infra/http/routes/course-tag.ts b/src/infra/http/routes/course-tag.ts index bff3da6..f8506f4 100644 --- a/src/infra/http/routes/course-tag.ts +++ b/src/infra/http/routes/course-tag.ts @@ -1,10 +1,13 @@ import { type FastifyInstance } from 'fastify' import { attachTagsToCourseController } from '../controllers/attach-tags-to-course' +import { fetchCourseTagsController } from '../controllers/fetch-course-tags' import { removeTagFromCourseController } from '../controllers/remove-tag-from-course' import { verifyJwt } from '../middlewares/verify-jwt' import { verifyUserRole } from '../middlewares/verify-user-role' export async function courseTagRoutes(app: FastifyInstance) { + app.get('/courses/:courseId/tags', fetchCourseTagsController) + app.post('/courses/:courseId/tags', { onRequest: [verifyJwt, verifyUserRole('INSTRUCTOR')] }, attachTagsToCourseController) app.delete('/courses/:courseId/tags/:tagId', { onRequest: [verifyJwt, verifyUserRole('INSTRUCTOR')] }, removeTagFromCourseController)