snp-connection-monitoring/frontend/src/services/apiKeyService.ts
HYOJIN 6f9923537e feat(phase3): API Key 관리 - 생성/발급/신청/승인/권한
백엔드:
- AES-256-GCM 암호화 (ApiKey 생성/복호화 조회)
- API Key 직접 생성 (ADMIN) + 신청→승인/반려 워크플로우
- 신청 필드 추가 (사용기간, 서비스IP, 서비스용도, 예상요청량)
- Permission CRUD (bulk delete+recreate, @Modifying JPQL)
- API Key 폐기, expires_at 자동 설정
- ErrorCode 5개 추가

프론트엔드:
- MyKeysPage: 키 목록, 상태 배지, 폐기, raw key 모달
- KeyRequestPage: 기간 프리셋/직접선택 토글, 서비스IP, 용도, 예상요청량, API 체크박스
- KeyAdminPage: 신청 검토(필드 노출+기간 조정) + 키 관리(복호화 조회, 권한 편집)

Closes #8

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 10:12:36 +09:00

33 lines
1.3 KiB
TypeScript

import { get, post, put } from './apiClient';
import type {
ApiKey,
ApiKeyDetail,
ApiKeyCreateResponse,
CreateApiKeyRequest,
ApiKeyRequest,
ApiKeyRequestCreateDto,
ApiKeyRequestReviewDto,
Permission,
UpdatePermissionsRequest,
} from '../types/apikey';
// My Keys
export const getMyKeys = () => get<ApiKey[]>('/keys');
export const getAllKeys = () => get<ApiKey[]>('/keys/all');
export const getKeyDetail = (id: number) => get<ApiKeyDetail>(`/keys/${id}`);
export const createKey = (req: CreateApiKeyRequest) => post<ApiKeyCreateResponse>('/keys', req);
export const revokeKey = (id: number) => put<void>(`/keys/${id}/revoke`);
// Requests
export const createKeyRequest = (req: ApiKeyRequestCreateDto) =>
post<ApiKeyRequest>('/keys/requests', req);
export const getMyRequests = () => get<ApiKeyRequest[]>('/keys/requests/my');
export const getAllRequests = () => get<ApiKeyRequest[]>('/keys/requests');
export const reviewRequest = (id: number, req: ApiKeyRequestReviewDto) =>
put<ApiKeyCreateResponse | null>(`/keys/requests/${id}/review`, req);
// Permissions
export const getPermissions = (keyId: number) => get<Permission[]>(`/keys/${keyId}/permissions`);
export const updatePermissions = (keyId: number, req: UpdatePermissionsRequest) =>
put<Permission[]>(`/keys/${keyId}/permissions`, req);