From 05489712d623b0d63f2db7619e6019adf5bce6b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gargalovi=C4=8D?= <xgargal@fi.muni.cz> Date: Tue, 11 Apr 2023 12:18:02 +0200 Subject: [PATCH] added OpenApi and facade to controller --- .../user/UserController.java | 110 +++++++++++++----- 1 file changed, 83 insertions(+), 27 deletions(-) diff --git a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/user/UserController.java b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/user/UserController.java index d0c6429b..fccd782f 100644 --- a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/user/UserController.java +++ b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/user/UserController.java @@ -1,13 +1,20 @@ package org.fuseri.modulelanguageschool.user; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import jakarta.persistence.EntityNotFoundException; import org.fuseri.model.dto.common.Result; -import org.fuseri.model.dto.user.AddressDto; import org.fuseri.model.dto.user.UserAddLanguageDto; import org.fuseri.model.dto.user.UserCreateDto; import org.fuseri.model.dto.user.UserDto; import org.fuseri.model.dto.user.UserLoginDto; import org.fuseri.modulelanguageschool.course.Course; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import jakarta.validation.Valid; import jakarta.validation.constraints.PositiveOrZero; @@ -20,71 +27,120 @@ import java.util.List; @RequestMapping("/users") public class UserController { - private final UserService service; - private final UserMapper mapper; + private final UserFacade facade; @Autowired - public UserController(UserService service/*, UserMapper mapper*/) { - this.service = service; - this.mapper = null; + public UserController(UserFacade facade) { + this.facade = facade; + } + @Operation(summary = "Get a user by Id", description = "Returns a user with specified Id") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "User with the specified Id is retrieved Successfuly", + content = @Content(schema = @Schema(implementation = UserDto.class) + )), + @ApiResponse(responseCode = "404", description = "User with the specified ID was not found.") + }) @GetMapping("/{id}") - public UserDto find(@PathVariable String id) { - return new UserDto("spracher","spracher@gmail.com","Sprach","MeNot",new AddressDto()); + public ResponseEntity<UserDto> find(@PathVariable Long id) { + try { + return ResponseEntity.ok(facade.find(id)); + } catch (EntityNotFoundException e) { + return ResponseEntity.notFound().build(); + } } + + @Operation(summary = "Create a User", description = "Creates a new User.") + @ApiResponses(value = { + @ApiResponse(responseCode = "201", description = "User created successfully."), + @ApiResponse(responseCode = "400", description = "Invalid input.") + }) @PostMapping - public UserDto create(@Valid @RequestBody UserCreateDto dto) { - return new UserDto(dto.getUsername(),dto.getEmail(),dto.getFirstName(),dto.getLastName(),dto.getAddress()); + public ResponseEntity<UserDto> create(@Valid @RequestBody UserCreateDto dto) { + UserDto user = facade.create(dto); + return ResponseEntity.status(HttpStatus.CREATED).body(user); } + @Operation(summary = "Delete a User with specified ID", description = "Deletes a User with the specified ID.") + @ApiResponses(value = { + @ApiResponse(responseCode = "204", description = "User with the specified ID deleted successfully."), + }) @DeleteMapping("/{id}") - public UserDto deleteUser(@PathVariable String id) { - return new UserDto("spracher","spracher@gmail.com","Sprach","MeNot",new AddressDto()); + public ResponseEntity<Void> deleteUser(@PathVariable Long id) { + facade.delete(id); + return ResponseEntity.noContent().build(); + } + @Operation(summary = "Update a User", description = "Updates a User with the specified ID.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "User with the specified ID updated successfully."), + @ApiResponse(responseCode = "400", description = "Invalid input."), + @ApiResponse(responseCode = "404", description = "User with the specified ID was not found.") + }) @PutMapping("/update/{id}") - public UserDto update(@PositiveOrZero @PathVariable String id,@Valid @RequestBody UserCreateDto user) { + public ResponseEntity<UserDto> update(@PositiveOrZero @PathVariable Long id, @Valid @RequestBody UserCreateDto dto) { - return new UserDto(user.getUsername(),user.getEmail(),user.getFirstName(),user.getLastName(),user.getAddress()); + try { + return ResponseEntity.ok(facade.update(id, dto)); + } catch (EntityNotFoundException e) { + return ResponseEntity.notFound().build(); + } } + @Operation(summary = "Get Users in paginated format", description = "Returns Users in paginated format.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Successfully retrieved paginated Users"), + @ApiResponse(responseCode = "400", description = "Invalid page number supplied"), + }) @GetMapping("/all") - public Result<UserDto> findAll(@PositiveOrZero @RequestParam int page) { - var res = new Result<UserDto>(); - res.setItems(List.of(new UserDto("spracher","spracher@gmail.com","Sprach","MeNot",new AddressDto()) -)); - - return res; + public ResponseEntity<Result<UserDto>> findAll(@PositiveOrZero @RequestParam int page) { + return ResponseEntity.ok(facade.findAll(page)); } + //TODO: add authentication @PostMapping("/login") - public String login(@Valid @RequestBody UserLoginDto dto) { + public String login(@RequestBody UserLoginDto dto) { return String.format("User %s has spawned", dto.getUsername()); } - + //TODO: add authentication @PostMapping("/logout/{id}") - public String logout(@PathVariable String id) { + public String logout(@PathVariable Long id) { return "user has logged out"; } + + // TODO do according to Course @GetMapping("/finished/{id}") - public List<Course> getFinished(@PathVariable String id) { + public List<Course> getFinished(@PathVariable Long id) { return new ArrayList<>(); } + // TODO do according to Course + @GetMapping("/enrolled/{id}") - public List<Course> getEnrolled(@PathVariable String id) { + public List<Course> getEnrolled(@PathVariable Long id) { return new ArrayList<>(); } + @Operation(summary = "adds a language", description = "adds a new language and proficiency to user") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Successfully added a language"), + @ApiResponse(responseCode = "404", description = "User with given Id does not exist"), + @ApiResponse(responseCode = "400", description = "Invalid input") + }) @PutMapping("/addLanguage/{id}") - public String addLanguage(@PathVariable String id,@Valid @RequestBody UserAddLanguageDto body) { - return "added Absolutely Nothing successfully!"; + public ResponseEntity<UserDto> addLanguage(@PathVariable Long id, @Valid @RequestBody UserAddLanguageDto body) { + try { + return ResponseEntity.ok(facade.addLanguage(id, body)); + } catch (EntityNotFoundException e) { + return ResponseEntity.notFound().build(); + } } } -- GitLab