166 lines
4.9 KiB
Python
166 lines
4.9 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlalchemy.orm import Session
|
|
from typing import List
|
|
|
|
from database import get_db
|
|
from models.global_settings import GlobalSettings
|
|
from schemas.global_settings import (
|
|
GlobalSetting,
|
|
GlobalSettingCreate,
|
|
GlobalSettingUpdate,
|
|
UploadLimitResponse,
|
|
UploadLimitUpdate
|
|
)
|
|
from utils.auth import get_current_user, require_admin_permission
|
|
from models.user import User
|
|
|
|
router = APIRouter(prefix="/settings", tags=["settings"])
|
|
|
|
# Default upload limit in MB (1GB)
|
|
DEFAULT_UPLOAD_LIMIT_MB = 1000
|
|
UPLOAD_LIMIT_KEY = "global_upload_limit_mb"
|
|
|
|
|
|
def get_or_create_upload_limit_setting(db: Session) -> GlobalSettings:
|
|
"""Get or create the upload limit setting with default value"""
|
|
setting = db.query(GlobalSettings).filter(
|
|
GlobalSettings.setting_key == UPLOAD_LIMIT_KEY
|
|
).first()
|
|
|
|
if not setting:
|
|
setting = GlobalSettings(
|
|
setting_key=UPLOAD_LIMIT_KEY,
|
|
setting_value=str(DEFAULT_UPLOAD_LIMIT_MB),
|
|
description="Global upload size limit for movie files in MB"
|
|
)
|
|
db.add(setting)
|
|
db.commit()
|
|
db.refresh(setting)
|
|
|
|
return setting
|
|
|
|
|
|
@router.get("/upload-limit", response_model=UploadLimitResponse)
|
|
async def get_upload_limit(
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(get_current_user)
|
|
):
|
|
"""Get the global upload size limit for movie files"""
|
|
setting = get_or_create_upload_limit_setting(db)
|
|
|
|
return UploadLimitResponse(
|
|
upload_limit_mb=int(setting.setting_value),
|
|
description=setting.description or "Global upload size limit for movie files"
|
|
)
|
|
|
|
|
|
@router.put("/upload-limit", response_model=UploadLimitResponse)
|
|
async def update_upload_limit(
|
|
upload_limit: UploadLimitUpdate,
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(require_admin_permission)
|
|
):
|
|
"""Update the global upload size limit for movie files (admin only)"""
|
|
setting = get_or_create_upload_limit_setting(db)
|
|
|
|
setting.setting_value = str(upload_limit.upload_limit_mb)
|
|
db.commit()
|
|
db.refresh(setting)
|
|
|
|
return UploadLimitResponse(
|
|
upload_limit_mb=int(setting.setting_value),
|
|
description=setting.description or "Global upload size limit for movie files"
|
|
)
|
|
|
|
|
|
@router.get("/", response_model=List[GlobalSetting])
|
|
async def get_all_settings(
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(require_admin_permission)
|
|
):
|
|
"""Get all global settings (admin only)"""
|
|
settings = db.query(GlobalSettings).all()
|
|
return settings
|
|
|
|
|
|
@router.post("/", response_model=GlobalSetting)
|
|
async def create_setting(
|
|
setting: GlobalSettingCreate,
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(require_admin_permission)
|
|
):
|
|
"""Create a new global setting (admin only)"""
|
|
# Check if setting already exists
|
|
existing = db.query(GlobalSettings).filter(
|
|
GlobalSettings.setting_key == setting.setting_key
|
|
).first()
|
|
|
|
if existing:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail=f"Setting with key '{setting.setting_key}' already exists"
|
|
)
|
|
|
|
db_setting = GlobalSettings(**setting.dict())
|
|
db.add(db_setting)
|
|
db.commit()
|
|
db.refresh(db_setting)
|
|
|
|
return db_setting
|
|
|
|
|
|
@router.put("/{setting_key}", response_model=GlobalSetting)
|
|
async def update_setting(
|
|
setting_key: str,
|
|
setting_update: GlobalSettingUpdate,
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(require_admin_permission)
|
|
):
|
|
"""Update a specific global setting (admin only)"""
|
|
setting = db.query(GlobalSettings).filter(
|
|
GlobalSettings.setting_key == setting_key
|
|
).first()
|
|
|
|
if not setting:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail=f"Setting with key '{setting_key}' not found"
|
|
)
|
|
|
|
for field, value in setting_update.dict(exclude_unset=True).items():
|
|
setattr(setting, field, value)
|
|
|
|
db.commit()
|
|
db.refresh(setting)
|
|
|
|
return setting
|
|
|
|
|
|
@router.delete("/{setting_key}")
|
|
async def delete_setting(
|
|
setting_key: str,
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(require_admin_permission)
|
|
):
|
|
"""Delete a global setting (admin only)"""
|
|
setting = db.query(GlobalSettings).filter(
|
|
GlobalSettings.setting_key == setting_key
|
|
).first()
|
|
|
|
if not setting:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail=f"Setting with key '{setting_key}' not found"
|
|
)
|
|
|
|
# Prevent deletion of critical settings
|
|
if setting_key == UPLOAD_LIMIT_KEY:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail="Cannot delete the global upload limit setting"
|
|
)
|
|
|
|
db.delete(setting)
|
|
db.commit()
|
|
|
|
return {"message": f"Setting '{setting_key}' deleted successfully"} |