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 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 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才可以管理UserApiKey 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才可以管理UserApiKey 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才可以管理UserApiKey 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 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才可以管理UserApiKey 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才可以管理UserApiKey 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); } } }