From 48101c75d4d9e9b1b6f9adee308d9c95320bc46c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Theodor=20Angerg=C3=A5rd?= Date: Fri, 21 Jun 2024 00:06:58 +0200 Subject: [PATCH] Add GET /clients/v1/users/{id} and fix GET /clients/v1/superGroups --- .../api/client/ClientApiV1Controller.java | 15 +++++++++-- .../primary/api/info/InfoV1ApiController.java | 2 +- .../primary/web/ClientsController.java | 2 +- .../primary/web/GammaErrorController.java | 27 ++++++++++--------- .../adapter/primary/web/ThymeleafAdvice.java | 9 +++++++ .../adapter/primary/web/UsersController.java | 3 ++- .../app/supergroup/SuperGroupFacade.java | 2 +- .../chalmers/gamma/app/user/UserFacade.java | 9 ++++++- 8 files changed, 49 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/it/chalmers/gamma/adapter/primary/api/client/ClientApiV1Controller.java b/app/src/main/java/it/chalmers/gamma/adapter/primary/api/client/ClientApiV1Controller.java index d8bb459d8..4e8ace482 100644 --- a/app/src/main/java/it/chalmers/gamma/adapter/primary/api/client/ClientApiV1Controller.java +++ b/app/src/main/java/it/chalmers/gamma/adapter/primary/api/client/ClientApiV1Controller.java @@ -109,12 +109,23 @@ List getUsersForClient() { return this.userFacade.getAllByClientAccepting().stream().map(ClientV1User::new).toList(); } + @GetMapping("/users/{id}") + ClientV1User getUser(@PathVariable("id") UUID id) { + return this.userFacade + .get(id) + .map(ClientV1User::new) + .orElseThrow( + () -> + new ResponseStatusException( + HttpStatus.NOT_FOUND, "User Not Found Or Unauthorized")); + } + @GetMapping("/groups/for/{id}") - List getUsersForGroup(@PathVariable("id") UUID id) { + List getGroupsForUser(@PathVariable("id") UUID id) { Optional maybeUser; try { - maybeUser = this.userFacade.get(id); + maybeUser = this.userFacade.getWithGroups(id); } catch (AccessGuard.AccessDeniedException e) { throw new ResponseStatusException(HttpStatus.NOT_FOUND, "User Not Found Or Unauthorized"); } diff --git a/app/src/main/java/it/chalmers/gamma/adapter/primary/api/info/InfoV1ApiController.java b/app/src/main/java/it/chalmers/gamma/adapter/primary/api/info/InfoV1ApiController.java index 4761a771f..c80cbd34c 100644 --- a/app/src/main/java/it/chalmers/gamma/adapter/primary/api/info/InfoV1ApiController.java +++ b/app/src/main/java/it/chalmers/gamma/adapter/primary/api/info/InfoV1ApiController.java @@ -30,7 +30,7 @@ public InfoV1ApiController(SuperGroupFacade superGroupFacade, UserFacade userFac @GetMapping("/users/{id}") public UserFacade.UserWithGroupsDTO getUser(@PathVariable("id") UUID id) { - return this.userFacade.get(id).orElseThrow(UserNotFoundResponse::new); + return this.userFacade.getWithGroups(id).orElseThrow(UserNotFoundResponse::new); } @GetMapping("/blob") diff --git a/app/src/main/java/it/chalmers/gamma/adapter/primary/web/ClientsController.java b/app/src/main/java/it/chalmers/gamma/adapter/primary/web/ClientsController.java index cad076830..f0908b3f9 100644 --- a/app/src/main/java/it/chalmers/gamma/adapter/primary/web/ClientsController.java +++ b/app/src/main/java/it/chalmers/gamma/adapter/primary/web/ClientsController.java @@ -466,7 +466,7 @@ public ModelAndView createAuthority( throw new RuntimeException(e); } - users.add(this.userFacade.get(user).orElseThrow().user()); + users.add(this.userFacade.getWithGroups(user).orElseThrow().user()); }); } diff --git a/app/src/main/java/it/chalmers/gamma/adapter/primary/web/GammaErrorController.java b/app/src/main/java/it/chalmers/gamma/adapter/primary/web/GammaErrorController.java index ba4a942d1..9552d9964 100644 --- a/app/src/main/java/it/chalmers/gamma/adapter/primary/web/GammaErrorController.java +++ b/app/src/main/java/it/chalmers/gamma/adapter/primary/web/GammaErrorController.java @@ -10,20 +10,21 @@ @Controller public class GammaErrorController implements ErrorController { - @GetMapping("/error") - public ModelAndView handleRuntimeException(@RequestHeader(value = "HX-Request", required = false) boolean htmxRequest, HttpServletResponse response) { - response.addHeader("HX-Retarget", "body"); - response.addHeader("HX-Reswap", "innerHTML"); + @GetMapping("/error") + public ModelAndView handleRuntimeException( + @RequestHeader(value = "HX-Request", required = false) boolean htmxRequest, + HttpServletResponse response) { + response.addHeader("HX-Retarget", "body"); + response.addHeader("HX-Reswap", "innerHTML"); - ModelAndView mv = new ModelAndView(); - if (htmxRequest) { - mv.setViewName("pages/error"); - } else { - mv.setViewName("index"); - mv.addObject("page", "pages/error"); - } - - return mv; + ModelAndView mv = new ModelAndView(); + if (htmxRequest) { + mv.setViewName("pages/error"); + } else { + mv.setViewName("index"); + mv.addObject("page", "pages/error"); } + return mv; + } } diff --git a/app/src/main/java/it/chalmers/gamma/adapter/primary/web/ThymeleafAdvice.java b/app/src/main/java/it/chalmers/gamma/adapter/primary/web/ThymeleafAdvice.java index 828908d46..71ac037b1 100644 --- a/app/src/main/java/it/chalmers/gamma/adapter/primary/web/ThymeleafAdvice.java +++ b/app/src/main/java/it/chalmers/gamma/adapter/primary/web/ThymeleafAdvice.java @@ -56,4 +56,13 @@ public ModelAndView handleMaxSizeException(HttpServletResponse response) { public void handleAccessDeniedException(HttpServletResponse response) throws IOException { response.sendRedirect("/"); } + + @ExceptionHandler(RuntimeException.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + public ModelAndView handleRuntimeException(RuntimeException ex, HttpServletResponse response) { + response.addHeader("HX-Retarget", "body"); + response.addHeader("HX-Reswap", "innerHTML"); + + return new ModelAndView("pages/error"); + } } diff --git a/app/src/main/java/it/chalmers/gamma/adapter/primary/web/UsersController.java b/app/src/main/java/it/chalmers/gamma/adapter/primary/web/UsersController.java index 51cd7987c..dbe5ca64d 100644 --- a/app/src/main/java/it/chalmers/gamma/adapter/primary/web/UsersController.java +++ b/app/src/main/java/it/chalmers/gamma/adapter/primary/web/UsersController.java @@ -106,7 +106,8 @@ public ModelAndView getUser( mv.addObject("email", u.user().email()); mv.addObject("locked", u.user().locked()); } else { - Optional user = this.userFacade.get(UUID.fromString(userId)); + Optional user = + this.userFacade.getWithGroups(UUID.fromString(userId)); if (user.isEmpty()) { return createUserNotFound(userId, htmxRequest); diff --git a/app/src/main/java/it/chalmers/gamma/app/supergroup/SuperGroupFacade.java b/app/src/main/java/it/chalmers/gamma/app/supergroup/SuperGroupFacade.java index ecd65452d..c99f9d461 100644 --- a/app/src/main/java/it/chalmers/gamma/app/supergroup/SuperGroupFacade.java +++ b/app/src/main/java/it/chalmers/gamma/app/supergroup/SuperGroupFacade.java @@ -166,7 +166,7 @@ public void deleteSuperGroup(UUID superGroupId) } public List getAll() { - accessGuard.requireEither(isAdmin(), isSignedIn()); + accessGuard.requireEither(isAdmin(), isClientApi(), isSignedIn()); return this.superGroupRepository.getAll().stream().map(SuperGroupDTO::new).toList(); } diff --git a/app/src/main/java/it/chalmers/gamma/app/user/UserFacade.java b/app/src/main/java/it/chalmers/gamma/app/user/UserFacade.java index 71620e7d6..7727de97d 100644 --- a/app/src/main/java/it/chalmers/gamma/app/user/UserFacade.java +++ b/app/src/main/java/it/chalmers/gamma/app/user/UserFacade.java @@ -38,7 +38,14 @@ public UserFacade( this.clientApprovalsRepository = clientApprovalsRepository; } - public Optional get(UUID id) { + public Optional get(UUID id) { + UserId userId = new UserId(id); + accessGuard.requireEither(isSignedIn(), userHasAcceptedClient(userId), isApi(ApiKeyType.INFO)); + + return this.userRepository.get(userId).map(UserDTO::new); + } + + public Optional getWithGroups(UUID id) { UserId userId = new UserId(id); accessGuard.requireEither(isSignedIn(), userHasAcceptedClient(userId), isApi(ApiKeyType.INFO));