From 2233f5fe2eee2ca633daacac5f26e12437240ada Mon Sep 17 00:00:00 2001 From: Tor-Einar Skog <tor-einar.skog@nibio.no> Date: Thu, 8 Aug 2024 15:00:52 +0200 Subject: [PATCH] Gracefully delete user that owns barkbeetle season trapsites [BN-14] --- .../controller/servlet/UserController.java | 17 +++++++++++-- .../modules/barkbeetle/BarkbeetleBean.java | 24 +++++++++++++++++++ src/main/webapp/templates/userDeleteForm.ftl | 7 ++++-- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/UserController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/UserController.java index 7fd46c59..8f984d62 100755 --- a/src/main/java/no/nibio/vips/logic/controller/servlet/UserController.java +++ b/src/main/java/no/nibio/vips/logic/controller/servlet/UserController.java @@ -51,6 +51,8 @@ import no.nibio.vips.logic.entity.VipsLogicRole; import no.nibio.vips.logic.entity.VipsLogicUser; import no.nibio.vips.logic.entity.misc.UserResources; import no.nibio.vips.logic.i18n.SessionLocaleUtil; +import no.nibio.vips.logic.modules.barkbeetle.BarkbeetleBean; +import no.nibio.vips.logic.modules.barkbeetle.SeasonTrapsite; import no.nibio.vips.logic.util.Globals; import no.nibio.vips.util.ServletUtil; import no.nibio.web.forms.FormField; @@ -71,6 +73,9 @@ public class UserController extends HttpServlet { @EJB UserBean userBean; + + @EJB + BarkbeetleBean barkbeetleBean; /** * Processes requests for both HTTP <code>GET</code> and <code>POST</code> @@ -406,9 +411,12 @@ public class UserController extends HttpServlet { Integer userId = Integer.valueOf(request.getParameter("userId")); VipsLogicUser viewUser = em.find(VipsLogicUser.class, userId); UserResources userResources = userBean.getUserResources(viewUser); + + // Barkbeetle module dependencies + List<SeasonTrapsite> userSeasonTrapsites = barkbeetleBean.getSeasonTrapsites(viewUser); // If some resources connected, render form, otherwise, route to user delete - if(userResources.isEmpty()) + if(userResources.isEmpty() && userSeasonTrapsites.isEmpty()) { response.sendRedirect(new StringBuilder(Globals.PROTOCOL + "://").append(ServletUtil.getServerName(request)).append("/user").append("?action=deleteUser&userId=").append(userId).toString()); } @@ -423,7 +431,9 @@ public class UserController extends HttpServlet { request.setAttribute("viewUser", viewUser); request.setAttribute("userResources", userResources); + java.util.Collections.sort(users); request.setAttribute("users", users); + request.setAttribute("userBarkbeetleSeasonTrapsites", userSeasonTrapsites); request.setAttribute("errorMsg", request.getParameter("errorMsg")); request.getRequestDispatcher("/userDeleteForm.ftl").forward(request, response); } @@ -450,7 +460,9 @@ public class UserController extends HttpServlet { // Are there resources connected to this user? UserResources userResources = userBean.getUserResources(viewUser); - if(! userResources.isEmpty()) + // Barkbeetle module dependencies + List<SeasonTrapsite> userSeasonTrapsites = barkbeetleBean.getSeasonTrapsites(viewUser); + if(! userResources.isEmpty() || ! userSeasonTrapsites.isEmpty()) { boolean resourcesTransferred = false; try @@ -460,6 +472,7 @@ public class UserController extends HttpServlet { if(transferToUser != null) { userBean.transferUserResources(viewUser,transferToUser); + barkbeetleBean.transferSeasonTrapsites(viewUser,transferToUser); resourcesTransferred = true; } } diff --git a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleBean.java b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleBean.java index 2a0ee7e8..a6e3a4af 100644 --- a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleBean.java +++ b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleBean.java @@ -117,6 +117,30 @@ public class BarkbeetleBean { .getResultList(); } + /** + * Get all trapsites belonging to a specific user + * @param user + * @return + */ + public List<SeasonTrapsite> getSeasonTrapsites(VipsLogicUser user) + { + return em.createNamedQuery("SeasonTrapsite.findByUserId") + .setParameter("userId", user) + .getResultList(); + } + + /** + * Transferring ownership of all season trapsites for all seasons belonging to a user + * to another user + * @param fromUser the current owner of the sites + * @param toUser the new owner of the sites + */ + public void transferSeasonTrapsites(VipsLogicUser fromUser, VipsLogicUser toUser){ + em.createNativeQuery("UPDATE barkbeetle.season_trapsite SET user_id=:toUserId WHERE user_id=:fromUserId") + .setParameter("fromUserId", fromUser.getUserId()) + .setParameter("toUserId", toUser.getUserId()) + .executeUpdate(); + } /** * Get the list of trapsites for the given season * diff --git a/src/main/webapp/templates/userDeleteForm.ftl b/src/main/webapp/templates/userDeleteForm.ftl index c258a807..913557fc 100755 --- a/src/main/webapp/templates/userDeleteForm.ftl +++ b/src/main/webapp/templates/userDeleteForm.ftl @@ -35,7 +35,10 @@ <li>${i18nBundle.weatherStations}: ${userResources.pois?size}</li> <li>${i18nBundle.messages}: ${userResources.messageLocales?size}</li> <li>${i18nBundle.forecasts}: ${userResources.forecastConfigurations?size}</li> - <li>${i18nBundle.observations}: ${userResources.observations?size}</li> + <li>${i18nBundle.observations}: ${userResources.observations?size}</li> + <#if userBarkbeetleSeasonTrapsites?size gt 0 > + <li>Barkbillefellelokaliteter: ${userBarkbeetleSeasonTrapsites?size}</li> + </#if> </ul> <h2>${i18nBundle.transferResources}</h2> <form action="/user?action=deleteUser" method="POST" onsubmit="return confirm('${i18nBundle.confirmDelete}');"/> @@ -48,7 +51,7 @@ </#if> <#list users as user> <#if user.userId != viewUser.userId> - <option value="${user.userId}">${user.firstName!""} ${user.lastName}</option> + <option value="${user.userId}">${user.lastName}, ${user.firstName!""}</option> </#if> </#list> </select> -- GitLab