diff --git a/app/src/main/java/it/chalmers/gamma/adapter/primary/web/DeleteYourAccountController.java b/app/src/main/java/it/chalmers/gamma/adapter/primary/web/DeleteYourAccountController.java new file mode 100644 index 000000000..75116c46a --- /dev/null +++ b/app/src/main/java/it/chalmers/gamma/adapter/primary/web/DeleteYourAccountController.java @@ -0,0 +1,60 @@ +package it.chalmers.gamma.adapter.primary.web; + +import it.chalmers.gamma.app.user.MeFacade; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.servlet.ModelAndView; + +@Controller +public class DeleteYourAccountController { + + private final MeFacade meFacade; + + public DeleteYourAccountController(MeFacade meFacade) { + this.meFacade = meFacade; + } + + public record DeleteYourAccountForm(String password) {} + + @GetMapping("/delete-your-account") + public ModelAndView getDeleteYourAccount( + @RequestHeader(value = "HX-Request", required = false) boolean htmxRequest) { + ModelAndView mv = new ModelAndView(); + + if (htmxRequest) { + mv.setViewName("pages/delete-your-account"); + } else { + mv.setViewName("index"); + mv.addObject("page", "pages/delete-your-account"); + } + + mv.addObject("form", new DeleteYourAccountForm("")); + + return mv; + } + + @DeleteMapping("/delete-your-account") + public ModelAndView deleteYourAccount( + DeleteYourAccountForm form, final BindingResult bindingResult) { + try { + this.meFacade.deleteMe(form.password); + } catch (IllegalArgumentException e) { + bindingResult.addError( + new FieldError("form", "password", "Incorrect password")); + + ModelAndView mv = new ModelAndView(); + + mv.setViewName("pages/delete-your-account"); + mv.addObject("form", new DeleteYourAccountForm("")); + mv.addObject(BindingResult.MODEL_KEY_PREFIX + "form", bindingResult); + + return mv; + } + + return new ModelAndView("redirect:/login?deleted"); + } +} diff --git a/app/src/main/java/it/chalmers/gamma/adapter/primary/web/LoginController.java b/app/src/main/java/it/chalmers/gamma/adapter/primary/web/LoginController.java index 31bbff9c5..08ec48e66 100644 --- a/app/src/main/java/it/chalmers/gamma/adapter/primary/web/LoginController.java +++ b/app/src/main/java/it/chalmers/gamma/adapter/primary/web/LoginController.java @@ -17,6 +17,7 @@ public ModelAndView getLogin( @RequestParam(value = "error", required = false) String error, @RequestParam(value = "logout", required = false) String logout, @RequestParam(value = "authorizing", required = false) String authorizing, + @RequestParam(value = "deleted", required = false) String deleted, @RequestHeader(value = "HX-Request", required = false) boolean htmxRequest, @RequestParam(value = "throttle", required = false) String throttle, HttpServletResponse response) { @@ -36,10 +37,12 @@ public ModelAndView getLogin( boolean isAuthorizing = authorizing != null; boolean isThrottled = throttle != null; + boolean isDeleted = deleted != null; mv.addObject("error", error); mv.addObject("logout", logout); mv.addObject("authorizing", isAuthorizing); + mv.addObject("deleted", isDeleted); mv.addObject("throttle", isThrottled); response.addHeader("HX-Retarget", "body"); diff --git a/app/src/main/java/it/chalmers/gamma/app/user/MeFacade.java b/app/src/main/java/it/chalmers/gamma/app/user/MeFacade.java index 3b0b8ceb9..4bc34c4b0 100644 --- a/app/src/main/java/it/chalmers/gamma/app/user/MeFacade.java +++ b/app/src/main/java/it/chalmers/gamma/app/user/MeFacade.java @@ -134,8 +134,10 @@ public void deleteMe(String password) { try { this.userRepository.delete(me.id()); } catch (UserRepository.UserNotFoundException e) { - e.printStackTrace(); + throw new IllegalStateException(); } + } else { + throw new IllegalArgumentException(); } } } diff --git a/app/src/main/resources/templates/pages/delete-your-account.html b/app/src/main/resources/templates/pages/delete-your-account.html new file mode 100644 index 000000000..cf7f3038e --- /dev/null +++ b/app/src/main/resources/templates/pages/delete-your-account.html @@ -0,0 +1,19 @@ +
+
+
+
+ Deleting your account +
+

+ Deleting your account can't be reversed. +

+
+
+
+ +
+
\ No newline at end of file diff --git a/app/src/main/resources/templates/pages/login.html b/app/src/main/resources/templates/pages/login.html index ac0774ca8..7f511835e 100644 --- a/app/src/main/resources/templates/pages/login.html +++ b/app/src/main/resources/templates/pages/login.html @@ -31,6 +31,10 @@

You have been throttled for attempting to sign in too many times...

+

+ Your account has been deleted. +

+ Register diff --git a/app/src/main/resources/templates/pages/me.html b/app/src/main/resources/templates/pages/me.html index 44f57fe4f..cad9605f2 100644 --- a/app/src/main/resources/templates/pages/me.html +++ b/app/src/main/resources/templates/pages/me.html @@ -78,4 +78,25 @@ +
+
+ Do you want to delete your account? +
+

+ Here you can delete your account and prevent further access for clients you have accepted. + You have the right to ensure all of your data is removed. + Please email ita@chalmers.it, along with: +

+

+ UserId: +

+

+ Cid: +

+ +