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