Merge "resource module API" into main
diff --git a/src/main/java/com/g9/g9backend/controller/ResourceController.java b/src/main/java/com/g9/g9backend/controller/ResourceController.java
index b6726cf..c9a573c 100644
--- a/src/main/java/com/g9/g9backend/controller/ResourceController.java
+++ b/src/main/java/com/g9/g9backend/controller/ResourceController.java
@@ -8,6 +8,7 @@
 import com.g9.g9backend.service.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
@@ -223,4 +224,64 @@
 
         return ResponseEntity.ok("");
     }
+
+    /**
+     * 删除资源
+     *
+     * @param resourceId 资源id
+     * @param userId     用户id
+     * @param password   密码
+     * @return 删除资源结果
+     */
+    @DeleteMapping
+    @ResponseStatus(HttpStatus.NO_CONTENT)
+    public ResponseEntity<String> userDelete(@RequestParam int resourceId, @RequestParam int userId, @RequestParam String password) {
+        logger.warn("Delete resource with id: {}", resourceId);
+        // 根据用户id查询该用户
+        QueryWrapper<User> userQuery = new QueryWrapper<>();
+        userQuery.eq("user_id", userId);
+        User userCheck = userService.getOne(userQuery);
+
+        // 只允许在用户上传资源页进行删除操作,所以不需要验证该资源是由该用户上传的
+        if (userCheck.getPassword().equals(password)) {
+            // 删除资源
+            resourceService.removeById(resourceId);
+            return ResponseEntity.noContent().build();
+        } else {
+            logger.warn("Delete failed. Incorrect password for account: {}", password);
+            return ResponseEntity.status(408).body("");
+        }
+    }
+
+    /**
+     * 取消点赞
+     *
+     * @param userId     用户id
+     * @param resourceId 资源id
+     * @return 取消点赞结果
+     */
+    @DeleteMapping("like")
+    @ResponseStatus(HttpStatus.NO_CONTENT)
+    public ResponseEntity<String> likeDelete(@RequestParam int userId, @RequestParam int resourceId) {
+        QueryWrapper<UserLike> userLikeQuery = new QueryWrapper<>();
+        userLikeQuery.eq("user_id", userId).eq("resource_id", resourceId);
+        userLikeService.remove(userLikeQuery);
+        return ResponseEntity.noContent().build();
+    }
+
+    /**
+     * 取消收藏
+     *
+     * @param userId     用户id
+     * @param resourceId 资源id
+     * @return 取消收藏结果
+     */
+    @DeleteMapping("collection")
+    @ResponseStatus(HttpStatus.NO_CONTENT)
+    public ResponseEntity<String> collectionDelete(@RequestParam int userId, @RequestParam int resourceId) {
+        QueryWrapper<UserCollection> userCollectionQuery = new QueryWrapper<>();
+        userCollectionQuery.eq("user_id", userId).eq("resource_id", resourceId);
+        userCollectionService.remove(userCollectionQuery);
+        return ResponseEntity.noContent().build();
+    }
 }
\ No newline at end of file
diff --git a/src/test/java/com/g9/g9backend/controller/ResourceControllerTest.java b/src/test/java/com/g9/g9backend/controller/ResourceControllerTest.java
index 9d0600b..9d7c908 100644
--- a/src/test/java/com/g9/g9backend/controller/ResourceControllerTest.java
+++ b/src/test/java/com/g9/g9backend/controller/ResourceControllerTest.java
@@ -201,4 +201,56 @@
                         .content(objectMapper.writeValueAsString(new UserResourceDTO(1, 1))))
                 .andExpect(status().isOk());
     }
+
+    // 删除资源
+    @Test
+    public void testDeleteResource_success() throws Exception {
+
+        // 密码正确
+        when(userService.getOne(any())).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+        when(resourceService.removeById(1)).thenReturn(true);
+
+        mockMvc.perform(delete("/resource")
+                        .param("resourceId", "1")
+                        .param("userId", "1")
+                        .param("password", "123"))
+                .andExpect(status().isNoContent());
+    }
+
+    @Test
+    public void testDeleteResource_wrongPassword() throws Exception {
+
+        // 密码错误
+        when(userService.getOne(any())).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+        mockMvc.perform(delete("/resource")
+                        .param("resourceId", "1")
+                        .param("userId", "1")
+                        .param("password", "wrong"))
+                .andExpect(status().is(408));
+    }
+
+    // 取消点赞
+    @Test
+    public void testLikeDelete() throws Exception {
+
+        when(userLikeService.remove(any())).thenReturn(true);
+
+        mockMvc.perform(delete("/resource/like")
+                        .param("userId", "1")
+                        .param("resourceId", "1"))
+                .andExpect(status().isNoContent());
+    }
+
+    // 取消收藏
+    @Test
+    public void testCollectionDelete() throws Exception {
+
+        when(userCollectionService.remove(any())).thenReturn(true);
+
+        mockMvc.perform(delete("/resource/collection")
+                        .param("userId", "1")
+                        .param("resourceId", "1"))
+                .andExpect(status().isNoContent());
+    }
 }
\ No newline at end of file