ge-tool/backend/routes/custom_paths_routes.py

226 lines
6.5 KiB
Python
Raw Normal View History

2025-12-10 06:41:43 +00:00
"""
Custom Paths Routes - Manage user-defined folder shortcuts for sharing links
"""
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from typing import Optional
import logging
from ..services import supabase_service
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/custom-paths", tags=["Custom Paths"])
# ==================== REQUEST MODELS ====================
class CustomPathCreate(BaseModel):
ge_id: str
lang: str
custom_path: str
class CustomPathUpdate(BaseModel):
custom_path: str
# ==================== ROUTES ====================
@router.get('')
def list_all_custom_paths():
"""
Get all custom paths, sorted by ge_id ascending.
Returns:
{
"success": true,
"custom_paths": [
{
"ge_id": "1000",
"lang": "DE",
"custom_path": "/folder/subfolder",
"created_at": "...",
"updated_at": "..."
},
...
],
"total": 10
}
"""
try:
client = supabase_service.get_supabase_client()
# Query all custom paths, ordered by ge_id ASC
response = client.table("custom_paths").select(
"*").order("ge_id", desc=False).execute()
return {
"success": True,
"custom_paths": response.data or [],
"total": len(response.data) if response.data else 0
}
except Exception as e:
logger.error(f"Error listing custom paths: {e}")
raise HTTPException(status_code=500, detail=f"Lỗi hệ thống: {e}")
@router.get('/{ge_id}')
def get_custom_path(ge_id: str, lang: Optional[str] = None):
"""
Get custom path for a specific GE ID.
Query params:
lang: Optional language filter
Returns:
{
"success": true,
"custom_path": "/folder/subfolder",
"ge_id": "1000",
"lang": "DE"
}
"""
try:
client = supabase_service.get_supabase_client()
# Query with ge_id
query = client.table("custom_paths").select("*").eq("ge_id", ge_id)
# Add lang filter if provided
if lang:
query = query.eq("lang", lang.upper())
response = query.execute()
if not response.data or len(response.data) == 0:
return {
"success": True,
"custom_path": None,
"exists": False
}
record = response.data[0] # type: ignore
return {
"success": True,
"custom_path": record.get("custom_path") if isinstance(record, dict) else None,
"ge_id": record.get("ge_id") if isinstance(record, dict) else None,
"lang": record.get("lang") if isinstance(record, dict) else None,
"exists": True,
"created_at": record.get("created_at") if isinstance(record, dict) else None,
"updated_at": record.get("updated_at") if isinstance(record, dict) else None
}
except Exception as e:
logger.error(f"Error getting custom path: {e}")
raise HTTPException(status_code=500, detail=f"Lỗi hệ thống: {e}")
@router.post('')
def create_or_update_custom_path(payload: CustomPathCreate):
"""
Create or update custom path for a GE ID.
Uses UPSERT logic (insert or update if exists).
Body:
{
"ge_id": "1000",
"lang": "DE",
"custom_path": "/folder/subfolder"
}
Returns:
{
"success": true,
"message": "Custom path saved",
"is_new": true/false
}
"""
try:
# Validate input
if not payload.ge_id or not payload.lang or not payload.custom_path:
raise HTTPException(
status_code=400, detail="Thiếu thông tin: ge_id, lang, hoặc custom_path")
client = supabase_service.get_supabase_client()
# Check if exists
existing = client.table("custom_paths").select(
"*").eq("ge_id", payload.ge_id).execute()
is_new = not existing.data or len(existing.data) == 0
# Prepare data
data = {
"ge_id": payload.ge_id,
"lang": payload.lang.upper(),
"custom_path": payload.custom_path,
"updated_at": "NOW()"
}
if is_new:
# Insert new record
response = client.table("custom_paths").insert(data).execute()
message = "Custom path đã được thêm"
else:
# Update existing record
response = client.table("custom_paths").update(
data).eq("ge_id", payload.ge_id).execute()
message = "Custom path đã được cập nhật"
logger.debug(
f"{'Created' if is_new else 'Updated'} custom path for {payload.ge_id} {payload.lang}: {payload.custom_path}")
return {
"success": True,
"message": message,
"is_new": is_new,
"custom_path": payload.custom_path
}
except HTTPException:
raise
except Exception as e:
logger.error(f"Error saving custom path: {e}")
raise HTTPException(status_code=500, detail=f"Lỗi hệ thống: {e}")
@router.delete('/{ge_id}')
def delete_custom_path(ge_id: str):
"""
Delete custom path for a GE ID.
Returns:
{
"success": true,
"message": "Custom path deleted"
}
"""
try:
client = supabase_service.get_supabase_client()
# Check if exists
existing = client.table("custom_paths").select(
"*").eq("ge_id", ge_id).execute()
if not existing.data or len(existing.data) == 0:
raise HTTPException(
status_code=404, detail="Custom path không tồn tại")
# Delete
client.table("custom_paths").delete().eq("ge_id", ge_id).execute()
logger.debug(f"Deleted custom path for {ge_id}")
return {
"success": True,
"message": "Custom path đã được xóa"
}
except HTTPException:
raise
except Exception as e:
logger.error(f"Error deleting custom path: {e}")
raise HTTPException(status_code=500, detail=f"Lỗi hệ thống: {e}")