Skip to content

Commit

Permalink
Feat(Course, Enrollment, Route): Mark course as completed route
Browse files Browse the repository at this point in the history
  • Loading branch information
Artur-Poffo committed Feb 23, 2024
1 parent 51a59d0 commit a079985
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 1 deletion.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@
- [x] POST /courses/:courseId/enroll - Enroll to course
- [x] POST /enrollments/:enrollmentId/modules/:moduleId/complete - Mark module as completed
- [x] POST /enrollments/:enrollmentId/classes/:classId/complete - Mark class as completed
- [ ] POST /enrollments/:enrollmentId/complete - Mark enrollment as completed
- [x] POST /enrollments/:enrollmentId/complete - Mark enrollment as completed
- [x] GET /courses/:courseId/students/:studentId/enrollments - Get enrollment of a student on a course
- [x] DELETE /enrollments/:enrollmentId - Cancel enrollment

Expand Down
39 changes: 39 additions & 0 deletions src/infra/http/controllers/mark-course-as-completed.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { NotAllowedError } from '@/core/errors/errors/not-allowed-error'
import { ResourceNotFoundError } from '@/core/errors/errors/resource-not-found-error'
import { AllModulesInTheCourseMustBeMarkedAsCompleted } from '@/domain/course-management/application/use-cases/errors/all-modules-in-the-course-must-be-marked-as-completed'
import { makeMarkCourseAsCompletedUseCase } from '@/infra/use-cases/factories/make-mark-course-as-completed-use-case'
import { type FastifyReply, type FastifyRequest } from 'fastify'
import { z } from 'zod'

const markCourseAsCompletedParamsSchema = z.object({
enrollmentId: z.string().uuid()
})

export async function markCourseAsCompletedController(request: FastifyRequest, reply: FastifyReply) {
const { enrollmentId } = markCourseAsCompletedParamsSchema.parse(request.params)
const { sub: studentId } = request.user

const markCourseAsCompletedUseCase = makeMarkCourseAsCompletedUseCase()

const result = await markCourseAsCompletedUseCase.exec({
enrollmentId,
studentId
})

if (result.isLeft()) {
const error = result.value

switch (error.constructor) {
case ResourceNotFoundError:
return await reply.status(404).send({ message: error.message })
case NotAllowedError:
return await reply.status(401).send({ message: error.message })
case AllModulesInTheCourseMustBeMarkedAsCompleted:
return await reply.status(403).send({ message: error.message })
default:
return await reply.status(500).send({ message: error.message })
}
}

return await reply.status(201).send()
}
2 changes: 2 additions & 0 deletions src/infra/http/routes/enrollment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { cancelEnrollmentController } from '../controllers/cancel-enrollment'
import { enrollToCourseController } from '../controllers/enroll-to-course'
import { getEnrollmentDetailsController } from '../controllers/get-enrollment-details'
import { markClassAsCompletedController } from '../controllers/mark-class-as-completed'
import { markCourseAsCompletedController } from '../controllers/mark-course-as-completed'
import { markModuleAsCompletedController } from '../controllers/mark-module-as-completed'
import { verifyJwt } from '../middlewares/verify-jwt'
import { verifyUserRole } from '../middlewares/verify-user-role'
Expand All @@ -13,6 +14,7 @@ export async function enrollmentRoutes(app: FastifyInstance) {
app.post('/courses/:courseId/enroll', { onRequest: [verifyJwt, verifyUserRole('STUDENT')] }, enrollToCourseController)
app.post('/enrollments/:enrollmentId/classes/:classId', { onRequest: [verifyJwt, verifyUserRole('STUDENT')] }, markClassAsCompletedController)
app.post('/enrollments/:enrollmentId/modules/:moduleId', { onRequest: [verifyJwt, verifyUserRole('STUDENT')] }, markModuleAsCompletedController)
app.post('/enrollments/:enrollmentId/completed', { onRequest: [verifyJwt, verifyUserRole('STUDENT')] }, markCourseAsCompletedController)

app.delete('/enrollments/:enrollmentId', { onRequest: [verifyJwt, verifyUserRole('STUDENT')] }, cancelEnrollmentController)
}

0 comments on commit a079985

Please sign in to comment.