snp-connection-monitoring/docs/schema/create_tables.sql
HYOJIN 34f0015cff feat(ui): 서비스 API 분류 + API Key 관리 UI 전면 개선
서비스 API:
- snp_service_api에 apiDomain/apiSection 컬럼 추가
- API 신청 시 서비스 > 도메인 계층형 아코디언+테이블 선택
- 검토 모달 API 권한 편집 가능 (체크박스 토글, API 추가 모달)

API Key 관리:
- KPI 카드 4개 (대기/활성/만료임박/폐기)
- 필터 칩 (상태별) + 검색 + 15건 페이징
- 신청 관리: 사용자 아이콘, 필드 라벨 한글화, 목적 제거
- 키 관리: 소유자(userName) 필드 추가, 필드 순서 변경, maskedKey/생성일 제거
- 검토 모달: 탭(신청정보/API권한), EditableDateCard, 승인확인 변경테이블
- 상세 모달: 검토 모달 readOnly 재사용, 상태별 아이콘 헤더
- 키 상세: 상태별 색상, InfoRow, API Key 보기/숨기기+복사

Closes #31

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

198 lines
8.8 KiB
SQL

-- =============================================================
-- SNP Connection Monitoring - 테이블 생성 스크립트
-- 스키마: common
-- =============================================================
CREATE SCHEMA IF NOT EXISTS common;
SET search_path TO common;
-- -----------------------------------------------------------
-- 1. snp_tenant (테넌트)
-- -----------------------------------------------------------
CREATE TABLE IF NOT EXISTS snp_tenant (
tenant_id BIGSERIAL PRIMARY KEY,
tenant_code VARCHAR(50) NOT NULL UNIQUE,
tenant_name VARCHAR(200) NOT NULL,
description TEXT,
is_active BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_snp_tenant_code ON snp_tenant (tenant_code);
CREATE INDEX idx_snp_tenant_active ON snp_tenant (is_active);
-- -----------------------------------------------------------
-- 2. snp_user (사용자)
-- -----------------------------------------------------------
CREATE TABLE IF NOT EXISTS snp_user (
user_id BIGSERIAL PRIMARY KEY,
tenant_id BIGINT REFERENCES snp_tenant(tenant_id),
login_id VARCHAR(100) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
user_name VARCHAR(100) NOT NULL,
email VARCHAR(200),
role VARCHAR(20) NOT NULL DEFAULT 'USER',
is_active BOOLEAN NOT NULL DEFAULT TRUE,
last_login_at TIMESTAMP,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_snp_user_login_id ON snp_user (login_id);
CREATE INDEX idx_snp_user_tenant ON snp_user (tenant_id);
CREATE INDEX idx_snp_user_role ON snp_user (role);
-- -----------------------------------------------------------
-- 3. snp_service (서비스)
-- -----------------------------------------------------------
CREATE TABLE IF NOT EXISTS snp_service (
service_id BIGSERIAL PRIMARY KEY,
service_code VARCHAR(50) NOT NULL UNIQUE,
service_name VARCHAR(200) NOT NULL,
service_url VARCHAR(500),
description TEXT,
health_check_url VARCHAR(500),
health_check_interval INTEGER NOT NULL DEFAULT 30,
health_status VARCHAR(10) NOT NULL DEFAULT 'UNKNOWN',
health_checked_at TIMESTAMP,
health_response_time INTEGER,
is_active BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_snp_service_code ON snp_service (service_code);
CREATE INDEX idx_snp_service_status ON snp_service (health_status);
CREATE INDEX idx_snp_service_active ON snp_service (is_active);
-- -----------------------------------------------------------
-- 4. snp_service_health_log (서비스 헬스 로그)
-- -----------------------------------------------------------
CREATE TABLE IF NOT EXISTS snp_service_health_log (
log_id BIGSERIAL PRIMARY KEY,
service_id BIGINT NOT NULL REFERENCES snp_service(service_id),
previous_status VARCHAR(10),
current_status VARCHAR(10) NOT NULL,
response_time INTEGER,
error_message TEXT,
checked_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_snp_health_log_service ON snp_service_health_log (service_id);
CREATE INDEX idx_snp_health_log_checked ON snp_service_health_log (checked_at);
-- -----------------------------------------------------------
-- 5. snp_service_api (서비스 API)
-- -----------------------------------------------------------
CREATE TABLE IF NOT EXISTS snp_service_api (
api_id BIGSERIAL PRIMARY KEY,
service_id BIGINT NOT NULL REFERENCES snp_service(service_id),
api_path VARCHAR(500) NOT NULL,
api_method VARCHAR(10) NOT NULL,
api_name VARCHAR(200) NOT NULL,
api_domain VARCHAR(100),
api_section VARCHAR(100),
description TEXT,
is_active BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
CONSTRAINT uq_service_api UNIQUE (service_id, api_path, api_method)
);
CREATE INDEX idx_snp_service_api_service ON snp_service_api (service_id);
-- -----------------------------------------------------------
-- 6. snp_api_key (API 키)
-- -----------------------------------------------------------
CREATE TABLE IF NOT EXISTS snp_api_key (
api_key_id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES snp_user(user_id),
api_key VARCHAR(128) NOT NULL UNIQUE,
api_key_prefix VARCHAR(10),
key_name VARCHAR(200) NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
approved_by BIGINT REFERENCES snp_user(user_id),
approved_at TIMESTAMP,
expires_at TIMESTAMP,
last_used_at TIMESTAMP,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_snp_api_key_user ON snp_api_key (user_id);
CREATE INDEX idx_snp_api_key_key ON snp_api_key (api_key);
CREATE INDEX idx_snp_api_key_status ON snp_api_key (status);
-- -----------------------------------------------------------
-- 7. snp_api_permission (API 권한)
-- -----------------------------------------------------------
CREATE TABLE IF NOT EXISTS snp_api_permission (
permission_id BIGSERIAL PRIMARY KEY,
api_key_id BIGINT NOT NULL REFERENCES snp_api_key(api_key_id),
api_id BIGINT NOT NULL REFERENCES snp_service_api(api_id),
is_active BOOLEAN NOT NULL DEFAULT TRUE,
granted_by BIGINT,
granted_at TIMESTAMP NOT NULL DEFAULT NOW(),
revoked_at TIMESTAMP,
CONSTRAINT uq_api_permission UNIQUE (api_key_id, api_id)
);
CREATE INDEX idx_snp_api_permission_key ON snp_api_permission (api_key_id);
CREATE INDEX idx_snp_api_permission_api ON snp_api_permission (api_id);
-- -----------------------------------------------------------
-- 8. snp_api_request_log (API 요청 로그)
-- -----------------------------------------------------------
CREATE TABLE IF NOT EXISTS snp_api_request_log (
log_id BIGSERIAL PRIMARY KEY,
request_url VARCHAR(2000),
request_params TEXT,
request_method VARCHAR(10),
request_status VARCHAR(20),
request_headers TEXT,
request_ip VARCHAR(45),
service_id BIGINT REFERENCES snp_service(service_id),
user_id BIGINT REFERENCES snp_user(user_id),
api_key_id BIGINT REFERENCES snp_api_key(api_key_id),
response_size BIGINT,
response_time INTEGER,
response_status INTEGER,
error_message TEXT,
requested_at TIMESTAMP NOT NULL DEFAULT NOW(),
tenant_id BIGINT REFERENCES snp_tenant(tenant_id)
);
CREATE INDEX idx_snp_request_log_service ON snp_api_request_log (service_id);
CREATE INDEX idx_snp_request_log_user ON snp_api_request_log (user_id);
CREATE INDEX idx_snp_request_log_requested ON snp_api_request_log (requested_at);
CREATE INDEX idx_snp_request_log_tenant ON snp_api_request_log (tenant_id);
-- 대시보드 통계 쿼리 최적화 인덱스
CREATE INDEX idx_snp_request_log_daily_stats ON snp_api_request_log (requested_at, request_status);
CREATE INDEX idx_snp_request_log_daily_user ON snp_api_request_log (requested_at, user_id);
CREATE INDEX idx_snp_request_log_svc_stats ON snp_api_request_log (requested_at, service_id, request_status);
CREATE INDEX idx_snp_request_log_top_api ON snp_api_request_log (requested_at, request_url, request_method);
-- Gateway API Key 인증 인덱스
CREATE INDEX idx_snp_api_key_prefix ON snp_api_key (api_key_prefix);
-- -----------------------------------------------------------
-- 9. snp_api_key_request (API 키 발급 요청)
-- -----------------------------------------------------------
CREATE TABLE IF NOT EXISTS snp_api_key_request (
request_id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES snp_user(user_id),
key_name VARCHAR(200) NOT NULL,
purpose TEXT,
requested_apis TEXT,
status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
reviewed_by BIGINT REFERENCES snp_user(user_id),
reviewed_at TIMESTAMP,
review_comment TEXT,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_snp_key_request_user ON snp_api_key_request (user_id);
CREATE INDEX idx_snp_key_request_status ON snp_api_key_request (status);