user module API

DELETE /user
DELETE /user/search
DELETE /user/subscription

Change-Id: I4d6dfa5da5ed782c6fd78b8324191fd60bf8cfff
diff --git a/src/main/java/com/g9/g9backend/controller/UserController.java b/src/main/java/com/g9/g9backend/controller/UserController.java
index 1be4222..48ec0cd 100644
--- a/src/main/java/com/g9/g9backend/controller/UserController.java
+++ b/src/main/java/com/g9/g9backend/controller/UserController.java
@@ -7,6 +7,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.*;
 
@@ -25,10 +26,13 @@
 
     private final SubscriptionService subscriptionService;
 
-    public UserController(UserService userService, InvitationService invitationService, SubscriptionService subscriptionService) {
+    private final SearchHistoryService searchHistoryService;
+
+    public UserController(UserService userService, InvitationService invitationService, SubscriptionService subscriptionService, SearchHistoryService searchHistoryService) {
         this.userService = userService;
         this.invitationService = invitationService;
         this.subscriptionService = subscriptionService;
+        this.searchHistoryService = searchHistoryService;
     }
 
     private final Logger logger = LoggerFactory.getLogger(UserController.class);
@@ -82,9 +86,9 @@
         User userGetId = userService.getOne(userQuery);
         int newUserId = userGetId.getUserId();
 
-        UpdateWrapper<Invitation> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.eq("invitation_code", invitationCode).set("invitee_id", newUserId);
-        invitationService.update(updateWrapper);
+        UpdateWrapper<Invitation> invitationUpdate = new UpdateWrapper<>();
+        invitationUpdate.eq("invitation_code", invitationCode).set("invitee_id", newUserId);
+        invitationService.update(invitationUpdate);
 
         // 生成五个邀请码并分配给新用户
         String[] invitationCodes = invitationService.generateInvitationCode();
@@ -143,4 +147,60 @@
         subscriptionService.save(subscription);
         return ResponseEntity.ok("");
     }
+
+    /**
+     * 注销账户
+     *
+     * @param userId   用户id
+     * @param password 密码
+     * @return 注销结果
+     */
+    @DeleteMapping
+    @ResponseStatus(HttpStatus.NO_CONTENT)
+    public ResponseEntity<String> userDelete(@RequestParam int userId, @RequestParam String password) {
+        logger.warn("Delete user with id: {}", userId);
+        // 根据用户id查询该用户
+        QueryWrapper<User> userQuery = new QueryWrapper<>();
+        userQuery.eq("user_id", userId);
+        User userCheck = userService.getOne(userQuery);
+
+        if (userCheck.getPassword().equals(password)) {
+            // 注销账户(自动清除与该用户相关的记录,注意会回收分配给该用户的邀请码)
+            userService.remove(userQuery);
+
+            return ResponseEntity.noContent().build();
+        } else {
+            logger.warn("Delete failed. Incorrect password for account: {}", password);
+            return ResponseEntity.status(408).body("");
+        }
+    }
+
+    /**
+     * 删除用户搜索历史
+     *
+     * @param searchHistoryId 搜索历史id
+     * @return 删除用户搜索历史结果
+     */
+    @DeleteMapping("/search")
+    @ResponseStatus(HttpStatus.NO_CONTENT)
+    public ResponseEntity<String> searchDelete(@RequestParam int searchHistoryId) {
+        searchHistoryService.removeById(searchHistoryId);
+        return ResponseEntity.noContent().build();
+    }
+
+    /**
+     * 取消关注
+     *
+     * @param userId     被关注者id
+     * @param followerId 关注被人者id
+     * @return 取消关注结果
+     */
+    @DeleteMapping("/subscription")
+    @ResponseStatus(HttpStatus.NO_CONTENT)
+    public ResponseEntity<String> subscriptionDelete(@RequestParam int userId, @RequestParam int followerId) {
+        QueryWrapper<Subscription> subscriptionQuery = new QueryWrapper<>();
+        subscriptionQuery.eq("user_id", userId).eq("follower_id", followerId);
+        subscriptionService.remove(subscriptionQuery);
+        return ResponseEntity.noContent().build();
+    }
 }
\ No newline at end of file