2025-11-09 23:29:07 +01:00
|
|
|
from fastapi import APIRouter, Depends, Query
|
|
|
|
|
from typing import List, Optional
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
|
|
from ..auth import get_current_user
|
|
|
|
|
from ..models import User, File, Folder
|
|
|
|
|
from ..schemas import FileOut, FolderOut
|
|
|
|
|
|
|
|
|
|
router = APIRouter(
|
|
|
|
|
prefix="/search",
|
|
|
|
|
tags=["search"],
|
|
|
|
|
)
|
|
|
|
|
|
2025-11-13 23:22:05 +01:00
|
|
|
|
2025-11-09 23:29:07 +01:00
|
|
|
@router.get("/files", response_model=List[FileOut])
|
|
|
|
|
async def search_files(
|
|
|
|
|
q: str = Query(..., min_length=1, description="Search query"),
|
2025-11-13 23:22:05 +01:00
|
|
|
file_type: Optional[str] = Query(
|
|
|
|
|
None, description="Filter by MIME type prefix (e.g., 'image', 'video')"
|
|
|
|
|
),
|
2025-11-09 23:29:07 +01:00
|
|
|
min_size: Optional[int] = Query(None, description="Minimum file size in bytes"),
|
|
|
|
|
max_size: Optional[int] = Query(None, description="Maximum file size in bytes"),
|
2025-11-13 23:22:05 +01:00
|
|
|
date_from: Optional[datetime] = Query(
|
|
|
|
|
None, description="Filter files created after this date"
|
|
|
|
|
),
|
|
|
|
|
date_to: Optional[datetime] = Query(
|
|
|
|
|
None, description="Filter files created before this date"
|
|
|
|
|
),
|
|
|
|
|
current_user: User = Depends(get_current_user),
|
2025-11-09 23:29:07 +01:00
|
|
|
):
|
|
|
|
|
query = File.filter(owner=current_user, is_deleted=False, name__icontains=q)
|
|
|
|
|
|
|
|
|
|
if file_type:
|
|
|
|
|
query = query.filter(mime_type__istartswith=file_type)
|
|
|
|
|
|
|
|
|
|
if min_size is not None:
|
|
|
|
|
query = query.filter(size__gte=min_size)
|
|
|
|
|
|
|
|
|
|
if max_size is not None:
|
|
|
|
|
query = query.filter(size__lte=max_size)
|
|
|
|
|
|
|
|
|
|
if date_from:
|
|
|
|
|
query = query.filter(created_at__gte=date_from)
|
|
|
|
|
|
|
|
|
|
if date_to:
|
|
|
|
|
query = query.filter(created_at__lte=date_to)
|
|
|
|
|
|
|
|
|
|
files = await query.order_by("-created_at").limit(100)
|
|
|
|
|
return [await FileOut.from_tortoise_orm(f) for f in files]
|
|
|
|
|
|
2025-11-13 23:22:05 +01:00
|
|
|
|
2025-11-09 23:29:07 +01:00
|
|
|
@router.get("/folders", response_model=List[FolderOut])
|
|
|
|
|
async def search_folders(
|
|
|
|
|
q: str = Query(..., min_length=1, description="Search query"),
|
2025-11-13 23:22:05 +01:00
|
|
|
current_user: User = Depends(get_current_user),
|
2025-11-09 23:29:07 +01:00
|
|
|
):
|
2025-11-13 23:22:05 +01:00
|
|
|
folders = (
|
|
|
|
|
await Folder.filter(owner=current_user, is_deleted=False, name__icontains=q)
|
|
|
|
|
.order_by("-created_at")
|
|
|
|
|
.limit(100)
|
|
|
|
|
)
|
2025-11-09 23:29:07 +01:00
|
|
|
|
|
|
|
|
return [await FolderOut.from_tortoise_orm(folder) for folder in folders]
|