From b45d71ba6d7474dc21dfa54df37876429bf2ec46 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期三, 10 四月 2024 22:56:14 +0800
Subject: [PATCH] Merge pull request #1389 from ancienter/develop-add-api-key

---
 src/main/java/com/genersoft/iot/vmp/vmanager/user/UserApiKeyController.java |  251 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 251 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserApiKeyController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserApiKeyController.java
new file mode 100644
index 0000000..0de8496
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserApiKeyController.java
@@ -0,0 +1,251 @@
+package com.genersoft.iot.vmp.vmanager.user;
+
+import com.genersoft.iot.vmp.conf.exception.ControllerException;
+import com.genersoft.iot.vmp.conf.security.JwtUtils;
+import com.genersoft.iot.vmp.conf.security.SecurityUtils;
+import com.genersoft.iot.vmp.service.IUserApiKeyService;
+import com.genersoft.iot.vmp.service.IUserService;
+import com.genersoft.iot.vmp.storager.dao.dto.User;
+import com.genersoft.iot.vmp.storager.dao.dto.UserApiKey;
+import com.genersoft.iot.vmp.utils.DateUtil;
+import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
+import com.github.pagehelper.PageInfo;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Tag(name = "鐢ㄦ埛ApiKey绠$悊")
+@RestController
+@RequestMapping("/api/userApiKey")
+public class UserApiKeyController {
+
+    public static final int EXPIRATION_TIME = Integer.MAX_VALUE;
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private IUserApiKeyService userApiKeyService;
+
+    /**
+     * 娣诲姞鐢ㄦ埛ApiKey
+     *
+     * @param userId
+     * @param app
+     * @param remark
+     * @param expiresAt
+     * @param enable
+     */
+    @PostMapping("/add")
+    @Operation(summary = "娣诲姞鐢ㄦ埛ApiKey", security = @SecurityRequirement(name = JwtUtils.HEADER))
+    @Parameter(name = "userId", description = "鐢ㄦ埛Id", required = true)
+    @Parameter(name = "app", description = "搴旂敤鍚嶇О", required = false)
+    @Parameter(name = "remark", description = "澶囨敞淇℃伅", required = false)
+    @Parameter(name = "expiredAt", description = "杩囨湡鏃堕棿锛堜笉浼犱唬琛ㄦ案涓嶈繃鏈燂級", required = false)
+    @Transactional
+    public synchronized void add(
+            @RequestParam(required = true) int userId,
+            @RequestParam(required = false) String app,
+            @RequestParam(required = false) String remark,
+            @RequestParam(required = false) String expiresAt,
+            @RequestParam(required = false) Boolean enable
+    ) {
+        User user = userService.getUserById(userId);
+        if (user == null) {
+            throw new ControllerException(ErrorCode.ERROR400.getCode(), "鐢ㄦ埛涓嶅瓨鍦�");
+        }
+
+        Long expirationTime = null;
+        if (expiresAt != null) {
+            long timestamp = DateUtil.yyyy_MM_dd_HH_mm_ssToTimestampMs(expiresAt);
+            expirationTime = (timestamp - System.currentTimeMillis()) / (60 * 1000);
+            if (expirationTime < 0) {
+                throw new ControllerException(ErrorCode.ERROR400.getCode(), "杩囨湡鏃堕棿涓嶈兘鏃╀簬褰撳墠鏃堕棿");
+            }
+        }
+
+        UserApiKey userApiKey = new UserApiKey();
+        userApiKey.setUserId(userId);
+        userApiKey.setApp(app);
+        userApiKey.setApiKey(null);
+        userApiKey.setRemark(remark);
+        userApiKey.setExpiredAt(expirationTime != null ? expirationTime : 0);
+        userApiKey.setEnable(enable != null ? enable : false);
+        userApiKey.setCreateTime(DateUtil.getNow());
+        userApiKey.setUpdateTime(DateUtil.getNow());
+
+        int addResult = userApiKeyService.addApiKey(userApiKey);
+
+        if (addResult <= 0) {
+            throw new ControllerException(ErrorCode.ERROR100);
+        }
+
+        String apiKey;
+        do {
+            Map<String, Object> extra = new HashMap<>(1);
+            extra.put("apiKeyId", userApiKey.getId());
+            apiKey = JwtUtils.createToken(user.getUsername(), expirationTime, extra);
+        } while (userApiKeyService.isApiKeyExists(apiKey));
+
+        int resetResult = userApiKeyService.reset(userApiKey.getId(), apiKey);
+
+        if (resetResult <= 0) {
+            throw new ControllerException(ErrorCode.ERROR100);
+        }
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨApiKey
+     *
+     * @param page  褰撳墠椤�
+     * @param count 姣忛〉鏌ヨ鏁伴噺
+     * @return 鍒嗛〉ApiKey鍒楄〃
+     */
+    @GetMapping("/userApiKeys")
+    @Operation(summary = "鍒嗛〉鏌ヨ鐢ㄦ埛", security = @SecurityRequirement(name = JwtUtils.HEADER))
+    @Parameter(name = "page", description = "褰撳墠椤�", required = true)
+    @Parameter(name = "count", description = "姣忛〉鏌ヨ鏁伴噺", required = true)
+    @Transactional
+    public PageInfo<UserApiKey> userApiKeys(@RequestParam(required = true) int page, @RequestParam(required = true) int count) {
+        return userApiKeyService.getUserApiKeys(page, count);
+    }
+
+    @PostMapping("/enable")
+    @Operation(summary = "鍚敤鐢ㄦ埛ApiKey", security = @SecurityRequirement(name = JwtUtils.HEADER))
+    @Parameter(name = "id", description = "鐢ㄦ埛ApiKeyId", required = true)
+    @Transactional
+    public void enable(@RequestParam(required = true) Integer id) {
+        // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛id
+        int currenRoleId = SecurityUtils.getUserInfo().getRole().getId();
+        if (currenRoleId != 1) {
+            // 鍙敤瑙掕壊id涓�1鎵嶅彲浠ョ鐞哢serApiKey
+            throw new ControllerException(ErrorCode.ERROR403);
+        }
+        UserApiKey userApiKey = userApiKeyService.getUserApiKeyById(id);
+        if (userApiKey == null) {
+            throw new ControllerException(ErrorCode.ERROR400.getCode(), "ApiKey涓嶅瓨鍦�");
+        }
+
+        int enableResult = userApiKeyService.enable(id);
+
+        if (enableResult <= 0) {
+            throw new ControllerException(ErrorCode.ERROR100);
+        }
+    }
+
+    @PostMapping("/disable")
+    @Operation(summary = "鍋滅敤鐢ㄦ埛ApiKey", security = @SecurityRequirement(name = JwtUtils.HEADER))
+    @Parameter(name = "id", description = "鐢ㄦ埛ApiKeyId", required = true)
+    @Transactional
+    public void disable(@RequestParam(required = true) Integer id) {
+        // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛id
+        int currenRoleId = SecurityUtils.getUserInfo().getRole().getId();
+        if (currenRoleId != 1) {
+            // 鍙敤瑙掕壊id涓�1鎵嶅彲浠ョ鐞哢serApiKey
+            throw new ControllerException(ErrorCode.ERROR403);
+        }
+        UserApiKey userApiKey = userApiKeyService.getUserApiKeyById(id);
+        if (userApiKey == null) {
+            throw new ControllerException(ErrorCode.ERROR400.getCode(), "ApiKey涓嶅瓨鍦�");
+        }
+
+        int disableResult = userApiKeyService.disable(id);
+
+        if (disableResult <= 0) {
+            throw new ControllerException(ErrorCode.ERROR100);
+        }
+    }
+
+    @PostMapping("/reset")
+    @Operation(summary = "閲嶇疆鐢ㄦ埛ApiKey", security = @SecurityRequirement(name = JwtUtils.HEADER))
+    @Parameter(name = "id", description = "鐢ㄦ埛ApiKeyId", required = true)
+    @Transactional
+    public void reset(@RequestParam(required = true) Integer id) {
+        // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛id
+        int currenRoleId = SecurityUtils.getUserInfo().getRole().getId();
+        if (currenRoleId != 1) {
+            // 鍙敤瑙掕壊id涓�1鎵嶅彲浠ョ鐞哢serApiKey
+            throw new ControllerException(ErrorCode.ERROR403);
+        }
+        UserApiKey userApiKey = userApiKeyService.getUserApiKeyById(id);
+        if (userApiKey == null) {
+            throw new ControllerException(ErrorCode.ERROR400.getCode(), "ApiKey涓嶅瓨鍦�");
+        }
+        User user = userService.getUserById(userApiKey.getUserId());
+        if (user == null) {
+            throw new ControllerException(ErrorCode.ERROR400.getCode(), "鐢ㄦ埛涓嶅瓨鍦�");
+        }
+        Long expirationTime = null;
+        if (userApiKey.getExpiredAt() > 0) {
+            long timestamp = userApiKey.getExpiredAt();
+            expirationTime = (timestamp - System.currentTimeMillis()) / (60 * 1000);
+            if (expirationTime < 0) {
+                throw new ControllerException(ErrorCode.ERROR400.getCode(), "ApiKey宸插け鏁�");
+            }
+        }
+        String apiKey;
+        do {
+            Map<String, Object> extra = new HashMap<>(1);
+            extra.put("apiKeyId", userApiKey.getId());
+            apiKey = JwtUtils.createToken(user.getUsername(), expirationTime, extra);
+        } while (userApiKeyService.isApiKeyExists(apiKey));
+
+        int resetResult = userApiKeyService.reset(id, apiKey);
+
+        if (resetResult <= 0) {
+            throw new ControllerException(ErrorCode.ERROR100);
+        }
+    }
+
+    @PostMapping("/remark")
+    @Operation(summary = "澶囨敞鐢ㄦ埛ApiKey", security = @SecurityRequirement(name = JwtUtils.HEADER))
+    @Parameter(name = "id", description = "鐢ㄦ埛ApiKeyId", required = true)
+    @Parameter(name = "remark", description = "鐢ㄦ埛ApiKey澶囨敞", required = false)
+    @Transactional
+    public void remark(@RequestParam(required = true) Integer id, @RequestParam(required = false) String remark) {
+        // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛id
+        int currenRoleId = SecurityUtils.getUserInfo().getRole().getId();
+        if (currenRoleId != 1) {
+            // 鍙敤瑙掕壊id涓�1鎵嶅彲浠ョ鐞哢serApiKey
+            throw new ControllerException(ErrorCode.ERROR403);
+        }
+        UserApiKey userApiKey = userApiKeyService.getUserApiKeyById(id);
+        if (userApiKey == null) {
+            throw new ControllerException(ErrorCode.ERROR400.getCode(), "ApiKey涓嶅瓨鍦�");
+        }
+        int remarkResult = userApiKeyService.remark(id, remark);
+
+        if (remarkResult <= 0) {
+            throw new ControllerException(ErrorCode.ERROR100);
+        }
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "鍒犻櫎鐢ㄦ埛ApiKey", security = @SecurityRequirement(name = JwtUtils.HEADER))
+    @Parameter(name = "id", description = "鐢ㄦ埛ApiKeyId", required = true)
+    @Transactional
+    public void delete(@RequestParam(required = true) Integer id) {
+        // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛id
+        int currenRoleId = SecurityUtils.getUserInfo().getRole().getId();
+        if (currenRoleId != 1) {
+            // 鍙敤瑙掕壊id涓�1鎵嶅彲浠ョ鐞哢serApiKey
+            throw new ControllerException(ErrorCode.ERROR403);
+        }
+        UserApiKey userApiKey = userApiKeyService.getUserApiKeyById(id);
+        if (userApiKey == null) {
+            throw new ControllerException(ErrorCode.ERROR400.getCode(), "ApiKey涓嶅瓨鍦�");
+        }
+
+        int deleteResult = userApiKeyService.delete(id);
+
+        if (deleteResult <= 0) {
+            throw new ControllerException(ErrorCode.ERROR100);
+        }
+    }
+}

--
Gitblit v1.8.0