user module

GET /user/getId
GET /user/invitation-code
GET /user/info
GET /user/reward
GET /user/collection
GET /user/upload
GET /user/purchase
GET /user/search
GET /user/data
GET /user/subscriber
GET /user/follower

Change-Id: I096fb86446831ebdb50ec609d3cde77d5fe77ef5
diff --git a/src/main/java/com/g9/g9backend/controller/UserController.java b/src/main/java/com/g9/g9backend/controller/UserController.java
index 48ec0cd..38b4586 100644
--- a/src/main/java/com/g9/g9backend/controller/UserController.java
+++ b/src/main/java/com/g9/g9backend/controller/UserController.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.g9.g9backend.pojo.*;
 import com.g9.g9backend.pojo.DTO.*;
 import com.g9.g9backend.service.*;
@@ -11,6 +13,9 @@
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * UserController 用户控制器类,处理与用户相关的请求
  *
@@ -28,13 +33,29 @@
 
     private final SearchHistoryService searchHistoryService;
 
-    public UserController(UserService userService, InvitationService invitationService, SubscriptionService subscriptionService, SearchHistoryService searchHistoryService) {
+    private final RewardService rewardService;
+
+    private final UserCollectionService userCollectionService;
+
+    private final UserUploadService userUploadService;
+
+    private final UserPurchaseService userPurchaseService;
+
+    private final ResourceService resourceService;
+
+    public UserController(UserService userService, InvitationService invitationService, SubscriptionService subscriptionService, SearchHistoryService searchHistoryService, RewardService rewardService, UserCollectionService userCollectionService, UserUploadService userUploadService, UserPurchaseService userPurchaseService, ResourceService resourceService) {
         this.userService = userService;
         this.invitationService = invitationService;
         this.subscriptionService = subscriptionService;
         this.searchHistoryService = searchHistoryService;
+        this.rewardService = rewardService;
+        this.userCollectionService = userCollectionService;
+        this.userUploadService = userUploadService;
+        this.userPurchaseService = userPurchaseService;
+        this.resourceService = resourceService;
     }
 
+
     private final Logger logger = LoggerFactory.getLogger(UserController.class);
 
     /**
@@ -203,4 +224,268 @@
         subscriptionService.remove(subscriptionQuery);
         return ResponseEntity.noContent().build();
     }
+
+
+    /**
+     * 获取用户ID
+     *
+     * @param username 用户名
+     * @param password 密码
+     * @return 获取邀请码结果
+     */
+    @GetMapping("/getId")
+    public ResponseEntity<Integer> getUserId(@RequestParam String username, @RequestParam String password) {
+        QueryWrapper<User> userQuery = new QueryWrapper<>();
+        userQuery.eq("username", username).eq("password", password);
+        User user = userService.getOne(userQuery);
+        return ResponseEntity.ok(user.getUserId());
+    }
+
+    /**
+     * 获取邀请码
+     *
+     * @param userId 用户id
+     * @return 获取邀请码结果
+     */
+    @GetMapping("/invitation-code")
+    public ResponseEntity<GetInvitationCodeDTO> getInvitationCode(@RequestParam int userId) {
+        QueryWrapper<Invitation> invitationQuery = new QueryWrapper<>();
+        invitationQuery.eq("user_id", userId).eq("invitee_id", 0); // 获取未被使用过的分配给该用户的邀请码
+        invitationQuery.select("invitation_code");
+        List<Invitation> invitationList = invitationService.list(invitationQuery);
+        GetInvitationCodeDTO getInvitationCodeDTO = new GetInvitationCodeDTO(invitationList);
+        return ResponseEntity.ok(getInvitationCodeDTO);
+    }
+
+    /**
+     * 获取用户信息
+     *
+     * @param userId 用户id
+     * @return 获取用户信息结果
+     */
+    @GetMapping("/info")
+    public ResponseEntity<User> getUserInfo(@RequestParam int userId) {
+        User user = userService.getById(userId);
+        return ResponseEntity.ok(user);
+    }
+
+    /**
+     * 获取用户悬赏
+     *
+     * @param userId     用户id
+     * @param pageNumber 页数
+     * @param rows       行数
+     * @return 获取用户悬赏结果
+     */
+    @GetMapping("/reward")
+    public ResponseEntity<GetUserRewardDTO> getUserReward(@RequestParam int userId, @RequestParam int pageNumber, @RequestParam int rows) {
+        IPage<Reward> page = new Page<>(pageNumber, rows);
+        QueryWrapper<Reward> rewardQuery = new QueryWrapper<>();
+        rewardQuery.eq("user_id", userId);
+        IPage<Reward> rewardPage = rewardService.page(page, rewardQuery);
+        List<Reward> rewardList = rewardPage.getRecords();
+        long total = rewardPage.getTotal();
+        long pages = rewardPage.getPages();
+        long current = rewardPage.getCurrent();
+        long size = rewardPage.getSize();
+
+        GetUserRewardDTO getUserRewardDTO = new GetUserRewardDTO(rewardList, total, pages, current, size);
+        return ResponseEntity.ok(getUserRewardDTO);
+    }
+
+    /**
+     * 获取用户收藏资源
+     *
+     * @param userId     用户id
+     * @param pageNumber 页数
+     * @param rows       行数
+     * @return 获取用户收藏结果
+     */
+    @GetMapping("/collection")
+    public ResponseEntity<GetUserResourceListDTO> getUserCollection(@RequestParam int userId, @RequestParam int pageNumber, @RequestParam int rows) {
+        IPage<UserCollection> page = new Page<>(pageNumber, rows);
+        QueryWrapper<UserCollection> userCollectionQuery = new QueryWrapper<>();
+        userCollectionQuery.eq("user_id", userId);
+        IPage<UserCollection> userCollectionPage = userCollectionService.page(page, userCollectionQuery);
+        List<UserCollection> resourceList = userCollectionPage.getRecords();
+        List<Resource> collectionList = new ArrayList<>();
+        for (UserCollection userCollection : resourceList) {
+            Resource resource = resourceService.getById(userCollection.getResourceId());
+            collectionList.add(resource);
+        }
+        long total = userCollectionPage.getTotal();
+        long pages = userCollectionPage.getPages();
+        long current = userCollectionPage.getCurrent();
+        long size = userCollectionPage.getSize();
+
+        GetUserResourceListDTO getUserResourceListDTO = new GetUserResourceListDTO(collectionList, total, pages, current, size);
+        return ResponseEntity.ok(getUserResourceListDTO);
+    }
+
+    /**
+     * 获取用户上传资源
+     *
+     * @param userId     用户id
+     * @param pageNumber 页数
+     * @param rows       行数
+     * @return 获取用户上传资源结果
+     */
+    @GetMapping("/upload")
+    public ResponseEntity<GetUserResourceListDTO> getUserUpload(@RequestParam int userId, @RequestParam int pageNumber, @RequestParam int rows) {
+        IPage<UserUpload> page = new Page<>(pageNumber, rows);
+        QueryWrapper<UserUpload> userUploadQuery = new QueryWrapper<>();
+        userUploadQuery.eq("user_id", userId);
+        IPage<UserUpload> userUploadPage = userUploadService.page(page, userUploadQuery);
+        List<UserUpload> resourceList = userUploadPage.getRecords();
+        List<Resource> uploadList = new ArrayList<>();
+        for (UserUpload userUpload : resourceList) {
+            Resource resource = resourceService.getById(userUpload.getResourceId());
+            uploadList.add(resource);
+        }
+        long total = userUploadPage.getTotal();
+        long pages = userUploadPage.getPages();
+        long current = userUploadPage.getCurrent();
+        long size = userUploadPage.getSize();
+
+        GetUserResourceListDTO getUserResourceListDTO = new GetUserResourceListDTO(uploadList, total, pages, current, size);
+        return ResponseEntity.ok(getUserResourceListDTO);
+    }
+
+    /**
+     * 获取用户购买资源
+     *
+     * @param userId     用户id
+     * @param pageNumber 页数
+     * @param rows       行数
+     * @return 获取用户购买资源结果
+     */
+    @GetMapping("/purchase")
+    public ResponseEntity<GetUserResourceListDTO> getUserPurchase(@RequestParam int userId, @RequestParam int pageNumber, @RequestParam int rows) {
+        IPage<UserPurchase> page = new Page<>(pageNumber, rows);
+        QueryWrapper<UserPurchase> userPurchaseQuery = new QueryWrapper<>();
+        userPurchaseQuery.eq("user_id", userId);
+        IPage<UserPurchase> userPurchasePage = userPurchaseService.page(page, userPurchaseQuery);
+        List<UserPurchase> resourceList = userPurchasePage.getRecords();
+        List<Resource> purchaseList = new ArrayList<>();
+        for (UserPurchase userPurchase : resourceList) {
+            Resource resource = resourceService.getById(userPurchase.getResourceId());
+            purchaseList.add(resource);
+        }
+        long total = userPurchasePage.getTotal();
+        long pages = userPurchasePage.getPages();
+        long current = userPurchasePage.getCurrent();
+        long size = userPurchasePage.getSize();
+
+        GetUserResourceListDTO getUserResourceListDTO = new GetUserResourceListDTO(purchaseList, total, pages, current, size);
+        return ResponseEntity.ok(getUserResourceListDTO);
+    }
+
+    /**
+     * 获取用户搜索历史
+     *
+     * @param userId 用户id
+     * @return 获取用户搜索历史结果
+     */
+    @GetMapping("/search")
+    public ResponseEntity<GetUserSearchHistoryDTO> getUserSearchHistory(@RequestParam int userId) {
+        QueryWrapper<SearchHistory> SearchHistoryQuery = new QueryWrapper<>();
+        SearchHistoryQuery.eq("user_id", userId).orderByDesc("search_history_id").last("LIMIT 10");
+        List<SearchHistory> searchHistoryList = searchHistoryService.list(SearchHistoryQuery);
+
+        GetUserSearchHistoryDTO getUserSearchHistoryDTO = new GetUserSearchHistoryDTO(searchHistoryList);
+        return ResponseEntity.ok(getUserSearchHistoryDTO);
+    }
+
+    /**
+     * 获取用户数据
+     *
+     * @param userId 用户id
+     * @return 获取用户数据结果
+     */
+    @GetMapping("/data")
+    public ResponseEntity<GetUserDataDTO> getUserData(@RequestParam int userId) {
+        User user = userService.getById(userId);
+        int subscriberCount = user.getSubscriberCount();
+        int uploadAmount = user.getUploadAmount();
+
+        QueryWrapper<UserUpload> UserUploadQuery = new QueryWrapper<>();
+        UserUploadQuery.eq("user_id", userId);
+        List<UserUpload> UserUpload = userUploadService.list(UserUploadQuery);
+        int beDownloadedAmount = 0; // 上传资源被下载量
+        float[] seedPercentageList = new float[4]; // 上传资源类型百分比,0-1区间的小数
+        int resourcePackAmount = 0;
+        int modAmount = 0;
+        int modPackAmount = 0;
+        int mapAmount = 0;
+        for (UserUpload userUpload : UserUpload) {
+            Resource resource = resourceService.getById(userUpload.getResourceId());
+            beDownloadedAmount += resource.getDownloads();
+            switch (resource.getClassify()) {
+                case "resourcePack":
+                    resourcePackAmount++;
+                    break;
+                case "mod":
+                    modAmount++;
+                    break;
+                case "modPack":
+                    modPackAmount++;
+                    break;
+                case "map":
+                    mapAmount++;
+                    break;
+            }
+        }
+        int totalAmount = resourcePackAmount + modAmount + modPackAmount + mapAmount;
+        seedPercentageList[0] = (float) resourcePackAmount / totalAmount;
+        seedPercentageList[1] = (float) modAmount / totalAmount;
+        seedPercentageList[2] = (float) modPackAmount / totalAmount;
+        seedPercentageList[3] = (float) mapAmount / totalAmount;
+
+        GetUserDataDTO getUserDataDTO = new GetUserDataDTO(subscriberCount, uploadAmount, beDownloadedAmount, seedPercentageList);
+        return ResponseEntity.ok(getUserDataDTO);
+    }
+
+    /**
+     * 获取关注列表
+     *
+     * @param userId 用户id
+     * @return 获取关注列表结果
+     */
+    @GetMapping("/subscriber")
+    public ResponseEntity<GetUserDTO> getUserSubscriber(@RequestParam int userId) {
+        QueryWrapper<Subscription> subscriptionQuery = new QueryWrapper<>();
+        subscriptionQuery.eq("follower_id", userId);
+        List<Subscription> subscriptionList = subscriptionService.list(subscriptionQuery);
+
+        List<User> subscriberList = new ArrayList<>();
+        for (Subscription subscription : subscriptionList) {
+            User user = userService.getById(subscription.getUserId());
+            subscriberList.add(user);
+        }
+
+        GetUserDTO getUserDTO = new GetUserDTO(subscriberList);
+        return ResponseEntity.ok(getUserDTO);
+    }
+
+    /**
+     * 获取粉丝列表
+     *
+     * @param userId 用户id
+     * @return 获取粉丝列表结果
+     */
+    @GetMapping("/follower")
+    public ResponseEntity<GetUserDTO> getUserFollower(@RequestParam int userId) {
+        QueryWrapper<Subscription> subscriptionQuery = new QueryWrapper<>();
+        subscriptionQuery.eq("user_id", userId);
+        List<Subscription> subscriptionList = subscriptionService.list(subscriptionQuery);
+
+        List<User> subscriberList = new ArrayList<>();
+        for (Subscription subscription : subscriptionList) {
+            User user = userService.getById(subscription.getUserId());
+            subscriberList.add(user);
+        }
+
+        GetUserDTO getUserDTO = new GetUserDTO(subscriberList);
+        return ResponseEntity.ok(getUserDTO);
+    }
 }
