# WebApiKeyController.java

    package com.yumu.noveltranslator.adapter.in.rest.web;

    import com.yumu.noveltranslator.domain.model.ApiKey;
    import com.yumu.noveltranslator.port.dto.common.PageResponse;
    import com.yumu.noveltranslator.port.dto.common.Result;
    import com.yumu.noveltranslator.port.dto.entity.ApiKeyResponse;
    import com.yumu.noveltranslator.port.dto.entity.CreateApiKeyRequest;
    import com.yumu.noveltranslator.enums.ErrorCodeEnum;
    import com.yumu.noveltranslator.port.in.ApiKeyPort;
    import com.yumu.noveltranslator.util.SecurityUtil;
    import jakarta.validation.Valid;
    import lombok.RequiredArgsConstructor;
    import org.springframework.web.bind.annotation.*;

    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;

    /**
     * Web API Key 管理接口
     * 路径前缀: /user/api-keys
     */
    @RestController
    @RequestMapping("/user/api-keys")
    @RequiredArgsConstructor
    public class WebApiKeyController {

        private final ApiKeyPort apiKeyPort;

        /**
         * 生成 API Key
         * POST /user/api-keys
         */
        @PostMapping
        public Result<Map<String, Object>> createApiKey(@Valid @RequestBody CreateApiKeyRequest request) {
            Long userId = SecurityUtil.getRequiredUserId();
            ApiKey apiKey = apiKeyPort.createApiKey(userId, request.getName());

            return Result.ok(Map.of(
                "id", apiKey.getId(),
                "apiKey", apiKey.getApiKey(),
                "name", apiKey.getName(),
                "isActive", true,
                "createdAt", apiKey.getCreatedAt()
            ));
        }

        /**
         * 获取 API Key 列表
         * GET /user/api-keys
         */
        @GetMapping
        public Result<PageResponse<ApiKeyResponse>> getApiKeys(
                @RequestParam(required = false, defaultValue = "1") Integer page,
                @RequestParam(required = false, defaultValue = "20") Integer pageSize) {
            Long userId = SecurityUtil.getRequiredUserId();
            PageResponse<ApiKey> result = apiKeyPort.listApiKeys(userId, page, pageSize);
            List<ApiKeyResponse> responses = result.getList().stream().map(k -> {
                ApiKeyResponse r = new ApiKeyResponse();
                r.setId(k.getId());
                r.setName(k.getName());
                r.setApiKey(SecurityUtil.maskApiKey(k.getApiKey()));
                r.setActive(k.getActive());
                r.setLastUsedAt(k.getLastUsedAt());
                r.setTotalUsage(k.getTotalUsage());
                r.setCreatedAt(k.getCreatedAt());
                return r;
            }).collect(Collectors.toList());
            return Result.ok(PageResponse.of(page, pageSize, result.getTotal(), responses));
        }

        /**
         * 禁用/删除 API Key
         * DELETE /user/api-keys/{id}
         */
        @DeleteMapping("/{id}")
        public Result deleteApiKey(@PathVariable Long id) {
            Long userId = SecurityUtil.getRequiredUserId();
            boolean success = apiKeyPort.deleteApiKey(id, userId);
            if (!success) {
                return Result.error(ErrorCodeEnum.NOT_FOUND, "API Key 不存在");
            }
            return Result.ok(null);
        }

        /**
         * 重置 API Key
         * POST /user/api-keys/{id}/reset
         */
        @PostMapping("/{id}/reset")
        public Result<Map<String, Object>> resetApiKey(@PathVariable Long id) {
            Long userId = SecurityUtil.getRequiredUserId();
            ApiKey key = apiKeyPort.resetApiKey(id, userId);
            if (key == null) {
                return Result.error(ErrorCodeEnum.NOT_FOUND, "API Key 不存在");
            }
            return Result.ok(Map.of("id", key.getId(), "apiKey", key.getApiKey()));
        }

        /**
         * 查看 API Key 真实值（不掩码）
         * GET /user/api-keys/{id}/reveal
         */
        @GetMapping("/{id}/reveal")
        public Result<Map<String, Object>> revealApiKey(@PathVariable Long id) {
            Long userId = SecurityUtil.getRequiredUserId();
            ApiKey key = apiKeyPort.revealApiKey(id, userId);
            if (key == null) {
                return Result.error(ErrorCodeEnum.NOT_FOUND, "API Key 不存在");
            }
            return Result.ok(Map.of("id", key.getId(), "apiKey", key.getApiKey()));
        }
    }