Skip to content

Commit

Permalink
Feat(Course, Class, Route): Fetch course classes route
Browse files Browse the repository at this point in the history
  • Loading branch information
Artur-Poffo committed Feb 22, 2024
1 parent 696409e commit 7e95923
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 2 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@
- [ ] DELETE /modules/:moduleId - Delete module

### Classes
- [ ] GET /courses/:courseId/classes - Get course classes
- [x] GET /courses/:courseId/classes - Get course classes
- [ ] POST /classes - Register class
- [ ] PUT /classes/:classId - Update class details
- [ ] DELETE /classes/:classId - Delete class
Expand Down
2 changes: 2 additions & 0 deletions src/infra/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import multer from 'fastify-multer'
import { readFileSync } from 'fs'
import { ZodError } from 'zod'
import { env } from './env'
import { classRoutes } from './http/routes/class'
import { courseRoutes } from './http/routes/course'
import { imageRoutes } from './http/routes/image'
import { moduleRoutes } from './http/routes/module'
Expand Down Expand Up @@ -49,6 +50,7 @@ app.register(courseRoutes)
app.register(imageRoutes)
app.register(videoRoutes)
app.register(moduleRoutes)
app.register(classRoutes)

// Custom error handler

Expand Down
45 changes: 45 additions & 0 deletions src/infra/http/controllers/fetch-course-classes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { ResourceNotFoundError } from '@/core/errors/errors/resource-not-found-error'
import { type Class } from '@/domain/course-management/enterprise/entities/class'
import { makeClassMapper } from '@/infra/database/prisma/mappers/factories/make-class-mapper'
import { makeFetchCourseClassesUseCase } from '@/infra/use-cases/factories/make-fetch-course-classes-use-case'
import { type FastifyReply, type FastifyRequest } from 'fastify'
import { z } from 'zod'
import { ClassPresenter } from '../presenters/class-presenter'

const fetchCourseClassesParamsSchema = z.object({
courseId: z.string()
})

export async function fetchCourseClassesController(request: FastifyRequest, reply: FastifyReply) {
const { courseId } = fetchCourseClassesParamsSchema.parse(request.params)

const fetchCourseClassesUseCase = makeFetchCourseClassesUseCase()

const result = await fetchCourseClassesUseCase.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 classMapper = makeClassMapper()
const { classes } = result.value

const infraClasses = await Promise.all(
classes.map(async (classToMap: Class) => {
return await classMapper.toPrisma(classToMap)
})
)

return await reply.status(200).send({
classes: infraClasses.map(infraClass => ClassPresenter.toHTTP(infraClass))
})
}
2 changes: 1 addition & 1 deletion src/infra/http/controllers/fetch-course-modules.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,6 @@ export async function fetchCourseModulesController(request: FastifyRequest, repl
)

return await reply.status(200).send({
courses: infraModules.map(infraModule => ModulePresenter.toHTTP(infraModule))
modules: infraModules.map(infraModule => ModulePresenter.toHTTP(infraModule))
})
}
14 changes: 14 additions & 0 deletions src/infra/http/presenters/class-presenter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { type Prisma } from '@prisma/client'

export class ClassPresenter {
static toHTTP(classToPresent: Prisma.ClassUncheckedCreateInput) {
return {
id: classToPresent.id,
name: classToPresent.name,
description: classToPresent.description,
classNumber: classToPresent.classNumber,
moduleId: classToPresent.moduleId,
videoId: classToPresent.videoId
}
}
}
7 changes: 7 additions & 0 deletions src/infra/http/routes/class.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { type FastifyInstance } from 'fastify'
import { fetchCourseClassesController } from '../controllers/fetch-course-classes'
import { verifyJwt } from '../middlewares/verify-jwt'

export async function classRoutes(app: FastifyInstance) {
app.get('/courses/:courseId/classes', { onRequest: [verifyJwt] }, fetchCourseClassesController)
}

0 comments on commit 7e95923

Please sign in to comment.