\ No newline at end of file
diff --git a/src/test/java/com/g9/g9backend/controller/UserControllerTest.java b/src/test/java/com/g9/g9backend/controller/UserControllerTest.java
index 3f06b32..bec8b11 100644
--- a/src/test/java/com/g9/g9backend/controller/UserControllerTest.java
+++ b/src/test/java/com/g9/g9backend/controller/UserControllerTest.java
@@ -1,5 +1,7 @@
 package com.g9.g9backend.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.g9.g9backend.pojo.*;
 import com.g9.g9backend.pojo.DTO.*;
@@ -13,6 +15,10 @@
 import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.when;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
@@ -37,6 +43,21 @@
     @Mock
     private SearchHistoryService searchHistoryService;
 
+    @Mock
+    private RewardService rewardService;
+
+    @Mock
+    private UserCollectionService userCollectionService;
+
+    @Mock
+    private UserUploadService userUploadService;
+
+    @Mock
+    private UserPurchaseService userPurchaseService;
+
+    @Mock
+    private ResourceService resourceService;
+
     private final ObjectMapper objectMapper = new ObjectMapper();
 
     @BeforeEach
@@ -218,4 +239,170 @@
                         .param("followerId", "2"))
                 .andExpect(status().isNoContent());
     }
+
+    // 获取用户ID
+    @Test
+    public void testGetUserId() throws Exception {
+
+        when(userService.getOne(any())).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+        mockMvc.perform(get("/user/getId")
+                        .param("username", "hcy")
+                        .param("password", "123"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取邀请码
+    @Test
+    public void testGetInvitationCode() throws Exception {
+
+        List<Invitation> invitationList = new ArrayList<>();
+        invitationList.add(new Invitation("1RCA7Y8J", 0, 0));
+        invitationList.add(new Invitation("2RCA7Y8J", 0, 0));
+        invitationList.add(new Invitation("3RCA7Y8J", 0, 0));
+        invitationList.add(new Invitation("4RCA7Y8J", 0, 0));
+        invitationList.add(new Invitation("5RCA7Y8J", 0, 0));
+
+        QueryWrapper<Invitation> invitationQuery = new QueryWrapper<>();
+        invitationQuery.eq("user_id", 1).eq("invitee_id", 0);
+        invitationQuery.select("invitation_code");
+
+        when(invitationService.list(invitationQuery)).thenReturn(invitationList); //这里用any()无法识别,因为list有多种参数可能
+
+        mockMvc.perform(get("/user/invitation-code")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取用户信息
+    @Test
+    public void testGetUserInfo() throws Exception {
+
+        when(userService.getById(anyInt())).thenReturn(new User(1, "user", "pass", null, 0, 0, null, 0, 0, 0));
+
+        mockMvc.perform(get("/user/info")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取悬赏
+    @Test
+    public void testGetUserReward() throws Exception {
+
+        when(rewardService.page(any(), any())).thenReturn(new Page<>(1, 2));
+
+        mockMvc.perform(get("/user/reward")
+                        .param("userId", "1")
+                        .param("pageNumber", "2")
+                        .param("rows", "2"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取收藏
+    @Test
+    public void testGetUserCollection() throws Exception {
+
+        when(userCollectionService.page(any(), any())).thenReturn(new Page<>(1, 2));
+        when(resourceService.getById(anyInt())).thenReturn(new Resource(1, "a", null, null, null, new Date(), new Date(), 100, 0, 0, 0, 0, 0, "mod"));
+
+        mockMvc.perform(get("/user/collection")
+                        .param("userId", "1")
+                        .param("pageNumber", "1")
+                        .param("rows", "2"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取上传
+    @Test
+    public void testGetUserUpload() throws Exception {
+
+        when(userUploadService.page(any(), any())).thenReturn(new Page<>(1, 2));
+        when(resourceService.getById(anyInt())).thenReturn(new Resource(1, "a", null, null, null, new Date(), new Date(), 100, 0, 0, 0, 0, 0, "mod"));
+
+        mockMvc.perform(get("/user/upload")
+                        .param("userId", "1")
+                        .param("pageNumber", "1")
+                        .param("rows", "2"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取购买
+    @Test
+    public void testGetUserPurchase() throws Exception {
+
+        when(userPurchaseService.page(any(), any())).thenReturn(new Page<>(1, 2));
+        when(resourceService.getById(anyInt())).thenReturn(new Resource(1, "a", null, null, null, new Date(), new Date(), 100, 0, 0, 0, 0, 0, "mod"));
+
+        mockMvc.perform(get("/user/purchase")
+                        .param("userId", "1")
+                        .param("pageNumber", "1")
+                        .param("rows", "2"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取搜索历史
+    @Test
+    public void testGetUserSearchHistory() throws Exception {
+
+        List<SearchHistory> searchHistoryList = new ArrayList<>();
+
+        QueryWrapper<SearchHistory> searchHistoryQuery = new QueryWrapper<>();
+        searchHistoryQuery.eq("user_id", 1).orderByDesc("search_history_id").last("LIMIT 10");
+
+        when(searchHistoryService.list(searchHistoryQuery)).thenReturn(searchHistoryList);
+
+        mockMvc.perform(get("/user/search")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取用户数据
+    @Test
+    public void testGetUserData() throws Exception {
+
+        when(userService.getById(1)).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+        List<UserUpload> UserUpload = new ArrayList<>();
+        QueryWrapper<UserUpload> userUploadQuery = new QueryWrapper<>();
+        userUploadQuery.eq("user_id", 1);
+        when(userUploadService.list(userUploadQuery)).thenReturn(UserUpload);
+
+        when(resourceService.getById(anyInt())).thenReturn(new Resource());
+
+        mockMvc.perform(get("/user/data")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取关注列表
+    @Test
+    public void testGetUserSubscriber() throws Exception {
+
+        QueryWrapper<Subscription> subscriptionQuery = new QueryWrapper<>();
+        subscriptionQuery.eq("follower_id", 1);
+        List<Subscription> subscriptionList = new ArrayList<>();
+
+        when(subscriptionService.list(subscriptionQuery)).thenReturn(subscriptionList);
+        when(userService.getById(1)).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+        mockMvc.perform(get("/user/subscriber")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取粉丝列表
+    @Test
+    public void testGetUserFollower() throws Exception {
+
+        QueryWrapper<Subscription> subscriptionQuery = new QueryWrapper<>();
+        subscriptionQuery.eq("user_id", 1);
+        List<Subscription> subscriptionList = new ArrayList<>();
+
+        when(subscriptionService.list(subscriptionQuery)).thenReturn(subscriptionList);
+        when(userService.getById(1)).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+        mockMvc.perform(get("/user/follower")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
 }
\ No newline at end of file