226 lines
6.5 KiB
Python
226 lines
6.5 KiB
Python
|
|
"""
|
||
|
|
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}")
|