{"openapi":"3.1.0","info":{"title":"Pickle API","description":"부산대학교 클라우드 플랫폼 Pickle의 REST API. 인증은 JWT Bearer, 오류 응답은 RFC 9457 problem+json(Problem 스키마)을 따릅니다.","version":"0.28.1"},"servers":[{"url":"http://pickle.pusan.ac.kr","description":"Generated server url"}],"security":[{"bearerAuth":[]}],"paths":{"/api/v1/me/password":{"put":{"tags":["account-controller"],"operationId":"changePassword","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AuthTokenResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/settings/{key}":{"put":{"tags":["admin-settings-controller"],"operationId":"updateSetting","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingUpdateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SettingView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms/{vmId}/terminal-sessions":{"post":{"tags":["terminal-controller"],"operationId":"createTerminalSession","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TerminalTicketResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms/{vmId}/start":{"post":{"tags":["vm-controller"],"operationId":"startVm","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms/{vmId}/shutdown":{"post":{"tags":["vm-controller"],"operationId":"shutdownVm","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms/{vmId}/reboot":{"post":{"tags":["vm-controller"],"operationId":"rebootVm","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms/{vmId}/publish":{"post":{"tags":["publishing-controller"],"operationId":"publishVm","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishRequest"}}}},"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PublicationView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms/{vmId}/port-forwardings":{"get":{"tags":["port-forwarding-controller"],"operationId":"listVmPortForwardings","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PortForwardingView"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["port-forwarding-controller"],"operationId":"createVmPortForwarding","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePortForwardingRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PortForwardingView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms/{vmId}/password/regenerate":{"post":{"tags":["vm-controller"],"operationId":"regenerateVmPassword","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"X-Reauth-Token","in":"header","description":"재인증(sudo-mode) 토큰 — POST /auth/reverify가 발급 (10분 유효, 다회용). 없거나 만료·무효면 403 REAUTH_REQUIRED.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VmPasswordResponse"}}}},"403":{"description":"재인증 필요 — 유효한 X-Reauth-Token 없음 (`REAUTH_REQUIRED`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms/{vmId}/force-stop":{"post":{"tags":["vm-controller"],"operationId":"forceStopVm","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms/{vmId}/campus-ip-requests":{"get":{"tags":["campus-ip-request-controller"],"operationId":"listVmCampusIpRequests","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CampusIpRequestView"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["campus-ip-request-controller"],"operationId":"requestVmCampusIp","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampusIpRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CampusIpRequestView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vm-requests":{"get":{"tags":["vm-request-controller"],"operationId":"listVmRequests","parameters":[{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/VmRequestStatus"}},{"name":"groupId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseVmRequestDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["vm-request-controller"],"operationId":"createVmRequest","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVmRequestRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VmRequestDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vm-requests/{requestId}/cancel":{"post":{"tags":["vm-request-controller"],"operationId":"cancelVmRequest","parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VmRequestDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/notifications/{notificationId}/read":{"post":{"tags":["notification-controller"],"operationId":"markNotificationRead","parameters":[{"name":"notificationId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/NotificationView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/notifications/read-all":{"post":{"tags":["notification-controller"],"operationId":"markAllNotificationsRead","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ReadAllResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/me/withdraw":{"post":{"tags":["account-controller"],"operationId":"withdraw","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/me/ssh-keys":{"get":{"tags":["me-ssh-key-controller"],"operationId":"listKeys","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SshKeyView"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["me-ssh-key-controller"],"operationId":"registerKey","parameters":[{"name":"X-Reauth-Token","in":"header","description":"재인증(sudo-mode) 토큰 — POST /auth/reverify가 발급 (10분 유효, 다회용). 없거나 만료·무효면 403 REAUTH_REQUIRED.","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SshKeyCreateRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SshKeyView"}}}},"403":{"description":"재인증 필요 — 유효한 X-Reauth-Token 없음 (`REAUTH_REQUIRED`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/me/ssh-keys/generate":{"post":{"tags":["me-ssh-key-controller"],"operationId":"generateKey","parameters":[{"name":"X-Reauth-Token","in":"header","description":"재인증(sudo-mode) 토큰 — POST /auth/reverify가 발급 (10분 유효, 다회용). 없거나 만료·무효면 403 REAUTH_REQUIRED.","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SshKeyGenerateRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SshKeyView"}}}},"403":{"description":"재인증 필요 — 유효한 X-Reauth-Token 없음 (`REAUTH_REQUIRED`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/me/mfa/totp":{"post":{"tags":["mfa-controller"],"operationId":"begin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeginMfaRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MfaSetupResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/me/mfa/totp/activate":{"post":{"tags":["mfa-controller"],"operationId":"activate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivateMfaRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MfaRecoveryCodesResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/me/mfa/recovery-codes":{"post":{"tags":["mfa-controller"],"operationId":"regenerateRecoveryCodes","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegenerateRecoveryCodesRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MfaRecoveryCodesResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/me/mfa/disable":{"post":{"tags":["mfa-controller"],"operationId":"disable","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisableMfaRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/me/consents":{"get":{"tags":["consent-controller"],"operationId":"listMyConsents","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConsentView"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["consent-controller"],"operationId":"acceptConsents","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentUpdateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConsentView"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/groups":{"get":{"tags":["group-controller"],"operationId":"listGroups","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GroupSummaryResponse"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["group-controller"],"operationId":"createGroup","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGroupRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GroupDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/groups/{groupId}/members":{"post":{"tags":["group-controller"],"operationId":"addGroupMember","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"X-Reauth-Token","in":"header","description":"재인증(sudo-mode) 토큰 — POST /auth/reverify가 발급 (10분 유효, 다회용). 없거나 만료·무효면 403 REAUTH_REQUIRED.","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddGroupMemberRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GroupMemberResponse"}}}},"403":{"description":"재인증 필요 — 유효한 X-Reauth-Token 없음 (`REAUTH_REQUIRED`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/domains/{domainId}/verify":{"post":{"tags":["publishing-controller"],"operationId":"verifyDomain","parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/DomainDetailView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/auth/verify-email":{"post":{"tags":["auth-controller"],"operationId":"verifyEmail","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[]}},"/api/v1/auth/signup":{"post":{"tags":["auth-controller"],"operationId":"signup","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupRequest"}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[]}},"/api/v1/auth/reverify":{"post":{"tags":["auth-controller"],"operationId":"reverify","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReverifyRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ReverifyResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/auth/resend-verification":{"post":{"tags":["auth-controller"],"operationId":"resendVerification","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendVerificationRequest"}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[]}},"/api/v1/auth/refresh":{"post":{"tags":["auth-controller"],"operationId":"refresh","parameters":[{"name":"__Host-pickle_refresh","in":"cookie","required":false,"schema":{"type":"string"}},{"name":"X-Pickle-Csrf","in":"header","description":"CSRF 이중 제출 토큰 — __Host-pickle_csrf 쿠키 값과 일치해야 합니다 (필터 강제)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AuthTokenResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[]}},"/api/v1/auth/password-reset":{"post":{"tags":["auth-controller"],"operationId":"requestPasswordReset","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequest"}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[]}},"/api/v1/auth/password-reset/confirm":{"post":{"tags":["auth-controller"],"operationId":"confirmPasswordReset","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirmRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[]}},"/api/v1/auth/mfa":{"post":{"tags":["auth-controller"],"operationId":"completeMfa","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MfaLoginRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AuthTokenResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[]}},"/api/v1/auth/logout":{"post":{"tags":["auth-controller"],"operationId":"logout","parameters":[{"name":"__Host-pickle_refresh","in":"cookie","required":false,"schema":{"type":"string"}},{"name":"X-Pickle-Csrf","in":"header","description":"CSRF 이중 제출 토큰 — __Host-pickle_csrf 쿠키 값과 일치해야 합니다 (필터 강제)","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[]}},"/api/v1/auth/login":{"post":{"tags":["auth-controller"],"operationId":"login","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"로그인 성공(토큰 발급) 또는 2FA 챌린지","content":{"*/*":{"schema":{"oneOf":[{"$ref":"#/components/schemas/AuthTokenResponse"},{"$ref":"#/components/schemas/MfaChallengeResponse"}]}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[]}},"/api/v1/admin/vms/{vmId}/start":{"post":{"tags":["admin-vm-controller"],"operationId":"adminStartVm","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vms/{vmId}/shutdown":{"post":{"tags":["admin-vm-controller"],"operationId":"adminShutdownVm","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vms/{vmId}/schedule-delete":{"post":{"tags":["admin-vm-controller"],"operationId":"scheduleVmDeletion","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleVmDeletionRequest"}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VmDeletionResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vms/{vmId}/reboot":{"post":{"tags":["admin-vm-controller"],"operationId":"adminRebootVm","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vms/{vmId}/force-stop":{"post":{"tags":["admin-vm-controller"],"operationId":"adminForceStopVm","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vms/{vmId}/force-delete":{"post":{"tags":["admin-vm-controller"],"operationId":"forceDeleteVm","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForceDeleteVmRequest"}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vms/{vmId}/cancel-scheduled-delete":{"post":{"tags":["admin-vm-controller"],"operationId":"cancelScheduledVmDeletion","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vm-requests/{requestId}/reject":{"post":{"tags":["admin-vm-request-controller"],"operationId":"rejectVmRequest","parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectVmRequestRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VmRequestDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vm-requests/{requestId}/approve":{"post":{"tags":["admin-vm-request-controller"],"operationId":"approveVmRequest","parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveVmRequestRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VmRequestDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vm-flavors":{"get":{"tags":["admin-vm-flavor-controller"],"operationId":"listAdminVmFlavors","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VmFlavorResponse"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["admin-vm-flavor-controller"],"operationId":"createAdminVmFlavor","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVmFlavorRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VmFlavorResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/users/{userId}/mfa-reset":{"post":{"tags":["admin-user-controller"],"operationId":"resetUserMfa","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/users/{userId}/enable":{"post":{"tags":["admin-user-controller"],"operationId":"enableUser","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UserAdminDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/users/{userId}/disable":{"post":{"tags":["admin-user-controller"],"operationId":"disableUser","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisableUserRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UserAdminDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/terminal-sessions/{sessionId}/terminate":{"post":{"tags":["admin-terminal-controller"],"operationId":"terminateTerminalSession","parameters":[{"name":"sessionId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/tasks/{taskId}/retry":{"post":{"tags":["admin-task-controller"],"operationId":"retryAdminTask","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/routes/{routeId}/apply":{"post":{"tags":["admin-publishing-controller"],"operationId":"applyAdminRoute","parameters":[{"name":"routeId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/routes/resync":{"post":{"tags":["admin-publishing-controller"],"operationId":"resyncRoutes","responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/relays/{relayId}/token":{"post":{"tags":["admin-relay-controller"],"operationId":"issueAdminRelayToken","parameters":[{"name":"relayId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"X-Reauth-Token","in":"header","description":"재인증(sudo-mode) 토큰 — POST /auth/reverify가 발급 (10분 유효, 다회용). 없거나 만료·무효면 403 REAUTH_REQUIRED.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/RelayTokenResponse"}}}},"403":{"description":"재인증 필요 — 유효한 X-Reauth-Token 없음 (`REAUTH_REQUIRED`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/port-mappings/{mappingId}/unsuspend":{"post":{"tags":["admin-port-mapping-controller"],"operationId":"unsuspendAdminPortMapping","parameters":[{"name":"mappingId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AdminPortMappingResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/port-mappings/{mappingId}/suspend":{"post":{"tags":["admin-port-mapping-controller"],"operationId":"suspendAdminPortMapping","parameters":[{"name":"mappingId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuspendPortMappingRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AdminPortMappingResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/orgs":{"get":{"tags":["admin-controller"],"operationId":"listAdminOrgs","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrgDetailResponse"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["admin-controller"],"operationId":"createOrg","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrgRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/OrgDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/notifications/{notificationId}/resend":{"post":{"tags":["admin-notification-controller"],"operationId":"resendAdminNotification","parameters":[{"name":"notificationId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/drift-findings/{findingId}/resolve":{"post":{"tags":["admin-drift-controller"],"operationId":"resolveDriftFinding","parameters":[{"name":"findingId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveDriftFindingRequest"}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/DriftFindingResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/domains/{domainId}/verify":{"post":{"tags":["admin-publishing-controller"],"operationId":"verifyAdminDomain","parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/domains/{domainId}/force-release":{"post":{"tags":["admin-publishing-controller"],"operationId":"forceReleaseDomain","parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/campus-ip-requests/{requestId}/status":{"post":{"tags":["admin-campus-ip-request-controller"],"operationId":"updateAdminCampusIpRequestStatus","parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampusIpRequestStatusRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AdminCampusIpRequestView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/announcements":{"get":{"tags":["announcement-controller"],"operationId":"listAnnouncements","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseAnnouncementView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["announcement-controller"],"operationId":"createAnnouncement","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnouncementCreateRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AnnouncementView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms/{vmId}/settings":{"get":{"tags":["vm-controller"],"operationId":"getVmSettings","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VmSettingView"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["vm-controller"],"operationId":"updateVmSettings","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"X-Reauth-Token","in":"header","description":"재인증(sudo-mode) 토큰 — POST /auth/reverify가 발급 (10분 유효, 다회용). 없거나 만료·무효면 403 REAUTH_REQUIRED.","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VmSettingsUpdateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VmSettingView"}}}}},"403":{"description":"재인증 필요 — 유효한 X-Reauth-Token 없음 (`REAUTH_REQUIRED`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms/{vmId}/publication":{"delete":{"tags":["publishing-controller"],"operationId":"unpublishVm","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["publishing-controller"],"operationId":"updatePublication","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePublicationRequest"}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PublicationView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/groups/{groupId}":{"get":{"tags":["group-controller"],"operationId":"getGroup","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GroupDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"tags":["group-controller"],"operationId":"deleteGroup","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"204":{"description":"No Content"},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["group-controller"],"operationId":"updateGroup","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGroupRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GroupDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/groups/{groupId}/members/{userId}":{"delete":{"tags":["group-controller"],"operationId":"removeGroupMember","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"X-Reauth-Token","in":"header","description":"재인증(sudo-mode) 토큰 — POST /auth/reverify가 발급 (10분 유효, 다회용). 없거나 만료·무효면 403 REAUTH_REQUIRED.","required":false,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"403":{"description":"재인증 필요 — 유효한 X-Reauth-Token 없음 (`REAUTH_REQUIRED`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["group-controller"],"operationId":"updateGroupMember","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"X-Reauth-Token","in":"header","description":"재인증(sudo-mode) 토큰 — POST /auth/reverify가 발급 (10분 유효, 다회용). 없거나 만료·무효면 403 REAUTH_REQUIRED.","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGroupMemberRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GroupMemberResponse"}}}},"403":{"description":"재인증 필요 — 유효한 X-Reauth-Token 없음 (`REAUTH_REQUIRED`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vms/{vmId}/period":{"patch":{"tags":["admin-vm-controller"],"operationId":"updateVmPeriod","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VmPeriodUpdateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VmDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vms/{vmId}/gateway-block":{"patch":{"tags":["admin-vm-controller"],"operationId":"updateVmGatewayBlock","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VmGatewayBlockUpdateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VmDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vm-flavors/{flavorId}":{"patch":{"tags":["admin-vm-flavor-controller"],"operationId":"updateAdminVmFlavor","parameters":[{"name":"flavorId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVmFlavorRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VmFlavorResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/users/{userId}":{"get":{"tags":["admin-user-controller"],"operationId":"getUser","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UserAdminDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["admin-controller"],"operationId":"updateUser","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserAdminRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UserSummaryResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/templates/{templateId}":{"patch":{"tags":["admin-template-controller"],"operationId":"updateAdminTemplate","parameters":[{"name":"templateId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTemplateStatusRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AdminTemplateResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/port-mappings/{mappingId}/guards":{"patch":{"tags":["admin-port-mapping-controller"],"operationId":"updateAdminPortMappingGuards","parameters":[{"name":"mappingId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePortMappingGuardsRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AdminPortMappingResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/orgs/{orgId}":{"patch":{"tags":["admin-controller"],"operationId":"updateOrg","parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrgRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/OrgDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/nodes/{nodeId}":{"patch":{"tags":["admin-node-controller"],"operationId":"updateAdminNode","parameters":[{"name":"nodeId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateNodeStatusRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/NodeSummaryResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms":{"get":{"tags":["vm-controller"],"operationId":"listVms","parameters":[{"name":"groupId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseVmSummaryResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms/{vmId}":{"get":{"tags":["vm-controller"],"operationId":"getVm","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VmDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"tags":["vm-controller"],"operationId":"deleteVm","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"X-Reauth-Token","in":"header","description":"재인증(sudo-mode) 토큰 — POST /auth/reverify가 발급 (10분 유효, 다회용). 없거나 만료·무효면 403 REAUTH_REQUIRED.","required":false,"schema":{"type":"string"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VmDeletionResponse"}}}},"403":{"description":"재인증 필요 — 유효한 X-Reauth-Token 없음 (`REAUTH_REQUIRED`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms/{vmId}/password":{"get":{"tags":["vm-controller"],"operationId":"revealVmPassword","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"X-Reauth-Token","in":"header","description":"재인증(sudo-mode) 토큰 — POST /auth/reverify가 발급 (10분 유효, 다회용). 없거나 만료·무효면 403 REAUTH_REQUIRED.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VmPasswordResponse"}}}},"403":{"description":"재인증 필요 — 유효한 X-Reauth-Token 없음 (`REAUTH_REQUIRED`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms/{vmId}/events":{"get":{"tags":["vm-controller"],"operationId":"listVmEvents","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseVmEventResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vm-requests/{requestId}":{"get":{"tags":["vm-request-controller"],"operationId":"getVmRequest","parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VmRequestDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vm-flavors":{"get":{"tags":["vm-flavor-controller"],"operationId":"listVmFlavors","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VmFlavorResponse"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/templates":{"get":{"tags":["vm-template-controller"],"operationId":"listTemplates","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VmTemplateResponse"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/orgs":{"get":{"tags":["org-controller"],"operationId":"listOrgs","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrgSummaryResponse"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/notifications":{"get":{"tags":["notification-controller"],"operationId":"listNotifications","parameters":[{"name":"unreadOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseNotificationView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/notifications/unread-count":{"get":{"tags":["notification-controller"],"operationId":"getUnreadNotificationCount","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UnreadCountResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/meta/terms":{"get":{"tags":["meta-controller"],"operationId":"listTerms","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TermsVersionView"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[]}},"/api/v1/meta/terms/{docType}":{"get":{"tags":["meta-controller"],"operationId":"getTerms","parameters":[{"name":"docType","in":"path","required":true,"schema":{"$ref":"#/components/schemas/TermsDocType"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TermsDocumentView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[]}},"/api/v1/meta/status":{"get":{"tags":["meta-controller"],"operationId":"systemStatus","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SystemStatusResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[]}},"/api/v1/meta/request-options":{"get":{"tags":["meta-controller"],"operationId":"requestOptions","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/RequestOptionsResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/me":{"get":{"tags":["me-controller"],"operationId":"me","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UserProfileResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/me/ssh-keys/{keyId}/private-key":{"get":{"tags":["me-ssh-key-controller"],"operationId":"downloadPrivateKey","parameters":[{"name":"keyId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"X-Reauth-Token","in":"header","description":"재인증(sudo-mode) 토큰 — POST /auth/reverify가 발급 (10분 유효, 다회용). 없거나 만료·무효면 403 REAUTH_REQUIRED.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SshKeyPrivateKeyResponse"}}}},"403":{"description":"재인증 필요 — 유효한 X-Reauth-Token 없음 (`REAUTH_REQUIRED`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/me/activity":{"get":{"tags":["me-activity-controller"],"operationId":"listMyActivity","parameters":[{"name":"action","in":"query","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseActivityEntryResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/domains":{"get":{"tags":["publishing-controller"],"operationId":"listDomains","parameters":[{"name":"vmId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DomainStatus"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseDomainSummaryView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/domains/{domainId}":{"get":{"tags":["publishing-controller"],"operationId":"getDomain","parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/DomainDetailView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"tags":["publishing-controller"],"operationId":"deleteDomain","parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vms":{"get":{"tags":["admin-vm-controller"],"operationId":"listAdminVms","parameters":[{"name":"orgId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"groupId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/VmStatus"}},{"name":"expiringInDays","in":"query","required":false,"schema":{"type":"integer","format":"int32","minimum":1}},{"name":"expired","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":100,"minLength":1}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["name","-name","endDate","-endDate","createdAt","-createdAt"]}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseVmSummaryResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vms/{vmId}":{"get":{"tags":["admin-vm-controller"],"operationId":"getAdminVm","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VmDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vms/{vmId}/events":{"get":{"tags":["admin-vm-controller"],"operationId":"listAdminVmEvents","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseVmEventResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vm-requests":{"get":{"tags":["admin-vm-request-controller"],"operationId":"listAdminVmRequests","parameters":[{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/VmRequestStatus"}},{"name":"orgId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseVmRequestDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vm-requests/{requestId}":{"get":{"tags":["admin-vm-request-controller"],"operationId":"getAdminVmRequest","parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VmRequestDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/vm-requests/{requestId}/context":{"get":{"tags":["admin-vm-request-controller"],"operationId":"getApprovalContext","parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApprovalContextResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/users":{"get":{"tags":["admin-user-controller"],"operationId":"listUsers","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":100,"minLength":1}},{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/UserStatus"}},{"name":"role","in":"query","required":false,"schema":{"$ref":"#/components/schemas/UserRole"}},{"name":"orgId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["name","-name","email","-email","createdAt","-createdAt"]}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseUserAdminViewResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/terminal-sessions":{"get":{"tags":["admin-terminal-controller"],"operationId":"listAdminTerminalSessions","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TerminalSessionView"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/templates":{"get":{"tags":["admin-template-controller"],"operationId":"listAdminTemplates","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminTemplateResponse"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/tasks":{"get":{"tags":["admin-task-controller"],"operationId":"listAdminTasks","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProvisioningTaskStatus"}}},{"name":"kind","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ProvisioningTaskKind"}},{"name":"vmId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseAdminTaskResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/system-summary":{"get":{"tags":["admin-summary-controller"],"operationId":"getSystemSummary","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SystemDashboardSummaryResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/summary":{"get":{"tags":["admin-summary-controller"],"operationId":"getAdminSummary","parameters":[{"name":"orgId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/OrgDashboardSummaryResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/settings":{"get":{"tags":["admin-settings-controller"],"operationId":"listSettings","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SettingView"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/routes":{"get":{"tags":["admin-publishing-controller"],"operationId":"listAdminRoutes","parameters":[{"name":"orgId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/RouteStatus"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseAdminRouteView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/relays":{"get":{"tags":["admin-relay-controller"],"operationId":"listAdminRelays","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminRelayView"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/port-mappings":{"get":{"tags":["admin-port-mapping-controller"],"operationId":"listAdminPortMappings","parameters":[{"name":"relayId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"vmId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/PortMappingStatus"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseAdminPortMappingResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/notifications":{"get":{"tags":["admin-notification-controller"],"operationId":"listAdminNotifications","parameters":[{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/NotificationStatus"}},{"name":"event","in":"query","required":false,"schema":{"type":"string"}},{"name":"email","in":"query","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseAdminNotificationResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/nodes":{"get":{"tags":["admin-node-controller"],"operationId":"listAdminNodes","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NodeSummaryResponse"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/ip-allocations":{"get":{"tags":["admin-ip-allocation-controller"],"operationId":"listIpAllocations","parameters":[{"name":"poolId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/AllocationStatus"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseIpAllocationResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/groups":{"get":{"tags":["admin-group-controller"],"operationId":"listAdminGroups","parameters":[{"name":"orgId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminGroupOptionResponse"}}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/groups/{groupId}":{"get":{"tags":["admin-group-controller"],"operationId":"getAdminGroup","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AdminGroupDetailResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/drift-findings":{"get":{"tags":["admin-drift-controller"],"operationId":"listDriftFindings","parameters":[{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DriftFindingStatus"}},{"name":"kind","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DriftFindingKind"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseDriftFindingResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/domains":{"get":{"tags":["admin-publishing-controller"],"operationId":"listAdminDomains","parameters":[{"name":"orgId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"kind","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DomainKind"}},{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DomainStatus"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseAdminDomainView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/certificates":{"get":{"tags":["admin-publishing-controller"],"operationId":"listAdminCertificates","parameters":[{"name":"orgId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/CertificateStatus"}},{"name":"expiringInDays","in":"query","required":false,"schema":{"type":"integer","format":"int32","minimum":1}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseAdminCertificateView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/campus-ip-requests":{"get":{"tags":["admin-campus-ip-request-controller"],"operationId":"listAdminCampusIpRequests","parameters":[{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/CampusIpRequestStatus"}},{"name":"vmId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseAdminCampusIpRequestView"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/audit":{"get":{"tags":["admin-audit-controller"],"operationId":"listAuditLogs","parameters":[{"name":"actorEmail","in":"query","required":false,"schema":{"type":"string"}},{"name":"action","in":"query","required":false,"schema":{"type":"string"}},{"name":"targetType","in":"query","required":false,"schema":{"type":"string"}},{"name":"targetId","in":"query","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date"}},{"name":"orgId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0,"minimum":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20,"maximum":100,"minimum":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResponseAuditLogViewResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms/{vmId}/port-forwardings/{portForwardingId}":{"delete":{"tags":["port-forwarding-controller"],"operationId":"deleteVmPortForwarding","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"portForwardingId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/vms/{vmId}/campus-ip-requests/{requestId}":{"delete":{"tags":["campus-ip-request-controller"],"operationId":"cancelVmCampusIpRequest","parameters":[{"name":"vmId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"requestId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"204":{"description":"No Content"},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/me/ssh-keys/{keyId}":{"delete":{"tags":["me-ssh-key-controller"],"operationId":"deleteKey","parameters":[{"name":"keyId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"X-Reauth-Token","in":"header","description":"재인증(sudo-mode) 토큰 — POST /auth/reverify가 발급 (10분 유효, 다회용). 없거나 만료·무효면 403 REAUTH_REQUIRED.","required":false,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"403":{"description":"재인증 필요 — 유효한 X-Reauth-Token 없음 (`REAUTH_REQUIRED`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/admin/port-mappings/{mappingId}":{"delete":{"tags":["admin-port-mapping-controller"],"operationId":"deleteAdminPortMapping","parameters":[{"name":"mappingId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"202":{"description":"Accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"default":{"description":"오류 — 상태 코드와 무관하게 Problem 형태","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}},"components":{"schemas":{"ChangePasswordRequest":{"type":"object","properties":{"currentPassword":{"type":"string","minLength":1},"newPassword":{"type":"string","maxLength":72,"minLength":8}},"required":["currentPassword","newPassword"]},"AuthTokenResponse":{"type":"object","properties":{"accessToken":{"type":"string"},"user":{"$ref":"#/components/schemas/UserSummaryResponse"}},"required":["accessToken","user"]},"UserRole":{"type":"string","enum":["USER","ORG_MANAGER","ORG_ADMIN","SYS_MANAGER","SYS_ADMIN"]},"UserSummaryResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"email":{"type":"string"},"name":{"type":"string"},"role":{"$ref":"#/components/schemas/UserRole"}},"required":["email","id","name","role"]},"SettingUpdateRequest":{"type":"object","properties":{"value":{}},"required":["value"]},"SettingValueType":{"type":"string","enum":["BOOLEAN","INTEGER","NUMBER","STRING","JSON"]},"SettingView":{"type":"object","properties":{"key":{"type":"string"},"value":{},"valueType":{"$ref":"#/components/schemas/SettingValueType"},"description":{"type":"string"},"editable":{"type":"boolean"},"updatedAt":{"type":"string","format":"date-time"}},"required":["description","editable","key","updatedAt","value","valueType"]},"TerminalTicketResponse":{"type":"object","properties":{"sessionId":{"type":"string"},"ticket":{"type":"string"},"wsPath":{"type":"string"},"subprotocol":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"required":["expiresAt","sessionId","subprotocol","ticket","wsPath"]},"MessageResponse":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"PublishRequest":{"type":"object","properties":{"port":{"type":"integer","format":"int32"},"subdomain":{"type":["string","null"]},"rootDomain":{"type":["string","null"]},"customDomain":{"type":["string","null"]}}},"CertificateKind":{"type":"string","enum":["ORIGIN_CA_WILDCARD","LETS_ENCRYPT"]},"CertificateStatus":{"type":"string","enum":["ACTIVE","RENEWING","FAILED","REVOKED"]},"CertificateView":{"type":"object","properties":{"kind":{"$ref":"#/components/schemas/CertificateKind"},"status":{"$ref":"#/components/schemas/CertificateStatus"},"notAfter":{"type":["string","null"],"format":"date-time"},"lastError":{"type":["string","null"]}},"required":["kind","status"]},"DomainDetailView":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"vmId":{"type":"integer","format":"int64"},"kind":{"$ref":"#/components/schemas/DomainKind"},"fqdn":{"type":"string"},"rootDomain":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/DomainStatus"},"verifiedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"verification":{"anyOf":[{"$ref":"#/components/schemas/DomainVerificationView"},{"type":"null"}]}},"required":["createdAt","fqdn","id","kind","status","vmId"]},"DomainKind":{"type":"string","enum":["AUTO","REQUESTED","CUSTOM"]},"DomainStatus":{"type":"string","enum":["PENDING","VERIFYING","ACTIVE","FAILED","REMOVED"]},"DomainVerificationView":{"type":"object","properties":{"token":{"type":"string"},"requiredRecords":{"type":"array","items":{"$ref":"#/components/schemas/RequiredRecord"}},"aVerified":{"type":"boolean"},"txtVerified":{"type":"boolean"},"lastCheckedAt":{"type":["string","null"],"format":"date-time"},"lastError":{"type":["string","null"]}},"required":["aVerified","requiredRecords","token","txtVerified"]},"PublicationView":{"type":"object","properties":{"fqdn":{"type":"string"},"domain":{"$ref":"#/components/schemas/DomainDetailView"},"route":{"anyOf":[{"$ref":"#/components/schemas/RouteView"},{"type":"null"}]},"certificate":{"anyOf":[{"$ref":"#/components/schemas/CertificateView"},{"type":"null"}]}},"required":["domain","fqdn"]},"RequiredRecord":{"type":"object","properties":{"type":{"type":"string"},"name":{"type":"string"},"value":{"type":"string"}},"required":["name","type","value"]},"RouteStatus":{"type":"string","enum":["PENDING","APPLIED","FAILED","REMOVED"]},"RouteView":{"type":"object","properties":{"targetPort":{"type":"integer","format":"int32"},"protocol":{"type":"string"},"status":{"$ref":"#/components/schemas/RouteStatus"},"appliedAt":{"type":["string","null"],"format":"date-time"},"lastError":{"type":["string","null"]}},"required":["protocol","status","targetPort"]},"CreatePortForwardingRequest":{"type":"object","properties":{"proto":{"$ref":"#/components/schemas/PortMappingProto","description":"프로토콜 (tcp | udp)"},"targetPort":{"type":"integer","format":"int32","description":"VM 내부에서 노출할 대상 포트 (1~65535)","maximum":65535,"minimum":1}},"required":["proto","targetPort"]},"PortMappingProto":{"type":"string","enum":["TCP","UDP"]},"PortForwardApplyState":{"type":"string","enum":["PENDING","ACTIVE","FAILED"]},"PortForwardingView":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"proto":{"$ref":"#/components/schemas/PortMappingProto","description":"프로토콜 (tcp | udp)"},"publicPort":{"type":"integer","format":"int32","description":"릴레이에서 열린 공개 포트"},"publicHost":{"type":["string","null"],"description":"접속에 사용할 공개 호스트. 아직 설정 전이면 null"},"targetPort":{"type":"integer","format":"int32","description":"VM 내부 대상 포트"},"status":{"$ref":"#/components/schemas/PortMappingStatus","description":"매핑 상태 (SUSPENDED = 관리자·자동 정지)"},"applyState":{"$ref":"#/components/schemas/PortForwardApplyState","description":"릴레이 반영 상태 (PENDING = 대기, ACTIVE = 활성, FAILED = 실패)"},"createdAt":{"type":"string","format":"date-time"}},"required":["applyState","createdAt","id","proto","publicPort","status","targetPort"]},"PortMappingStatus":{"type":"string","enum":["ACTIVE","SUSPENDED"]},"VmPasswordResponse":{"type":"object","properties":{"password":{"type":"string"},"sshUsername":{"type":"string"},"sshHost":{"type":"string"},"sshPort":{"type":"integer","format":"int32"}},"required":["password","sshHost","sshPort","sshUsername"]},"CreateCampusIpRequest":{"type":"object","properties":{"purpose":{"type":"string","description":"신청 목적 (관리자 검토 자료)","maxLength":1000,"minLength":0},"ports":{"type":"array","description":"교내 IP로 사용할 포트 번호 목록 (1~65535, 최대 32개)","items":{"type":"integer","format":"int32"},"maxItems":32,"minItems":0}},"required":["ports","purpose"]},"CampusIpRequestStatus":{"type":"string","enum":["REQUESTED","APPROVED","GRANTED","REJECTED","REVOKED"]},"CampusIpRequestView":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"vmId":{"type":"integer","format":"int64"},"purpose":{"type":"string","description":"신청 목적"},"ports":{"type":"array","description":"사용할 포트 번호 목록 (중복 제거·오름차순 정규화)","items":{"type":"integer","format":"int32"}},"status":{"$ref":"#/components/schemas/CampusIpRequestStatus","description":"신청 상태 (REQUESTED = 신청, APPROVED = 관리자 승인, GRANTED = 교내 IP 연결 완료, REJECTED = 반려, REVOKED = 회수)"},"grantedAddress":{"type":["string","null"],"description":"연결된 교내 IP 주소 (GRANTED 이후)"},"adminNote":{"type":["string","null"],"description":"관리자 메모"},"requestedBy":{"type":"integer","format":"int64"},"processedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}},"required":["createdAt","id","ports","purpose","requestedBy","status","vmId"]},"CreateVmRequestRequest":{"type":"object","properties":{"groupId":{"type":"integer","format":"int64"},"orgId":{"type":"integer","format":"int64"},"templateId":{"type":"integer","format":"int64"},"flavorId":{"type":"integer","format":"int64"},"purpose":{"type":"string","maxLength":2000,"minLength":0},"courseOrProject":{"type":["string","null"],"maxLength":200,"minLength":0},"specReason":{"type":["string","null"],"maxLength":2000,"minLength":0},"extraNote":{"type":["string","null"],"maxLength":2000,"minLength":0},"reqVcpu":{"type":"integer","format":"int32","minimum":1},"reqMemoryMb":{"type":"integer","format":"int32","minimum":256},"reqDiskGb":{"type":"integer","format":"int32","minimum":1},"reqStartDate":{"type":["string","null"],"format":"date"},"reqEndDate":{"type":["string","null"],"format":"date"},"desiredSubdomain":{"type":["string","null"],"pattern":"^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"},"rootDomain":{"type":["string","null"],"maxLength":253,"minLength":0},"displayName":{"type":["string","null"],"maxLength":100,"minLength":0},"desiredSlug":{"type":["string","null"],"pattern":"^\\s*$|^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"}},"required":["flavorId","groupId","orgId","purpose","reqDiskGb","reqMemoryMb","reqVcpu","templateId"]},"ReviewDecision":{"type":"string","enum":["APPROVE","REJECT"]},"VmRequestDetailResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"groupId":{"type":"integer","format":"int64"},"groupName":{"type":"string"},"orgId":{"type":"integer","format":"int64"},"orgName":{"type":"string"},"requesterId":{"type":"integer","format":"int64"},"requesterName":{"type":"string"},"templateId":{"type":"integer","format":"int64"},"flavorId":{"type":["integer","null"],"format":"int64"},"purpose":{"type":"string"},"courseOrProject":{"type":["string","null"]},"specReason":{"type":["string","null"]},"extraNote":{"type":["string","null"]},"reqVcpu":{"type":"integer","format":"int32"},"reqMemoryMb":{"type":"integer","format":"int32"},"reqDiskGb":{"type":"integer","format":"int32"},"reqStartDate":{"type":["string","null"],"format":"date"},"reqEndDate":{"type":["string","null"],"format":"date"},"desiredSubdomain":{"type":["string","null"]},"rootDomain":{"type":["string","null"]},"displayName":{"type":["string","null"]},"desiredSlug":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/VmRequestStatus"},"review":{"anyOf":[{"$ref":"#/components/schemas/VmRequestReviewResponse"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["createdAt","groupId","groupName","id","orgId","orgName","purpose","reqDiskGb","reqMemoryMb","reqVcpu","requesterId","requesterName","status","templateId","updatedAt"]},"VmRequestReviewResponse":{"type":"object","properties":{"reviewerId":{"type":"integer","format":"int64"},"reviewerName":{"type":"string"},"decision":{"$ref":"#/components/schemas/ReviewDecision"},"comment":{"type":["string","null"]},"grantedVcpu":{"type":["integer","null"],"format":"int32"},"grantedMemoryMb":{"type":["integer","null"],"format":"int32"},"grantedDiskGb":{"type":["integer","null"],"format":"int32"},"grantedTemplateId":{"type":["integer","null"],"format":"int64"},"grantedStartDate":{"type":["string","null"],"format":"date"},"grantedEndDate":{"type":["string","null"],"format":"date"},"nodeId":{"type":["integer","null"],"format":"int64"},"decidedAt":{"type":"string","format":"date-time"}},"required":["decidedAt","decision","reviewerId","reviewerName"]},"VmRequestStatus":{"type":"string","enum":["SUBMITTED","APPROVED","REJECTED","CANCELED"]},"NotificationImportance":{"type":"string","enum":["NORMAL","HIGH"]},"NotificationView":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"event":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"},"linkPath":{"type":["string","null"]},"importance":{"$ref":"#/components/schemas/NotificationImportance"},"createdAt":{"type":"string","format":"date-time"},"readAt":{"type":["string","null"],"format":"date-time"}},"required":["body","createdAt","event","id","importance","title"]},"ReadAllResponse":{"type":"object","properties":{"updatedCount":{"type":"integer","format":"int32"}},"required":["updatedCount"]},"WithdrawRequest":{"type":"object","properties":{"password":{"type":"string","minLength":1},"totpCode":{"type":"string","pattern":"^[0-9]{6}$"},"recoveryCode":{"type":"string"}},"required":["password"]},"SshKeyCreateRequest":{"type":"object","properties":{"name":{"type":"string","maxLength":100,"minLength":1},"publicKey":{"type":"string","maxLength":8192,"minLength":0}},"required":["name","publicKey"]},"SshKeyAlgorithm":{"type":"string","enum":["ED25519","RSA"]},"SshKeyView":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"algorithm":{"$ref":"#/components/schemas/SshKeyAlgorithm"},"publicKey":{"type":"string"},"fingerprint":{"type":"string"},"privateKeyStored":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time"}},"required":["algorithm","createdAt","fingerprint","id","name","privateKeyStored","publicKey"]},"SshKeyGenerateRequest":{"type":"object","properties":{"name":{"type":"string","maxLength":100,"minLength":1}},"required":["name"]},"BeginMfaRequest":{"type":"object","properties":{"password":{"type":"string","minLength":1}},"required":["password"]},"MfaSetupResponse":{"type":"object","properties":{"secret":{"type":"string"},"otpauthUri":{"type":"string"}},"required":["otpauthUri","secret"]},"ActivateMfaRequest":{"type":"object","properties":{"code":{"type":"string","minLength":1,"pattern":"^[0-9]{6}$"}},"required":["code"]},"MfaRecoveryCodesResponse":{"type":"object","properties":{"recoveryCodes":{"type":"array","items":{"type":"string"}}},"required":["recoveryCodes"]},"RegenerateRecoveryCodesRequest":{"type":"object","properties":{"password":{"type":"string","minLength":1},"code":{"type":"string","minLength":1,"pattern":"^[0-9]{6}$"}},"required":["code","password"]},"DisableMfaRequest":{"type":"object","properties":{"password":{"type":"string","minLength":1},"code":{"type":"string","pattern":"^[0-9]{6}$"},"recoveryCode":{"type":"string"}},"required":["password"]},"ConsentInput":{"type":"object","properties":{"docType":{"$ref":"#/components/schemas/TermsDocType"},"version":{"type":"integer","format":"int32"}},"required":["docType","version"]},"ConsentUpdateRequest":{"type":"object","properties":{"consents":{"type":"array","items":{"$ref":"#/components/schemas/ConsentInput"},"minItems":1}},"required":["consents"]},"TermsDocType":{"type":"string","enum":["TERMS_OF_SERVICE","PRIVACY_POLICY"]},"ConsentView":{"type":"object","properties":{"docType":{"$ref":"#/components/schemas/TermsDocType"},"version":{"type":"integer","format":"int32"},"consentedAt":{"type":"string","format":"date-time"}},"required":["consentedAt","docType","version"]},"CreateGroupRequest":{"type":"object","properties":{"kind":{"$ref":"#/components/schemas/GroupKind","description":"그룹 종류 — PERSONAL은 시스템 생성 전용이라 요청으로 만들 수 없습니다","enum":["TEAM","PROJECT"]},"name":{"type":"string","maxLength":100,"minLength":0},"slug":{"type":"string","minLength":1,"pattern":"^[a-z0-9]([a-z0-9-]{0,38}[a-z0-9])?$"},"description":{"type":["string","null"],"maxLength":500,"minLength":0}},"required":["kind","name","slug"]},"GroupKind":{"type":"string","enum":["PERSONAL","TEAM","PROJECT"]},"GroupDetailResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"kind":{"$ref":"#/components/schemas/GroupKind"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":["string","null"]},"myRole":{"$ref":"#/components/schemas/GroupMemberRole"},"members":{"type":"array","items":{"$ref":"#/components/schemas/GroupMemberResponse"}},"createdAt":{"type":"string","format":"date-time"}},"required":["createdAt","id","kind","members","myRole","name","slug"]},"GroupMemberResponse":{"type":"object","properties":{"userId":{"type":"integer","format":"int64"},"name":{"type":"string"},"email":{"type":"string"},"role":{"$ref":"#/components/schemas/GroupMemberRole"}},"required":["email","name","role","userId"]},"GroupMemberRole":{"type":"string","enum":["OWNER","EDITOR","MEMBER","VIEWER"]},"AddGroupMemberRequest":{"type":"object","properties":{"email":{"type":"string","format":"email","minLength":1},"role":{"$ref":"#/components/schemas/GroupMemberRole"}},"required":["email","role"]},"VerifyEmailRequest":{"type":"object","properties":{"token":{"type":"string","minLength":1}},"required":["token"]},"SignupRequest":{"type":"object","properties":{"email":{"type":"string","minLength":1,"pattern":"^[A-Za-z0-9._%+-]+@pusan\\.ac\\.kr$"},"password":{"type":"string","maxLength":72,"minLength":8},"name":{"type":"string","maxLength":50,"minLength":0},"consents":{"type":"array","items":{"$ref":"#/components/schemas/ConsentInput"},"minItems":1}},"required":["consents","email","name","password"]},"ReverifyRequest":{"type":"object","properties":{"password":{"type":"string","minLength":1}},"required":["password"]},"ReverifyResponse":{"type":"object","properties":{"reauthToken":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"required":["expiresAt","reauthToken"]},"ResendVerificationRequest":{"type":"object","properties":{"email":{"type":"string","minLength":1,"pattern":"^[A-Za-z0-9._%+-]+@pusan\\.ac\\.kr$"}},"required":["email"]},"PasswordResetRequest":{"type":"object","properties":{"email":{"type":"string","minLength":1,"pattern":"^[A-Za-z0-9._%+-]+@pusan\\.ac\\.kr$"}},"required":["email"]},"PasswordResetConfirmRequest":{"type":"object","properties":{"token":{"type":"string","minLength":1},"newPassword":{"type":"string","maxLength":72,"minLength":8}},"required":["newPassword","token"]},"MfaLoginRequest":{"type":"object","properties":{"mfaToken":{"type":"string","minLength":1},"code":{"type":"string","pattern":"^[0-9]{6}$"},"recoveryCode":{"type":"string"}},"required":["mfaToken"]},"LoginRequest":{"type":"object","properties":{"email":{"type":"string","minLength":1},"password":{"type":"string","minLength":1}},"required":["email","password"]},"MfaChallengeResponse":{"type":"object","properties":{"mfaRequired":{"type":"boolean"},"mfaToken":{"type":"string"}},"required":["mfaRequired","mfaToken"]},"ScheduleVmDeletionRequest":{"type":"object","properties":{"scheduledFor":{"type":"string","format":"date-time"},"reason":{"type":"string","maxLength":2000,"minLength":0}},"required":["reason","scheduledFor"]},"VmDeleteKind":{"type":"string","enum":["SELF","ADMIN","FORCE"]},"VmDeletionResponse":{"type":"object","properties":{"kind":{"$ref":"#/components/schemas/VmDeleteKind"},"scheduledFor":{"type":"string","format":"date-time"},"requestedAt":{"type":"string","format":"date-time"},"requestedById":{"type":"integer","format":"int64"},"reason":{"type":["string","null"]},"cancelable":{"type":"boolean"}},"required":["cancelable","kind","requestedAt","requestedById","scheduledFor"]},"ForceDeleteVmRequest":{"type":"object","properties":{"confirmName":{"type":"string","minLength":1},"overrideProtection":{"type":"boolean"}},"required":["confirmName"]},"RejectVmRequestRequest":{"type":"object","properties":{"comment":{"type":"string","maxLength":2000,"minLength":0}},"required":["comment"]},"ApproveVmRequestRequest":{"type":"object","properties":{"grantedVcpu":{"type":"integer","format":"int32","minimum":1},"grantedMemoryMb":{"type":"integer","format":"int32","minimum":256},"grantedDiskGb":{"type":"integer","format":"int32","minimum":1},"grantedTemplateId":{"type":"integer","format":"int64"},"grantedStartDate":{"type":["string","null"],"format":"date"},"grantedEndDate":{"type":["string","null"],"format":"date"},"grantedSlug":{"type":["string","null"],"pattern":"^\\s*$|^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"},"nodeId":{"type":["integer","null"],"format":"int64"},"comment":{"type":["string","null"],"maxLength":2000,"minLength":0}},"required":["grantedDiskGb","grantedMemoryMb","grantedTemplateId","grantedVcpu"]},"CreateVmFlavorRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"pattern":"^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$|^[a-z0-9]$"},"displayName":{"type":"string","maxLength":100,"minLength":0},"vcpu":{"type":"integer","format":"int32","minimum":1},"memoryMb":{"type":"integer","format":"int32","minimum":256},"diskGb":{"type":"integer","format":"int32","minimum":1},"notes":{"type":["string","null"],"maxLength":2000,"minLength":0}},"required":["diskGb","displayName","memoryMb","name","vcpu"]},"TemplateStatus":{"type":"string","enum":["ACTIVE","DISABLED"]},"VmFlavorResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"displayName":{"type":"string"},"vcpu":{"type":"integer","format":"int32"},"memoryMb":{"type":"integer","format":"int32"},"diskGb":{"type":"integer","format":"int32"},"status":{"$ref":"#/components/schemas/TemplateStatus"},"notes":{"type":["string","null"]}},"required":["diskGb","displayName","id","memoryMb","name","status","vcpu"]},"Membership":{"type":"object","properties":{"groupId":{"type":"integer","format":"int64"},"groupName":{"type":"string"},"groupKind":{"$ref":"#/components/schemas/GroupKind"},"role":{"$ref":"#/components/schemas/GroupMemberRole"}},"required":["groupId","groupKind","groupName","role"]},"UserAdminDetailResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"email":{"type":"string"},"name":{"type":"string"},"role":{"$ref":"#/components/schemas/UserRole"},"orgId":{"type":["integer","null"],"format":"int64"},"status":{"$ref":"#/components/schemas/UserStatus"},"mfaEnabled":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"withdrawnAt":{"type":["string","null"],"format":"date-time"},"disabledAt":{"type":["string","null"],"format":"date-time"},"disabledReason":{"type":["string","null"]},"memberships":{"type":"array","items":{"$ref":"#/components/schemas/Membership"}},"activeVmCount":{"type":"integer","format":"int32"},"statusChanges":{"type":"array","items":{"$ref":"#/components/schemas/UserStatusChangeResponse"}}},"required":["activeVmCount","createdAt","email","id","memberships","mfaEnabled","name","role","status","statusChanges"]},"UserStatus":{"type":"string","enum":["PENDING_VERIFICATION","ACTIVE","DISABLED","WITHDRAWN"]},"UserStatusChangeResponse":{"type":"object","properties":{"fromStatus":{"$ref":"#/components/schemas/UserStatus"},"toStatus":{"$ref":"#/components/schemas/UserStatus"},"actorId":{"type":["integer","null"],"format":"int64"},"actorEmail":{"type":["string","null"]},"reason":{"type":["string","null"]},"changedAt":{"type":"string","format":"date-time"}},"required":["changedAt","fromStatus","toStatus"]},"DisableUserRequest":{"type":"object","properties":{"reason":{"type":"string","maxLength":500,"minLength":1}},"required":["reason"]},"RelayTokenResponse":{"type":"object","properties":{"relayId":{"type":"integer","format":"int64"},"token":{"type":"string","description":"새 동기화 토큰(64자 hex). 이 응답에서만 확인 가능하며 저장되지 않습니다"}},"required":["relayId","token"]},"AdminPortMappingResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"relayId":{"type":"integer","format":"int64"},"relayName":{"type":"string"},"vmId":{"type":"integer","format":"int64"},"vmName":{"type":["string","null"]},"proto":{"$ref":"#/components/schemas/PortMappingProto"},"publicPort":{"type":"integer","format":"int32"},"targetPort":{"type":"integer","format":"int32"},"status":{"$ref":"#/components/schemas/PortMappingStatus"},"suspendedReason":{"type":["string","null"],"description":"정지 사유 (SUSPENDED일 때)"},"suspendedBy":{"type":["integer","null"],"format":"int64","description":"정지한 관리자 id (자동 정지면 null)"},"applyState":{"$ref":"#/components/schemas/PortForwardApplyState"},"ctMax":{"type":["integer","null"],"format":"int32","description":"동시 연결 상한 오버라이드 (null = 에이전트 기본, 0 = 해제)"},"newConnRate":{"type":["integer","null"],"format":"int32","description":"초당 신규 연결 상한 오버라이드"},"newConnBurst":{"type":["integer","null"],"format":"int32","description":"신규 연결 버스트 오버라이드"},"perSourceRate":{"type":["integer","null"],"format":"int32","description":"출발지별 초당 신규 연결 상한 오버라이드"},"perSourceBurst":{"type":["integer","null"],"format":"int32","description":"출발지별 버스트 오버라이드"},"createdBy":{"type":"integer","format":"int64"},"createdAt":{"type":"string","format":"date-time"}},"required":["applyState","createdAt","createdBy","id","proto","publicPort","relayId","relayName","status","targetPort","vmId"]},"SuspendPortMappingRequest":{"type":"object","properties":{"reason":{"type":"string","description":"정지 사유 (소유 그룹에 알림으로 전달)","maxLength":500,"minLength":0}},"required":["reason"]},"CreateOrgRequest":{"type":"object","properties":{"name":{"type":"string","maxLength":100,"minLength":0},"slug":{"type":"string","minLength":1,"pattern":"^[a-z0-9]([a-z0-9-]{0,38}[a-z0-9])?$"},"description":{"type":["string","null"],"maxLength":500,"minLength":0}},"required":["name","slug"]},"OrgDetailResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/OrgStatus"},"hidden":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}},"required":["createdAt","hidden","id","name","slug","status"]},"OrgStatus":{"type":"string","enum":["ACTIVE","DISABLED"]},"ResolveDriftFindingRequest":{"type":"object","properties":{"note":{"type":"string","maxLength":2000,"minLength":0}}},"DriftFindingKind":{"type":"string","enum":["MISSING_IN_PROXMOX","UNMANAGED_GUEST","SPEC_MISMATCH"]},"DriftFindingResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"kind":{"$ref":"#/components/schemas/DriftFindingKind"},"vmId":{"type":["integer","null"],"format":"int64"},"vmName":{"type":["string","null"]},"proxmoxVmid":{"type":["integer","null"],"format":"int32"},"nodeName":{"type":["string","null"]},"summary":{"type":"string"},"detail":{},"status":{"$ref":"#/components/schemas/DriftFindingStatus"},"firstSeenAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"},"resolvedAt":{"type":["string","null"],"format":"date-time"},"resolvedById":{"type":["integer","null"],"format":"int64"},"resolvedByEmail":{"type":["string","null"]},"resolutionNote":{"type":["string","null"]}},"required":["firstSeenAt","id","kind","lastSeenAt","status","summary"]},"DriftFindingStatus":{"type":"string","enum":["OPEN","RESOLVED"]},"UpdateCampusIpRequestStatusRequest":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/CampusIpRequestStatus","description":"전환할 상태 (APPROVED = 승인, GRANTED = 교내 IP 연결 완료, REJECTED = 반려, REVOKED = 회수)"},"grantedAddress":{"type":["string","null"],"description":"연결한 교내 IP 주소 (GRANTED 전환 시 필수, 10.0.0.0/8 대역)","maxLength":45,"minLength":0},"adminNote":{"type":["string","null"],"description":"관리자 메모 (신청자 알림에 포함)","maxLength":1000,"minLength":0}},"required":["status"]},"AdminCampusIpRequestView":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"vmId":{"type":"integer","format":"int64"},"vmName":{"type":["string","null"]},"orgId":{"type":["integer","null"],"format":"int64"},"purpose":{"type":"string","description":"신청 목적"},"ports":{"type":"array","description":"사용할 포트 번호 목록","items":{"type":"integer","format":"int32"}},"status":{"$ref":"#/components/schemas/CampusIpRequestStatus","description":"신청 상태 (REQUESTED = 신청, APPROVED = 관리자 승인, GRANTED = 교내 IP 연결 완료, REJECTED = 반려, REVOKED = 회수)"},"grantedAddress":{"type":["string","null"],"description":"연결된 교내 IP 주소 (10.0.0.0/8)"},"adminNote":{"type":["string","null"]},"requestedBy":{"type":"integer","format":"int64"},"requesterEmail":{"type":["string","null"],"description":"신청자 이메일"},"processedBy":{"type":["integer","null"],"format":"int64"},"processedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}},"required":["createdAt","id","ports","purpose","requestedBy","status","vmId"]},"AnnouncementCreateRequest":{"type":"object","properties":{"title":{"type":"string","maxLength":200,"minLength":0},"body":{"type":"string","maxLength":10000,"minLength":0},"scope":{"$ref":"#/components/schemas/AnnouncementScope"},"orgId":{"type":["integer","null"],"format":"int64"},"groupId":{"type":["integer","null"],"format":"int64"}},"required":["body","scope","title"]},"AnnouncementScope":{"type":"string","enum":["ALL","ORG","GROUP"]},"AnnouncementView":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"title":{"type":"string"},"scope":{"$ref":"#/components/schemas/AnnouncementScope"},"orgId":{"type":["integer","null"],"format":"int64"},"groupId":{"type":["integer","null"],"format":"int64"},"recipientCount":{"type":"integer","format":"int32"},"createdAt":{"type":"string","format":"date-time"}},"required":["createdAt","id","recipientCount","scope","title"]},"VmSettingsUpdateRequest":{"type":"object","properties":{"settings":{"type":"object","additionalProperties":{}}},"required":["settings"]},"VmSettingValueType":{"type":"string","enum":["BOOLEAN","ENUM","INTEGER","STRING"]},"VmSettingView":{"type":"object","properties":{"key":{"type":"string"},"value":{},"valueType":{"$ref":"#/components/schemas/VmSettingValueType"},"allowedValues":{"type":["array","null"],"items":{"type":"string"}},"defaultValue":{},"label":{"type":"string"},"description":{"type":"string"},"requiredRole":{"$ref":"#/components/schemas/GroupMemberRole"},"editable":{"type":"boolean"},"updatedByName":{"type":["string","null"]},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["defaultValue","description","editable","key","label","requiredRole","value","valueType"]},"UpdatePublicationRequest":{"type":"object","properties":{"port":{"type":"integer","format":"int32"},"customDomain":{"type":["string","null"]}}},"UpdateGroupRequest":{"type":"object","properties":{"name":{"type":"string","maxLength":100,"minLength":0},"description":{"type":["string","null"],"maxLength":500,"minLength":0}}},"UpdateGroupMemberRequest":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/GroupMemberRole"}},"required":["role"]},"VmPeriodUpdateRequest":{"type":"object","properties":{"endDate":{"type":"string","format":"date"},"startDate":{"type":"string","format":"date"}},"required":["endDate"]},"ProvisioningTaskKind":{"type":"string","enum":["PROVISION","DELETE","REINSTALL"]},"ProvisioningTaskResponse":{"type":"object","properties":{"kind":{"$ref":"#/components/schemas/ProvisioningTaskKind"},"status":{"$ref":"#/components/schemas/ProvisioningTaskStatus"},"currentStep":{"type":"integer","format":"int32"},"totalSteps":{"type":"integer","format":"int32"},"stepLabel":{"type":"string"},"attempts":{"type":"integer","format":"int32"},"lastError":{"type":["string","null"]},"updatedAt":{"type":"string","format":"date-time"}},"required":["attempts","currentStep","kind","status","stepLabel","totalSteps","updatedAt"]},"ProvisioningTaskStatus":{"type":"string","enum":["PENDING","RUNNING","DONE","FAILED","RETRYING","NEEDS_ADMIN"]},"VmDetailResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"hostname":{"type":"string"},"status":{"$ref":"#/components/schemas/VmStatus"},"vcpu":{"type":"integer","format":"int32"},"memoryMb":{"type":"integer","format":"int32"},"diskGb":{"type":"integer","format":"int32"},"groupId":{"type":"integer","format":"int64"},"groupName":{"type":"string"},"orgName":{"type":["string","null"]},"displayName":{"type":["string","null"]},"requestId":{"type":"integer","format":"int64"},"statusDetail":{"type":["string","null"]},"sshGatewayBlocked":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"orgId":{"type":"integer","format":"int64"},"templateId":{"type":"integer","format":"int64"},"ipAddress":{"type":["string","null"]},"sshUsername":{"type":"string"},"sshHost":{"type":"string"},"myGroupRole":{"anyOf":[{"$ref":"#/components/schemas/GroupMemberRole"},{"type":"null"}]},"startDate":{"type":["string","null"],"format":"date"},"endDate":{"type":["string","null"],"format":"date"},"expiryStoppedAt":{"type":["string","null"],"format":"date-time"},"provisioning":{"anyOf":[{"$ref":"#/components/schemas/ProvisioningTaskResponse"},{"type":"null"}]},"deletion":{"anyOf":[{"$ref":"#/components/schemas/VmDeletionResponse"},{"type":"null"}]},"requestedSubdomain":{"type":["string","null"]},"requestedRootDomain":{"type":["string","null"]},"publication":{"anyOf":[{"$ref":"#/components/schemas/PublicationView"},{"type":"null"}]},"passwordAvailable":{"type":"boolean"},"passwordRevealAllowed":{"type":"boolean"},"updatedAt":{"type":"string","format":"date-time"}},"required":["createdAt","diskGb","groupId","groupName","hostname","id","memoryMb","name","orgId","passwordAvailable","passwordRevealAllowed","requestId","sshGatewayBlocked","sshHost","sshUsername","status","templateId","updatedAt","vcpu"]},"VmStatus":{"type":"string","enum":["CREATING","RUNNING","STOPPED","REBOOTING","DELETING","DELETED","ERROR","NEEDS_ADMIN"]},"VmGatewayBlockUpdateRequest":{"type":"object","properties":{"blocked":{"type":"boolean","description":"true = SSH 게이트웨이·웹 터미널 차단, false = 차단 해제"},"reason":{"type":["string","null"],"description":"차단·해제 사유 (VM 이벤트·감사 기록에 포함, 선택)","maxLength":200,"minLength":0}},"required":["blocked"]},"UpdateVmFlavorRequest":{"type":"object","properties":{"displayName":{"type":["string","null"],"maxLength":100,"minLength":0},"vcpu":{"type":["integer","null"],"format":"int32","minimum":1},"memoryMb":{"type":["integer","null"],"format":"int32","minimum":256},"diskGb":{"type":["integer","null"],"format":"int32","minimum":1},"notes":{"type":["string","null"],"maxLength":2000,"minLength":0},"status":{"anyOf":[{"$ref":"#/components/schemas/TemplateStatus"},{"type":"null"}],"description":"ACTIVE = 신청 위저드에 노출, DISABLED = 은퇴 (기존 신청·VM 무영향)"}}},"UpdateUserAdminRequest":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/UserRole"},"orgId":{"type":["integer","null"],"format":"int64"}}},"UpdateTemplateStatusRequest":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/TemplateStatus","description":"ACTIVE = 신청 위저드에 노출, DISABLED = 은퇴 (기존 VM 무영향)"}},"required":["status"]},"AdminTemplateResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"displayName":{"type":"string"},"osFamily":{"type":"string"},"osVersion":{"type":"string"},"sshUsername":{"type":"string"},"version":{"type":"integer","format":"int32"},"proxmoxVmid":{"type":"integer","format":"int32"},"nodeId":{"type":"integer","format":"int64"},"status":{"$ref":"#/components/schemas/TemplateStatus"},"minDiskGb":{"type":"integer","format":"int32"},"notes":{"type":["string","null"]}},"required":["displayName","id","minDiskGb","name","nodeId","osFamily","osVersion","proxmoxVmid","sshUsername","status","version"]},"UpdatePortMappingGuardsRequest":{"type":"object","properties":{"ctMax":{"type":["integer","null"],"format":"int32","description":"매핑별 동시 연결 상한 (null = 기본값, 0 = 해제)"},"newConnRate":{"type":["integer","null"],"format":"int32","description":"초당 신규 연결 상한"},"newConnBurst":{"type":["integer","null"],"format":"int32","description":"신규 연결 버스트"},"perSourceRate":{"type":["integer","null"],"format":"int32","description":"출발지별 초당 신규 연결 상한"},"perSourceBurst":{"type":["integer","null"],"format":"int32","description":"출발지별 버스트"}}},"UpdateOrgRequest":{"type":"object","properties":{"name":{"type":"string","maxLength":100,"minLength":0},"description":{"type":["string","null"],"maxLength":500,"minLength":0},"status":{"$ref":"#/components/schemas/OrgStatus"},"hidden":{"type":"boolean"}}},"NodeStatus":{"type":"string","enum":["ACTIVE","MAINTENANCE","OFFLINE"]},"UpdateNodeStatusRequest":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/NodeStatus","description":"ACTIVE만 신규 VM 배치 대상 — MAINTENANCE/OFFLINE은 배치 제외 (기존 게스트 무영향)"}},"required":["status"]},"IpPoolSummaryResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"cidr":{"type":"string"},"allocatedCount":{"type":"integer","format":"int64"},"freeCount":{"type":"integer","format":"int64"}},"required":["allocatedCount","cidr","freeCount","id","name"]},"NodeSummaryResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"status":{"$ref":"#/components/schemas/NodeStatus"},"cpuThreads":{"type":"integer","format":"int32"},"memoryMb":{"type":"integer","format":"int32"},"vmBridge":{"type":"string"},"storage":{"type":"string"},"runningVms":{"type":"integer","format":"int64"},"allocatedVcpu":{"type":"integer","format":"int64"},"allocatedMemoryMb":{"type":"integer","format":"int64"},"cpuOvercommitRatio":{"type":"number","format":"double"},"memoryAllocRatio":{"type":"number","format":"double"},"cpuWarnThreshold":{"type":"number","format":"double"},"memoryWarnThreshold":{"type":"number","format":"double"},"ipPool":{"$ref":"#/components/schemas/IpPoolSummaryResponse"}},"required":["allocatedMemoryMb","allocatedVcpu","cpuOvercommitRatio","cpuThreads","cpuWarnThreshold","id","ipPool","memoryAllocRatio","memoryMb","memoryWarnThreshold","name","runningVms","status","storage","vmBridge"]},"PageResponseVmSummaryResponse":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/VmSummaryResponse"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"VmSummaryResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"hostname":{"type":"string"},"status":{"$ref":"#/components/schemas/VmStatus"},"vcpu":{"type":"integer","format":"int32"},"memoryMb":{"type":"integer","format":"int32"},"diskGb":{"type":"integer","format":"int32"},"groupId":{"type":"integer","format":"int64"},"groupName":{"type":"string"},"orgName":{"type":["string","null"]},"displayName":{"type":["string","null"]},"requestId":{"type":"integer","format":"int64"},"statusDetail":{"type":["string","null"]},"sshGatewayBlocked":{"type":"boolean"},"endDate":{"type":["string","null"],"format":"date"},"expiryStoppedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}},"required":["createdAt","diskGb","groupId","groupName","hostname","id","memoryMb","name","requestId","sshGatewayBlocked","status","vcpu"]},"PageResponseVmEventResponse":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/VmEventResponse"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"VmEventResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"type":{"$ref":"#/components/schemas/VmEventType"},"actorId":{"type":["integer","null"],"format":"int64"},"detail":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}},"required":["createdAt","id","type"]},"VmEventType":{"type":"string","enum":["CREATE","START","STOP","REBOOT","FORCE_STOP","DELETE","SELF_DELETE","FORCE_DELETE","REINSTALL","SCHEDULE_DELETE","CANCEL_SCHEDULED_DELETE","PUBLISH","UNPUBLISH","EXPIRE_STOP","PERIOD_UPDATE","GATEWAY_BLOCK","GATEWAY_UNBLOCK","PORT_FORWARD_CREATE","PORT_FORWARD_DELETE"]},"PageResponseVmRequestDetailResponse":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/VmRequestDetailResponse"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"VmTemplateResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"displayName":{"type":"string"},"osFamily":{"type":"string"},"osVersion":{"type":"string"},"sshUsername":{"type":"string"},"version":{"type":"integer","format":"int32"},"minDiskGb":{"type":"integer","format":"int32"},"status":{"$ref":"#/components/schemas/TemplateStatus"},"notes":{"type":["string","null"]}},"required":["displayName","id","minDiskGb","name","osFamily","osVersion","sshUsername","status","version"]},"OrgSummaryResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/OrgStatus"},"hidden":{"type":"boolean"}},"required":["hidden","id","name","slug","status"]},"PageResponseNotificationView":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/NotificationView"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"UnreadCountResponse":{"type":"object","properties":{"unreadCount":{"type":"integer","format":"int64"}},"required":["unreadCount"]},"TermsVersionView":{"type":"object","properties":{"docType":{"$ref":"#/components/schemas/TermsDocType"},"version":{"type":"integer","format":"int32"},"title":{"type":"string"},"effectiveAt":{"type":"string","format":"date-time"}},"required":["docType","effectiveAt","title","version"]},"TermsDocumentView":{"type":"object","properties":{"docType":{"$ref":"#/components/schemas/TermsDocType"},"version":{"type":"integer","format":"int32"},"title":{"type":"string"},"body":{"type":"string"},"effectiveAt":{"type":"string","format":"date-time"}},"required":["body","docType","effectiveAt","title","version"]},"SystemStatusResponse":{"type":"object","properties":{"maintenance":{"type":"boolean"},"maintenanceMessage":{"type":["string","null"]},"bannerMessage":{"type":["string","null"]},"contactEmail":{"type":["string","null"]}},"required":["maintenance"]},"RequestOptionsResponse":{"type":"object","properties":{"allowedRootDomains":{"type":"array","items":{"type":"string"}},"reservedSubdomains":{"type":"array","items":{"type":"string"}},"sshHost":{"type":"string"}},"required":["allowedRootDomains","reservedSubdomains","sshHost"]},"UserProfileResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"email":{"type":"string"},"name":{"type":"string"},"role":{"$ref":"#/components/schemas/UserRole"},"orgId":{"type":["integer","null"],"format":"int64"},"status":{"$ref":"#/components/schemas/UserStatus"},"memberships":{"type":"array","items":{"$ref":"#/components/schemas/Membership"}},"mfaEnabled":{"type":"boolean"},"pendingConsents":{"type":"array","items":{"$ref":"#/components/schemas/TermsVersionView"}}},"required":["email","id","memberships","mfaEnabled","name","pendingConsents","role","status"]},"SshKeyPrivateKeyResponse":{"type":"object","properties":{"privateKey":{"type":"string"},"fileName":{"type":"string"}},"required":["fileName","privateKey"]},"ActivityEntryResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"action":{"type":"string"},"targetType":{"type":["string","null"]},"targetId":{"type":["string","null"]},"detail":{},"ip":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}},"required":["action","createdAt","id"]},"PageResponseActivityEntryResponse":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/ActivityEntryResponse"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"GroupSummaryResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"kind":{"$ref":"#/components/schemas/GroupKind"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":["string","null"]},"myRole":{"$ref":"#/components/schemas/GroupMemberRole"},"memberCount":{"type":"integer","format":"int64"}},"required":["id","kind","memberCount","myRole","name","slug"]},"DomainSummaryView":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"vmId":{"type":"integer","format":"int64"},"kind":{"$ref":"#/components/schemas/DomainKind"},"fqdn":{"type":"string"},"rootDomain":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/DomainStatus"},"verifiedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}},"required":["createdAt","fqdn","id","kind","status","vmId"]},"PageResponseDomainSummaryView":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/DomainSummaryView"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"Applicant":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"email":{"type":"string"},"signupAt":{"type":"string","format":"date-time"},"approvedCount":{"type":"integer","format":"int64"},"rejectedCount":{"type":"integer","format":"int64"}},"required":["approvedCount","email","id","name","rejectedCount","signupAt"]},"ApprovalContextResponse":{"type":"object","properties":{"applicant":{"$ref":"#/components/schemas/Applicant"},"applicantResources":{"$ref":"#/components/schemas/Resources"},"group":{"$ref":"#/components/schemas/GroupPanel"},"history":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEntry"}},"orgHeadroom":{"$ref":"#/components/schemas/OrgHeadroom"},"guidance":{"type":"string"}},"required":["applicant","applicantResources","group","guidance","history","orgHeadroom"]},"Capacity":{"type":"object","properties":{"cpuThreads":{"type":"integer","format":"int64"},"memoryMb":{"type":"integer","format":"int64"}},"required":["cpuThreads","memoryMb"]},"GroupPanel":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"kind":{"$ref":"#/components/schemas/GroupKind"},"members":{"type":"array","items":{"$ref":"#/components/schemas/MemberBrief"}},"activeVms":{"type":"array","items":{"$ref":"#/components/schemas/VmBriefResponse"}},"totals":{"$ref":"#/components/schemas/ResourceTotalsResponse"}},"required":["activeVms","id","kind","members","name","totals"]},"HistoryEntry":{"type":"object","properties":{"requestId":{"type":"integer","format":"int64"},"submittedAt":{"type":"string","format":"date-time"},"status":{"$ref":"#/components/schemas/VmRequestStatus"},"decision":{"anyOf":[{"$ref":"#/components/schemas/ReviewDecision"},{"type":"null"}]},"comment":{"type":["string","null"]},"reviewerName":{"type":["string","null"]}},"required":["requestId","status","submittedAt"]},"MemberBrief":{"type":"object","properties":{"userId":{"type":"integer","format":"int64"},"name":{"type":"string"},"role":{"$ref":"#/components/schemas/GroupMemberRole"}},"required":["name","role","userId"]},"OrgHeadroom":{"type":"object","properties":{"allocated":{"$ref":"#/components/schemas/ResourceTotalsResponse"},"capacity":{"$ref":"#/components/schemas/Capacity"},"vcpuOvercommitRatio":{"type":"number","format":"double"},"memoryUsageRatio":{"type":"number","format":"double"},"warnings":{"type":"array","items":{"type":"string"}}},"required":["allocated","capacity","memoryUsageRatio","vcpuOvercommitRatio","warnings"]},"ResourceTotalsResponse":{"type":"object","properties":{"vcpu":{"type":"integer","format":"int32"},"memoryMb":{"type":"integer","format":"int64"},"diskGb":{"type":"integer","format":"int64"}},"required":["diskGb","memoryMb","vcpu"]},"Resources":{"type":"object","properties":{"activeVms":{"type":"array","items":{"$ref":"#/components/schemas/VmBriefResponse"}},"totals":{"$ref":"#/components/schemas/ResourceTotalsResponse"}},"required":["activeVms","totals"]},"VmBriefResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"status":{"$ref":"#/components/schemas/VmStatus"},"vcpu":{"type":"integer","format":"int32"},"memoryMb":{"type":"integer","format":"int32"},"diskGb":{"type":"integer","format":"int32"},"endDate":{"type":["string","null"],"format":"date"}},"required":["diskGb","id","memoryMb","name","status","vcpu"]},"PageResponseUserAdminViewResponse":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/UserAdminViewResponse"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"UserAdminViewResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"email":{"type":"string"},"name":{"type":"string"},"role":{"$ref":"#/components/schemas/UserRole"},"orgId":{"type":["integer","null"],"format":"int64"},"status":{"$ref":"#/components/schemas/UserStatus"},"mfaEnabled":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}},"required":["createdAt","email","id","mfaEnabled","name","role","status"]},"TerminalSessionView":{"type":"object","properties":{"sessionId":{"type":"string"},"vmId":{"type":"integer","format":"int64"},"vmName":{"type":"string"},"orgId":{"type":"integer","format":"int64"},"orgName":{"type":"string"},"groupName":{"type":"string"},"userId":{"type":"integer","format":"int64"},"userEmail":{"type":"string"},"userName":{"type":"string"},"clientIp":{"type":"string"},"startedAt":{"type":"string","format":"date-time"}},"required":["clientIp","groupName","orgId","orgName","sessionId","startedAt","userEmail","userId","userName","vmId","vmName"]},"AdminTaskResponse":{"type":"object","properties":{"taskId":{"type":"integer","format":"int64"},"vmId":{"type":"integer","format":"int64"},"vmName":{"type":["string","null"]},"hostname":{"type":["string","null"]},"orgId":{"type":["integer","null"],"format":"int64"},"orgName":{"type":["string","null"]},"groupName":{"type":["string","null"]},"kind":{"$ref":"#/components/schemas/ProvisioningTaskKind"},"status":{"$ref":"#/components/schemas/ProvisioningTaskStatus"},"currentStep":{"type":"integer","format":"int32"},"totalSteps":{"type":"integer","format":"int32"},"stepLabel":{"type":"string"},"attempts":{"type":"integer","format":"int32"},"lastError":{"type":["string","null"]},"jobrunrJobId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["attempts","createdAt","currentStep","kind","status","stepLabel","taskId","totalSteps","updatedAt","vmId"]},"PageResponseAdminTaskResponse":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/AdminTaskResponse"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"IpPoolUsage":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"cidr":{"type":"string"},"allocatedCount":{"type":"integer","format":"int64"},"freeCount":{"type":"integer","format":"int64"}},"required":["allocatedCount","cidr","freeCount","id","name"]},"NodeRatio":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"status":{"$ref":"#/components/schemas/NodeStatus"},"cpuOvercommitRatio":{"type":"number","format":"double"},"memoryAllocRatio":{"type":"number","format":"double"},"warn":{"type":"boolean"}},"required":["cpuOvercommitRatio","id","memoryAllocRatio","name","status","warn"]},"SystemDashboardSummaryResponse":{"type":"object","properties":{"nodes":{"type":"array","items":{"$ref":"#/components/schemas/NodeRatio"}},"vmCountsByStatus":{"type":"object","additionalProperties":{"type":"integer","format":"int64"}},"tasks":{"$ref":"#/components/schemas/Tasks"},"notificationFailureCount":{"type":"integer","format":"int64"},"certExpiring30dCount":{"type":"integer","format":"int64"},"openDriftFindingCount":{"type":"integer","format":"int64"},"sshPasswordEnabledVmCount":{"type":"integer","format":"int64"},"ipPools":{"type":"array","items":{"$ref":"#/components/schemas/IpPoolUsage"}}},"required":["certExpiring30dCount","ipPools","nodes","notificationFailureCount","openDriftFindingCount","sshPasswordEnabledVmCount","tasks","vmCountsByStatus"]},"Tasks":{"type":"object","properties":{"runningCount":{"type":"integer","format":"int64"},"retryingCount":{"type":"integer","format":"int64"},"needsAdminCount":{"type":"integer","format":"int64"},"failed24hCount":{"type":"integer","format":"int64"}},"required":["failed24hCount","needsAdminCount","retryingCount","runningCount"]},"Attention":{"type":"object","properties":{"failedTaskCount":{"type":"integer","format":"int64"},"needsAdminVmCount":{"type":"integer","format":"int64"},"expiredVmCount":{"type":"integer","format":"int64"}},"required":["expiredVmCount","failedTaskCount","needsAdminVmCount"]},"OrgDashboardSummaryResponse":{"type":"object","properties":{"pendingRequestCount":{"type":"integer","format":"int64"},"recentDecisions14d":{"$ref":"#/components/schemas/RecentDecisions"},"vmCountsByStatus":{"type":"object","additionalProperties":{"type":"integer","format":"int64"}},"resource":{"$ref":"#/components/schemas/Resource"},"topGroupsByVmCount":{"type":"array","items":{"$ref":"#/components/schemas/TopGroup"}},"publishedServiceCount":{"type":"integer","format":"int64"},"expiringVmCount30d":{"type":"integer","format":"int64"},"attention":{"$ref":"#/components/schemas/Attention"}},"required":["attention","expiringVmCount30d","pendingRequestCount","publishedServiceCount","recentDecisions14d","resource","topGroupsByVmCount","vmCountsByStatus"]},"RecentDecisions":{"type":"object","properties":{"approvedCount":{"type":"integer","format":"int64"},"rejectedCount":{"type":"integer","format":"int64"}},"required":["approvedCount","rejectedCount"]},"Resource":{"type":"object","properties":{"allocatedVcpu":{"type":"integer","format":"int64"},"allocatedMemoryMb":{"type":"integer","format":"int64"},"allocatedDiskGb":{"type":"integer","format":"int64"},"capacityVcpu":{"type":["integer","null"],"format":"int64"},"capacityMemoryMb":{"type":["integer","null"],"format":"int64"},"guidance":{"type":"string"}},"required":["allocatedDiskGb","allocatedMemoryMb","allocatedVcpu","guidance"]},"TopGroup":{"type":"object","properties":{"groupId":{"type":"integer","format":"int64"},"name":{"type":"string"},"vmCount":{"type":"integer","format":"int64"}},"required":["groupId","name","vmCount"]},"AdminRouteView":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"domainId":{"type":"integer","format":"int64"},"fqdn":{"type":"string"},"domainKind":{"$ref":"#/components/schemas/DomainKind"},"vmId":{"type":"integer","format":"int64"},"vmName":{"type":"string"},"groupId":{"type":"integer","format":"int64"},"groupName":{"type":"string"},"orgId":{"type":"integer","format":"int64"},"orgName":{"type":"string"},"targetPort":{"type":"integer","format":"int32"},"protocol":{"type":"string"},"status":{"$ref":"#/components/schemas/RouteStatus"},"appliedGeneration":{"type":["integer","null"],"format":"int64"},"appliedAt":{"type":["string","null"],"format":"date-time"},"lastError":{"type":["string","null"]},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["domainId","domainKind","fqdn","groupId","groupName","id","orgId","orgName","protocol","status","targetPort","vmId","vmName"]},"PageResponseAdminRouteView":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/AdminRouteView"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"AdminRelayView":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"publicHost":{"type":["string","null"],"description":"사용자 접속용 공개 호스트 (설정 전이면 null)"},"bandStart":{"type":"integer","format":"int32","description":"공개 포트 대역 시작"},"bandEnd":{"type":"integer","format":"int32","description":"공개 포트 대역 끝"},"enabled":{"type":"boolean"},"tokenIssued":{"type":"boolean","description":"동기화 토큰 발급 여부 (미발급이면 에이전트 인증이 항상 실패)"},"mappingGeneration":{"type":"integer","format":"int64","description":"현재 매핑 세대 (매핑 변경마다 증가)"},"appliedGeneration":{"type":"integer","format":"int64","description":"에이전트가 적용을 확인한 마지막 세대"},"lastContactAt":{"type":["string","null"],"format":"date-time"},"contactLost":{"type":"boolean","description":"접촉 두절 여부 (마지막 동기화가 폴링 주기 3배를 초과)"},"agentVersion":{"type":["string","null"]},"lastError":{"type":["string","null"],"description":"에이전트가 보고한 마지막 적용 오류(JSON, 정화됨). 없으면 null"},"mappingCount":{"type":"integer","format":"int64","description":"이 릴레이의 매핑 수"},"bandUsagePercent":{"type":"integer","format":"int32","description":"공개 포트 대역 사용률(%)"}},"required":["appliedGeneration","bandEnd","bandStart","bandUsagePercent","contactLost","enabled","id","mappingCount","mappingGeneration","name","tokenIssued"]},"PageResponseAdminPortMappingResponse":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/AdminPortMappingResponse"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"NotificationStatus":{"type":"string","enum":["PENDING","SENT","FAILED","SKIPPED"]},"AdminNotificationResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"event":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"},"linkPath":{"type":["string","null"]},"importance":{"$ref":"#/components/schemas/NotificationImportance"},"createdAt":{"type":"string","format":"date-time"},"readAt":{"type":["string","null"],"format":"date-time"},"userId":{"type":"integer","format":"int64"},"userEmail":{"type":"string"},"channel":{"$ref":"#/components/schemas/NotificationChannel"},"status":{"$ref":"#/components/schemas/NotificationStatus"},"attempts":{"type":"integer","format":"int32"},"lastError":{"type":["string","null"]},"sentAt":{"type":["string","null"],"format":"date-time"}},"required":["attempts","body","channel","createdAt","event","id","importance","status","title","userEmail","userId"]},"NotificationChannel":{"type":"string","enum":["EMAIL"]},"PageResponseAdminNotificationResponse":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/AdminNotificationResponse"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"AllocationStatus":{"type":"string","enum":["ALLOCATED","RELEASED"]},"IpAllocationResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"poolId":{"type":"integer","format":"int64"},"poolName":{"type":"string"},"ip":{"type":"string"},"vmId":{"type":["integer","null"],"format":"int64"},"vmName":{"type":["string","null"]},"hostname":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/AllocationStatus"},"allocatedAt":{"type":"string","format":"date-time"},"releasedAt":{"type":["string","null"],"format":"date-time"}},"required":["allocatedAt","id","ip","poolId","poolName","status"]},"PageResponseIpAllocationResponse":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/IpAllocationResponse"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"AdminGroupOptionResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"slug":{"type":"string"},"memberCount":{"type":"integer","format":"int64"},"kind":{"$ref":"#/components/schemas/GroupKind"},"createdAt":{"type":"string","format":"date-time"}},"required":["createdAt","id","kind","memberCount","name","slug"]},"AdminGroupDetailResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"kind":{"$ref":"#/components/schemas/GroupKind"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"memberCount":{"type":"integer","format":"int64"},"vmCount":{"type":"integer","format":"int64"},"members":{"type":"array","items":{"$ref":"#/components/schemas/AdminGroupMemberResponse"}}},"required":["createdAt","id","kind","memberCount","members","name","slug","vmCount"]},"AdminGroupMemberResponse":{"type":"object","properties":{"userId":{"type":"integer","format":"int64"},"name":{"type":"string"},"email":{"type":"string"},"groupRole":{"$ref":"#/components/schemas/GroupMemberRole"},"userStatus":{"$ref":"#/components/schemas/UserStatus"},"joinedAt":{"type":"string","format":"date-time"}},"required":["email","groupRole","joinedAt","name","userId","userStatus"]},"PageResponseDriftFindingResponse":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/DriftFindingResponse"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"AdminDomainView":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"vmId":{"type":"integer","format":"int64"},"kind":{"$ref":"#/components/schemas/DomainKind"},"fqdn":{"type":"string"},"rootDomain":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/DomainStatus"},"verifiedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"vmName":{"type":"string"},"groupId":{"type":"integer","format":"int64"},"groupName":{"type":"string"},"orgId":{"type":"integer","format":"int64"},"orgName":{"type":"string"},"routeStatus":{"anyOf":[{"$ref":"#/components/schemas/RouteStatus"},{"type":"null"}]},"certificateStatus":{"anyOf":[{"$ref":"#/components/schemas/CertificateStatus"},{"type":"null"}]},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["createdAt","fqdn","groupId","groupName","id","kind","orgId","orgName","status","vmId","vmName"]},"PageResponseAdminDomainView":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/AdminDomainView"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"AdminCertificateView":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"kind":{"$ref":"#/components/schemas/CertificateKind"},"status":{"$ref":"#/components/schemas/CertificateStatus"},"scope":{"type":"string"},"domainId":{"type":["integer","null"],"format":"int64"},"notAfter":{"type":["string","null"],"format":"date-time"},"daysUntilExpiry":{"type":["integer","null"],"format":"int32"},"lastError":{"type":["string","null"]}},"required":["id","kind","scope","status"]},"PageResponseAdminCertificateView":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/AdminCertificateView"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"PageResponseAdminCampusIpRequestView":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/AdminCampusIpRequestView"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"AuditLogViewResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"actorId":{"type":["integer","null"],"format":"int64"},"actorEmail":{"type":["string","null"]},"actorName":{"type":["string","null"]},"actorRole":{"type":["string","null"]},"action":{"type":"string"},"targetType":{"type":["string","null"]},"targetId":{"type":["string","null"]},"detail":{},"ip":{"type":["string","null"]},"orgName":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}},"required":["action","createdAt","id"]},"PageResponseAuditLogViewResponse":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/AuditLogViewResponse"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"PageResponseAnnouncementView":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/AnnouncementView"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"}},"required":["content","page","size","totalElements","totalPages"]},"FieldValidationError":{"type":"object","description":"검증 실패 필드 한 건 (422 응답의 errors[] 원소)","properties":{"field":{"type":"string","description":"실패한 요청 필드 이름"},"message":{"type":"string","description":"한국어 오류 메시지"}},"required":["field","message"]},"Problem":{"type":"object","description":"RFC 9457 오류 응답 + Pickle 확장(code, errors). 모든 비정상 응답은 이 형태로 반환됩니다.","properties":{"type":{"type":"string","description":"문제 유형 URI (기본 about:blank)"},"title":{"type":"string","description":"사람이 읽는 짧은 제목"},"status":{"type":"integer","format":"int32","description":"HTTP 상태 코드"},"detail":{"type":"string","description":"이 발생 건에 대한 설명"},"instance":{"type":"string","description":"발생 경로"},"code":{"type":"string","description":"기계 판독용 안정 오류 코드 (클라이언트 분기 기준)"},"errors":{"type":"array","description":"검증 실패 상세 (422에서만 존재)","items":{"$ref":"#/components/schemas/FieldValidationError"}}},"required":["title","status","code"]}},"securitySchemes":{"bearerAuth":{"type":"http","description":"액세스 토큰 (JWT HS256, 15분 만료). 클레임: sub, role, org_id, token_version. 비밀번호 변경·계정 비활성화 시 token_version이 올라가 기존 토큰이 즉시 무효화됩니다. 리프레시 토큰은 보안 스킴이 아니라 __Host-pickle_refresh httpOnly 쿠키로만 오갑니다.","scheme":"bearer","bearerFormat":"JWT"}}}}