From 34869b1dbc1ea5729370cd9334a7cf06dceba1ec Mon Sep 17 00:00:00 2001
From: joalhelk <joalhelk@jyu.fi>
Date: Thu, 24 Mar 2022 10:38:43 +0200
Subject: [PATCH] admin can delete user

---
 .../frames/subframes/AdminFrame.java          |  5 +++-
 .../watcherGui/httpRequests/HttpRequests.java | 29 +++++++++++++++++++
 .../appuser/AppUserController.java            | 10 +++----
 .../watcherServer/appuser/AppUserService.java |  1 -
 .../token/ConfirmationTokenRepository.java    | 11 +++++++
 .../token/ConfirmationTokenService.java       | 10 +++++++
 .../security/config/WebSecurityConfig.java    |  3 +-
 7 files changed, 61 insertions(+), 8 deletions(-)

diff --git a/WatcherGui/src/main/java/com/joelhelkala/watcherGui/frames/subframes/AdminFrame.java b/WatcherGui/src/main/java/com/joelhelkala/watcherGui/frames/subframes/AdminFrame.java
index d6e9149..9c50d3e 100644
--- a/WatcherGui/src/main/java/com/joelhelkala/watcherGui/frames/subframes/AdminFrame.java
+++ b/WatcherGui/src/main/java/com/joelhelkala/watcherGui/frames/subframes/AdminFrame.java
@@ -13,12 +13,14 @@ import javax.swing.Box;
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
+import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JTextField;
 import javax.swing.SwingConstants;
 
 import com.joelhelkala.watcherGui.Colors.Colors;
 import com.joelhelkala.watcherGui.Datatypes.UserType;
