diff --git a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/CourseController.java b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/CourseController.java index 06be0f52abf6023422e5ca78524c8531be419128..1e2bbac5e0f6e4d9a4752e9a0afc83a5c4adb5b7 100644 --- a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/CourseController.java +++ b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/CourseController.java @@ -2,6 +2,8 @@ package org.fuseri.modulelanguageschool.course; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; import jakarta.validation.Valid; import org.fuseri.model.dto.course.CourseCreateDto; import org.fuseri.model.dto.course.CourseDto; @@ -42,6 +44,10 @@ public class CourseController { */ @ApiOperation(value = "Create a new course") @PostMapping + @ApiResponses({ + @ApiResponse(code = 201, message = "Course created successfully"), + @ApiResponse(code = 400, message = "Invalid request body") + }) public ResponseEntity<CourseDto> create(@Valid @RequestBody CourseCreateDto dto) { CourseDto courseDto = courseFacade.create(dto); return ResponseEntity.status(HttpStatus.CREATED).body(courseDto); @@ -55,10 +61,15 @@ public class CourseController { */ @ApiOperation(value = "Retrieve a course by ID") @GetMapping("/find/{id}") + @ApiResponses({ + @ApiResponse(code = 200, message = "Course found"), + @ApiResponse(code = 404, message = "Course not found") + }) public ResponseEntity<CourseDto> find(@PathVariable Long id) { CourseDto courseDto = courseFacade.findById(id); return ResponseEntity.ok(courseDto); } + /** * Retrieves a paginated list of courses * @@ -67,6 +78,10 @@ public class CourseController { */ @ApiOperation(value = "Retrieve a paginated list of courses") @GetMapping("/findAll") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Successfully retrieved courses"), + @ApiResponse(code = 404, message = "No courses found") + }) public ResponseEntity<Page<CourseDto>> findAll(@RequestParam int page) { Page<CourseDto> courseDtoPage = courseFacade.findAll(PageRequest.of(page, 10, Sort.by(Sort.Direction.ASC, "name"))); return ResponseEntity.ok(courseDtoPage); @@ -80,6 +95,10 @@ public class CourseController { */ @ApiOperation(value = "Retrieve a paginated list of courses of a given language") @GetMapping("/findAllByLang") + @ApiResponses({ + @ApiResponse(code = 200, message = "Courses found"), + @ApiResponse(code = 400, message = "Invalid request body") + }) public ResponseEntity<List<CourseDto>> findAll(@RequestParam LanguageTypeDto lang) { List<CourseDto> courseDtos = courseFacade.findAll(lang); return ResponseEntity.ok(courseDtos); @@ -93,6 +112,10 @@ public class CourseController { */ @ApiOperation(value = "Retrieve a paginated list of courses of a given language and proficiency") @GetMapping("/findAllByLangProf") + @ApiResponses({ + @ApiResponse(code = 200, message = "Courses found"), + @ApiResponse(code = 400, message = "Invalid request body") + }) public ResponseEntity<List<CourseDto>> findAll(@RequestParam LanguageTypeDto lang, @RequestParam ProficiencyLevelDto prof) { List<CourseDto> courses = courseFacade.findAll(lang, prof); @@ -108,6 +131,11 @@ public class CourseController { */ @ApiOperation(value = "Update an existing course") @PutMapping("/update/{id}") + @ApiResponses({ + @ApiResponse(code = 200, message = "Course updated successfully"), + @ApiResponse(code = 400, message = "Invalid request body"), + @ApiResponse(code = 404, message = "Course not found") + }) public ResponseEntity<CourseDto> update(@PathVariable Long id, @Valid @RequestBody CourseCreateDto dto) { CourseDto updatedCourse = courseFacade.update(id, dto); return ResponseEntity.ok(updatedCourse); @@ -120,6 +148,10 @@ public class CourseController { */ @ApiOperation(value = "Delete a course by ID") @DeleteMapping("/delete/{id}") + @ApiResponses({ + @ApiResponse(code = 204, message = "Course deleted successfully"), + @ApiResponse(code = 404, message = "Course not found") + }) public ResponseEntity<Void> delete(@PathVariable Long id) { courseFacade.delete(id); return ResponseEntity.noContent().build(); @@ -134,6 +166,10 @@ public class CourseController { */ @ApiOperation(value = "Add student to the existing course") @PatchMapping("/enrol/{id}") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Successfully enrolled student in course"), + @ApiResponse(code = 404, message = "Course not found") + }) public ResponseEntity<CourseDto> enrol(@PathVariable Long id, @RequestBody UserDto student) { CourseDto updatedCourse = courseFacade.enrol(id, student); return ResponseEntity.ok(updatedCourse); @@ -148,6 +184,10 @@ public class CourseController { */ @ApiOperation(value = "Remove student from the existing course") @PatchMapping("/expel/{id}") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Successfully expelled student from course"), + @ApiResponse(code = 404, message = "Course not found") + }) public ResponseEntity<CourseDto> expel(@PathVariable Long id, @RequestBody UserDto student) { CourseDto updatedCourse = courseFacade.expel(id, student); return ResponseEntity.ok(updatedCourse); diff --git a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/CourseService.java b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/CourseService.java index 13079299f90503bc9f66ca889e05cd59ae6473f0..4e54b9f91bba5849884d37e2ac291c8dd9ee000b 100644 --- a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/CourseService.java +++ b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/CourseService.java @@ -1,12 +1,13 @@ package org.fuseri.modulelanguageschool.course; -import org.fuseri.modulelanguageschool.common.ResourceNotFoundException; import org.fuseri.modulelanguageschool.user.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.server.ResponseStatusException; import java.util.List; import java.util.Optional; @@ -29,7 +30,8 @@ public class CourseService { @Transactional(readOnly = true) public Course findById(Long id) { return courseRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException("Course with id: " + id + " was not found.")); + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, + "Course with id: " + id + " was not found.")); } @Transactional(readOnly = true) @@ -48,7 +50,8 @@ public class CourseService { course.setProficiency(newCourse.getProficiency()); return courseRepository.save(course); } else { - throw new ResourceNotFoundException("Course with id: " + id + " was not found."); + throw new ResponseStatusException(HttpStatus.NOT_FOUND, + "Course with id: " + id + " was not found."); } } @@ -72,7 +75,8 @@ public class CourseService { course.enrolStudent(student); return courseRepository.save(course); } else { - throw new ResourceNotFoundException("Course with id: " + id + " was not found."); + throw new ResponseStatusException(HttpStatus.NOT_FOUND, + "Course with id: " + id + " was not found."); } } @@ -83,7 +87,8 @@ public class CourseService { course.expelStudent(student); return courseRepository.save(course); } else { - throw new ResourceNotFoundException("Course with id: " + id + " was not found."); + throw new ResponseStatusException(HttpStatus.NOT_FOUND, + "Course with id: " + id + " was not found."); } } } diff --git a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseServiceTest.java b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseServiceTest.java index de62ebb600738b604d572b84ab23d804b2010ee1..f0ccbe5ba0be6b5204fbd910ef174dfb2decf548 100644 --- a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseServiceTest.java +++ b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseServiceTest.java @@ -1,6 +1,5 @@ package org.fuseri.modulelanguageschool.course; -import org.fuseri.modulelanguageschool.common.ResourceNotFoundException; import org.fuseri.modulelanguageschool.user.Address; import org.fuseri.modulelanguageschool.user.User; import org.fuseri.modulelanguageschool.user.UserType; @@ -13,6 +12,8 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.web.server.ResponseStatusException; + import java.util.*; import static org.mockito.Mockito.*; @@ -50,7 +51,7 @@ final class CourseServiceTest { void notFoundById() { when(courseRepository.findById(anyLong())).thenReturn(Optional.empty()); - Assertions.assertThrows(ResourceNotFoundException.class, () -> courseService.findById(anyLong())); + Assertions.assertThrows(ResponseStatusException.class, () -> courseService.findById(anyLong())); } @Test @@ -94,7 +95,7 @@ final class CourseServiceTest { Long id = 1L; when(courseRepository.findById(anyLong())).thenReturn(Optional.empty()); - Assertions.assertThrows(ResourceNotFoundException.class, () -> courseService.update(id, course)); + Assertions.assertThrows(ResponseStatusException.class, () -> courseService.update(id, course)); } @Test @@ -147,7 +148,7 @@ final class CourseServiceTest { Long id = 1L; when(courseRepository.findById(anyLong())).thenReturn(Optional.empty()); - Assertions.assertThrows(ResourceNotFoundException.class, () -> courseService.enrol(id, user)); + Assertions.assertThrows(ResponseStatusException.class, () -> courseService.enrol(id, user)); } @Test @@ -168,7 +169,7 @@ final class CourseServiceTest { Long id = 1L; when(courseRepository.findById(anyLong())).thenReturn(Optional.empty()); - Assertions.assertThrows(ResourceNotFoundException.class, () -> courseService.expel(id, user)); + Assertions.assertThrows(ResponseStatusException.class, () -> courseService.expel(id, user)); } }