mirror of
https://github.com/flibusta-apps/telegram_files_server.git
synced 2025-12-06 20:45:37 +01:00
75 lines
2.1 KiB
Python
75 lines
2.1 KiB
Python
from typing import Optional
|
|
|
|
from fastapi import APIRouter, Depends, File, Form, HTTPException, UploadFile, status
|
|
from fastapi.responses import StreamingResponse
|
|
|
|
from app.depends import check_token
|
|
from app.models import UploadedFile as UploadedFileDB
|
|
from app.serializers import CreateUploadedFile, UploadedFile
|
|
from app.services.file_downloader import FileDownloader
|
|
from app.services.file_uploader import FileUploader
|
|
|
|
router = APIRouter(
|
|
prefix="/api/v1/files", dependencies=[Depends(check_token)], tags=["files"]
|
|
)
|
|
|
|
|
|
@router.get("/", response_model=list[UploadedFile])
|
|
async def get_files():
|
|
return await UploadedFileDB.objects.all()
|
|
|
|
|
|
@router.get(
|
|
"/{file_id}",
|
|
response_model=UploadedFile,
|
|
responses={
|
|
404: {},
|
|
},
|
|
)
|
|
async def get_file(file_id: int):
|
|
uploaded_file = await UploadedFileDB.objects.get_or_none(id=file_id)
|
|
|
|
if not uploaded_file:
|
|
raise HTTPException(status.HTTP_404_NOT_FOUND)
|
|
|
|
return uploaded_file
|
|
|
|
|
|
@router.post("/", response_model=UploadedFile)
|
|
async def create_file(data: CreateUploadedFile):
|
|
return await UploadedFileDB.objects.create(**data.dict())
|
|
|
|
|
|
@router.post("/upload/", response_model=UploadedFile)
|
|
async def upload_file(file: UploadFile = File({}), caption: Optional[str] = Form({})):
|
|
return await FileUploader.upload(file, caption=caption)
|
|
|
|
|
|
@router.get("/download_by_message/{chat_id}/{message_id}")
|
|
async def download_by_message(chat_id: str, message_id: int):
|
|
data = await FileDownloader.download_by_message_id(message_id)
|
|
|
|
if data is None:
|
|
raise HTTPException(status.HTTP_400_BAD_REQUEST)
|
|
|
|
return StreamingResponse(data)
|
|
|
|
|
|
@router.delete("/{file_id}", response_model=UploadedFile, responses={400: {}})
|
|
async def delete_file(file_id: int):
|
|
uploaded_file = await UploadedFileDB.objects.get_or_none(id=file_id)
|
|
|
|
if not uploaded_file:
|
|
raise HTTPException(status.HTTP_400_BAD_REQUEST)
|
|
|
|
await uploaded_file.delete()
|
|
return uploaded_file
|
|
|
|
|
|
healthcheck_router = APIRouter(tags=["healthcheck"])
|
|
|
|
|
|
@healthcheck_router.get("/healthcheck")
|
|
async def healthcheck():
|
|
return "Ok"
|