+import com.joelhelkala.watcherGui.frames.WelcomePage;
 import com.joelhelkala.watcherGui.httpRequests.HttpRequests;
 
 public class AdminFrame extends JPanel implements ActionListener {
@@ -88,7 +90,8 @@ public class AdminFrame extends JPanel implements ActionListener {
 
 	// Delete user with given id
 	private void performActionOnId(Long id) {
-		System.out.println("Delete : " + id);
+		boolean delete = WelcomePage.handleSave();
+		if(delete) HttpRequests.deleteUser(id);
 	}
 
 	@Override
diff --git a/WatcherGui/src/main/java/com/joelhelkala/watcherGui/httpRequests/HttpRequests.java b/WatcherGui/src/main/java/com/joelhelkala/watcherGui/httpRequests/HttpRequests.java
index 5e6b7d0..a148dce 100644
--- a/WatcherGui/src/main/java/com/joelhelkala/watcherGui/httpRequests/HttpRequests.java
+++ b/WatcherGui/src/main/java/com/joelhelkala/watcherGui/httpRequests/HttpRequests.java
@@ -253,6 +253,35 @@ public class HttpRequests {
 		}
 		return data;
 	}
+	
+	// Deletes the user with given id
+	public static void deleteUser(Long id) {
+		try {
+			URL url = new URL(address + "/appuser/"+id);
+			StringBuilder response = new StringBuilder();
+			HttpURLConnection con = (HttpURLConnection)url.openConnection();
+			con.setRequestMethod("DELETE");
+			con.setRequestProperty("Content-Type", "application/json; utf-8");
+			con.setRequestProperty("Accept", "application/json");
+			con.setDoOutput(true);
+	        con.setRequestProperty("Authorization","Bearer " + User.getToken());
+	        try(BufferedReader br = new BufferedReader(
+  			  new InputStreamReader(con.getInputStream(), "utf-8"))) {
+  			    String responseLine = null;
+  			    while ((responseLine = br.readLine()) != null) {
+  			        response.append(responseLine.trim());
+  			    }
+  			}
+	        System.out.println(response.toString());
+			con.disconnect();
+		} catch (MalformedURLException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
 
 	/*
 	 * Send a PUT request to update a node
diff --git a/watcherServer/src/main/java/com/joelhelkala/watcherServer/appuser/AppUserController.java b/watcherServer/src/main/java/com/joelhelkala/watcherServer/appuser/AppUserController.java
index 298b36c..9ce7ae9 100644
--- a/watcherServer/src/main/java/com/joelhelkala/watcherServer/appuser/AppUserController.java
+++ b/watcherServer/src/main/java/com/joelhelkala/watcherServer/appuser/AppUserController.java
@@ -1,11 +1,8 @@
 package com.joelhelkala.watcherServer.appuser;
 
-import com.joelhelkala.watcherServer.response.UserGetResponse;
+import com.joelhelkala.watcherServer.registration.token.ConfirmationTokenService;
 import com.joelhelkala.watcherServer.response.UserType;
-import org.apache.catalina.User;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -15,10 +12,12 @@ import java.util.List;
 public class AppUserController {
 
     private final AppUserService userService;
+    private final ConfirmationTokenService confirmationTokenService;
 
     @Autowired
-    public AppUserController(AppUserService userService) {
+    public AppUserController(AppUserService userService, ConfirmationTokenService confirmationTokenService) {
         this.userService = userService;
+        this.confirmationTokenService = confirmationTokenService;
     }
 
     // Endpoint for person GET request which returns all the users
@@ -38,6 +37,7 @@ public class AppUserController {
     // TODO: perhaps change to email?
     @DeleteMapping(path = "{personId}")
     public void deletePerson(@PathVariable("personId") Long id) {
+        confirmationTokenService.deleteTokenByUser(id);
         userService.deleteUser(id);
     }
 
diff --git a/watcherServer/src/main/java/com/joelhelkala/watcherServer/appuser/AppUserService.java b/watcherServer/src/main/java/com/joelhelkala/watcherServer/appuser/AppUserService.java
index ea76b8b..e3bbcf9 100644
--- a/watcherServer/src/main/java/com/joelhelkala/watcherServer/appuser/AppUserService.java
+++ b/watcherServer/src/main/java/com/joelhelkala/watcherServer/appuser/AppUserService.java
@@ -70,7 +70,6 @@ public class AppUserService implements UserDetailsService {
 
     // Delete a user with given id
     public void deleteUser(Long id) {
-        // TODO: first remove the table with foreign key (confirmation token)
         log.info("Deleting user with ID: " + id);
 
         boolean exists = appUserRepository.existsById(id);
diff --git a/watcherServer/src/main/java/com/joelhelkala/watcherServer/registration/token/ConfirmationTokenRepository.java b/watcherServer/src/main/java/com/joelhelkala/watcherServer/registration/token/ConfirmationTokenRepository.java
index e7af774..f783833 100644
--- a/watcherServer/src/main/java/com/joelhelkala/watcherServer/registration/token/ConfirmationTokenRepository.java
+++ b/watcherServer/src/main/java/com/joelhelkala/watcherServer/registration/token/ConfirmationTokenRepository.java
@@ -3,6 +3,7 @@ package com.joelhelkala.watcherServer.registration.token;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 import javax.transaction.Transactional;
@@ -21,4 +22,14 @@ public interface ConfirmationTokenRepository extends JpaRepository<ConfirmationT
             "WHERE c.token = ?1")
     int updateConfirmedAt(String token,
                           LocalDateTime confirmedAt);
+    
+    @Transactional
+    @Modifying
+    @Query(value = "DELETE FROM ConfirmationToken c WHERE c.appUser.id = :id")
+    int deleteByUserId(@Param("id") Long id);
+
+    @Query("SELECT c " +
+            "FROM ConfirmationToken c " +
+            "WHERE c.appUser.id = ?1")
+    Optional<ConfirmationToken> existsByUserId(Long id);
 }
diff --git a/watcherServer/src/main/java/com/joelhelkala/watcherServer/registration/token/ConfirmationTokenService.java b/watcherServer/src/main/java/com/joelhelkala/watcherServer/registration/token/ConfirmationTokenService.java
index 4b08fce..e5a2846 100644
--- a/watcherServer/src/main/java/com/joelhelkala/watcherServer/registration/token/ConfirmationTokenService.java
+++ b/watcherServer/src/main/java/com/joelhelkala/watcherServer/registration/token/ConfirmationTokenService.java
@@ -1,6 +1,7 @@
 package com.joelhelkala.watcherServer.registration.token;
 
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
@@ -8,6 +9,7 @@ import java.util.Optional;
 
 @Service
 @AllArgsConstructor
+@Slf4j
 public class ConfirmationTokenService {
 
     private final ConfirmationTokenRepository confirmationTokenRepository;
@@ -24,4 +26,12 @@ public class ConfirmationTokenService {
         return confirmationTokenRepository.updateConfirmedAt(
                 token, LocalDateTime.now());
     }
+
+    public void deleteTokenByUser(Long userId) {
+        log.info("Deleting token with userID : {}", userId);
+        Optional<ConfirmationToken> exists = confirmationTokenRepository.existsByUserId(userId);
+        if(!exists.isPresent()) return;
+        int removed = confirmationTokenRepository.deleteByUserId(userId);
+        log.info("deleted {} tokens", removed);
+    }
 }
diff --git a/watcherServer/src/main/java/com/joelhelkala/watcherServer/security/config/WebSecurityConfig.java b/watcherServer/src/main/java/com/joelhelkala/watcherServer/security/config/WebSecurityConfig.java
index 009f2d7..16a1fc7 100644
--- a/watcherServer/src/main/java/com/joelhelkala/watcherServer/security/config/WebSecurityConfig.java
+++ b/watcherServer/src/main/java/com/joelhelkala/watcherServer/security/config/WebSecurityConfig.java
@@ -19,6 +19,7 @@ import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 
+import static org.springframework.http.HttpMethod.DELETE;
 import static org.springframework.http.HttpMethod.GET;
 
 @Configuration @EnableWebSecurity @RequiredArgsConstructor
@@ -49,8 +50,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 
 
         // GET requests to appuser endpoint should have ADMIN roles
-        // TODO: This does not work I think
         http.authorizeRequests().antMatchers(GET, "/api/v*/appuser").hasAnyAuthority("ADMIN");
+        http.authorizeRequests().antMatchers(DELETE, "/api/v*/appuser").hasAnyAuthority("ADMIN");
         // Every request should be authenticated
         http.authorizeRequests().anyRequest().authenticated();
         http.addFilter(customAuthenticationFilter);
-- 
GitLab