56 lines
2.0 KiB
Python
56 lines
2.0 KiB
Python
|
|
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"],
|
||
|
|
)
|
||
|
|
|
||
|
|
@router.get("/files", response_model=List[FileOut])
|
||
|
|
async def search_files(
|
||
|
|
q: str = Query(..., min_length=1, description="Search query"),
|
||
|
|
file_type: Optional[str] = Query(None, description="Filter by MIME type prefix (e.g., 'image', 'video')"),
|
||
|
|
min_size: Optional[int] = Query(None, description="Minimum file size in bytes"),
|
||
|
|
max_size: Optional[int] = Query(None, description="Maximum file size in bytes"),
|
||
|
|
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)
|
||
|
|
):
|
||
|
|
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]
|
||
|
|
|
||
|
|
@router.get("/folders", response_model=List[FolderOut])
|
||
|
|
async def search_folders(
|
||
|
|
q: str = Query(..., min_length=1, description="Search query"),
|
||
|
|
current_user: User = Depends(get_current_user)
|
||
|
|
):
|
||
|
|
folders = await Folder.filter(
|
||
|
|
owner=current_user,
|
||
|
|
is_deleted=False,
|
||
|
|
name__icontains=q
|
||
|
|
).order_by("-created_at").limit(100)
|
||
|
|
|
||
|
|
return [await FolderOut.from_tortoise_orm(folder) for folder in folders]
|