Init Repo
This commit is contained in:
@@ -0,0 +1,166 @@
|
||||
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"}
|
||||
Reference in New Issue
Block a user