mirror of
https://github.com/rzmk/learnhouse.git
synced 2025-12-19 04:19:25 +00:00
feat: add pdf extension to editor
This commit is contained in:
parent
429a95c50a
commit
fdcee29a0d
7 changed files with 297 additions and 6 deletions
|
|
@ -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)
|
||||
|
|
|
|||
112
src/services/files/documents.py
Normal file
112
src/services/files/documents.py
Normal 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")
|
||||
Loading…
Add table
Add a link
Reference in a new issue