feat: add pdf extension to editor

This commit is contained in:
swve 2023-02-19 19:28:38 +01:00
parent 429a95c50a
commit fdcee29a0d
7 changed files with 297 additions and 6 deletions

View file

@ -1,6 +1,7 @@
from fastapi import APIRouter, Depends, UploadFile, Form, Request
from src.dependencies.auth import get_current_user
from fastapi import HTTPException, status, UploadFile
from src.services.files.documents import create_document_file, get_document_file
from src.services.files.pictures import create_picture_file, get_picture_file
from src.services.files.videos import create_video_file, get_video_file
@ -10,15 +11,15 @@ router = APIRouter()
@router.post("/picture")
async def api_create_picture_file(request: Request,file_object: UploadFile, lecture_id: str = Form(), current_user: PublicUser = Depends(get_current_user)):
async def api_create_picture_file(request: Request, file_object: UploadFile, lecture_id: str = Form(), current_user: PublicUser = Depends(get_current_user)):
"""
Create new picture file
"""
return await create_picture_file(request,file_object, lecture_id)
return await create_picture_file(request, file_object, lecture_id)
@router.post("/video")
async def api_create_video_file(request: Request,file_object: UploadFile,lecture_id: str = Form(), current_user: PublicUser = Depends(get_current_user)):
async def api_create_video_file(request: Request, file_object: UploadFile, lecture_id: str = Form(), current_user: PublicUser = Depends(get_current_user)):
"""
Create new video file
"""
@ -26,7 +27,7 @@ async def api_create_video_file(request: Request,file_object: UploadFile,lecture
@router.get("/picture")
async def api_get_picture_file(request: Request,file_id: str, current_user: PublicUser = Depends(get_current_user)):
async def api_get_picture_file(request: Request, file_id: str, current_user: PublicUser = Depends(get_current_user)):
"""
Get picture file
"""
@ -34,8 +35,24 @@ async def api_get_picture_file(request: Request,file_id: str, current_user: Publ
@router.get("/video")
async def api_get_video_file(request: Request,file_id: str, current_user: PublicUser = Depends(get_current_user)):
async def api_get_video_file(request: Request, file_id: str, current_user: PublicUser = Depends(get_current_user)):
"""
Get video file
"""
return await get_video_file(request, file_id, current_user)
@router.get("/document")
async def api_get_document_file(request: Request, file_id: str, current_user: PublicUser = Depends(get_current_user)):
"""
Get document file
"""
return await get_document_file(request, file_id, current_user)
@router.post("/document")
async def api_create_document_file(request: Request, file_object: UploadFile, lecture_id: str = Form(), current_user: PublicUser = Depends(get_current_user)):
"""
Create new document file
"""
return await create_document_file(request, file_object, lecture_id)

View file

@ -0,0 +1,112 @@
from uuid import uuid4
from pydantic import BaseModel
from fastapi import HTTPException, status, UploadFile, Request
from fastapi.responses import StreamingResponse
import os
from src.services.users import PublicUser
class DocumentFile(BaseModel):
file_id: str
file_format: str
file_name: str
file_size: int
file_type: str
lecture_id: str
async def create_document_file(request: Request, document_file: UploadFile, lecture_id: str):
documents = request.app.db["files"]
# generate file_id
file_id = str(f"file_{uuid4()}")
# get file format
file_format = document_file.filename.split(".")[-1]
# validate file format
if file_format not in ["pdf"]:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Document file format not supported")
# create file
file = await document_file.read()
# get file size
file_size = len(file)
# get file type
file_type = document_file.content_type
# get file name
file_name = document_file.filename
# create file object
uploadable_file = DocumentFile(
file_id=file_id,
file_format=file_format,
file_name=file_name,
file_size=file_size,
file_type=file_type,
lecture_id=lecture_id
)
# TODO : this is probably not working as intended
# create folder for lecture
if not os.path.exists(f"content/uploads/files/documents/{lecture_id}"):
os.mkdir(f"content/uploads/files/documents/{lecture_id}")
# upload file to server
with open(f"content/uploads/files/documents/{lecture_id}/{file_id}.{file_format}", 'wb') as f:
f.write(file)
f.close()
# insert file object into database
document_file_in_db = documents.insert_one(uploadable_file.dict())
if not document_file_in_db:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Document file could not be created")
return uploadable_file
async def get_document_object(request: Request, file_id: str):
documents = request.app.db["files"]
document_file = documents.find_one({"file_id": file_id})
if document_file:
document_file = DocumentFile(**document_file)
return document_file
else:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Document file does not exist")
async def get_document_file(request: Request, file_id: str, current_user: PublicUser):
documents = request.app.db["files"]
document_file = documents.find_one({"file_id": file_id})
# TODO : check if user has access to file
if document_file:
# check media type
if document_file.format not in ["jpg", "jpeg", "png", "gif"]:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Document file format not supported")
# stream file
document_file = DocumentFile(**document_file)
file_format = document_file.file_format
lecture_id = document_file.lecture_id
file = open(
f"content/uploads/files/documents/{lecture_id}/{file_id}.{file_format}", 'rb')
return StreamingResponse(file, media_type=document_file.file_type)
else:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Document file does not exist")