v0.0.29 | 사이트 설정(SiteSettings) 모델 및 API 추가
All checks were successful
Build And Test / build-and-push (push) Successful in 2m1s
All checks were successful
Build And Test / build-and-push (push) Successful in 2m1s
- Google 로그인 활성화 여부 관리 기능 - 관리자 전용 설정 수정 API - 싱글톤 패턴으로 구현 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -12,7 +12,7 @@ from django.conf import settings
|
||||
from google.oauth2 import id_token
|
||||
from google.auth.transport import requests as google_requests
|
||||
from .serializers import RegisterSerializer, CustomTokenObtainPairSerializer, UserListSerializer, KVMServerSerializer
|
||||
from .models import CustomUser, NHNCloudProject, KVMServer
|
||||
from .models import CustomUser, NHNCloudProject, KVMServer, SiteSettings
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
tracer = trace.get_tracer(__name__) # ✅ 트레이서 생성
|
||||
@ -1426,3 +1426,68 @@ class GoogleUnlinkView(APIView):
|
||||
"message": "Google 계정 연동이 해제되었습니다.",
|
||||
"social_provider": None,
|
||||
}, status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
# ============================================
|
||||
# 사이트 설정 API
|
||||
# ============================================
|
||||
|
||||
class IsAdmin(BasePermission):
|
||||
"""admin 등급만 접근 가능"""
|
||||
def has_permission(self, request, view):
|
||||
if not request.user or not request.user.is_authenticated:
|
||||
return False
|
||||
return request.user.grade == 'admin'
|
||||
|
||||
|
||||
class SiteSettingsView(APIView):
|
||||
"""
|
||||
사이트 설정 조회/수정 (관리자 전용)
|
||||
"""
|
||||
|
||||
def get_permissions(self):
|
||||
# GET은 인증된 사용자면 누구나 가능 (설정 조회)
|
||||
# PUT/PATCH는 관리자만 가능 (설정 변경)
|
||||
if self.request.method in ['PUT', 'PATCH']:
|
||||
return [IsAuthenticated(), IsAdmin()]
|
||||
return [] # GET은 누구나 가능 (비로그인 포함)
|
||||
|
||||
def get(self, request):
|
||||
"""사이트 설정 조회 (공개)"""
|
||||
with tracer.start_as_current_span("SiteSettingsView GET") as span:
|
||||
settings_obj = SiteSettings.get_settings()
|
||||
span.add_event("Site settings retrieved")
|
||||
|
||||
return Response({
|
||||
"google_login_enabled": settings_obj.google_login_enabled,
|
||||
"updated_at": settings_obj.updated_at.isoformat() if settings_obj.updated_at else None,
|
||||
})
|
||||
|
||||
def patch(self, request):
|
||||
"""사이트 설정 수정 (관리자 전용)"""
|
||||
with tracer.start_as_current_span("SiteSettingsView PATCH") as span:
|
||||
email, ip, ua = get_request_info(request)
|
||||
settings_obj = SiteSettings.get_settings()
|
||||
|
||||
# 업데이트할 필드 처리
|
||||
updated_fields = []
|
||||
|
||||
if 'google_login_enabled' in request.data:
|
||||
settings_obj.google_login_enabled = request.data['google_login_enabled']
|
||||
updated_fields.append('google_login_enabled')
|
||||
|
||||
if updated_fields:
|
||||
settings_obj.save()
|
||||
logger.info(
|
||||
f"[SITE SETTINGS UPDATE] admin={email} | fields={updated_fields} | IP={ip} | UA={ua}"
|
||||
)
|
||||
span.add_event("Site settings updated", attributes={
|
||||
"admin": email,
|
||||
"fields": str(updated_fields)
|
||||
})
|
||||
|
||||
return Response({
|
||||
"message": "설정이 저장되었습니다.",
|
||||
"google_login_enabled": settings_obj.google_login_enabled,
|
||||
"updated_at": settings_obj.updated_at.isoformat() if settings_obj.updated_at else None,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user