mirror of
https://github.com/rzmk/learnhouse.git
synced 2025-12-19 04:19:25 +00:00
feat: backend create & upload video
This commit is contained in:
parent
cc9397ca5f
commit
42d74aebde
8 changed files with 103 additions and 15 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -1,3 +1,4 @@
|
|||
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
from fastapi import APIRouter, Depends, UploadFile, Form
|
||||
from src.services.courses.elements import *
|
||||
from src.services.courses.elements.elements import *
|
||||
from src.dependencies.auth import get_current_user
|
||||
from src.services.courses.elements.video import create_video_element
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
|
@ -20,6 +21,7 @@ async def api_get_element(element_id: str, current_user: PublicUser = Depends(ge
|
|||
"""
|
||||
return await get_element(element_id, current_user=current_user)
|
||||
|
||||
|
||||
@router.get("/coursechapter/{coursechapter_id}")
|
||||
async def api_get_elements(coursechapter_id: str, current_user: PublicUser = Depends(get_current_user)):
|
||||
"""
|
||||
|
|
@ -27,6 +29,7 @@ async def api_get_elements(coursechapter_id: str, current_user: PublicUser = Dep
|
|||
"""
|
||||
return await get_elements(coursechapter_id, current_user)
|
||||
|
||||
|
||||
@router.put("/{element_id}")
|
||||
async def api_update_element(element_object: Element, element_id: str, current_user: PublicUser = Depends(get_current_user)):
|
||||
"""
|
||||
|
|
@ -42,4 +45,12 @@ async def api_delete_element(element_id: str, current_user: PublicUser = Depends
|
|||
"""
|
||||
return await delete_element(element_id, current_user)
|
||||
|
||||
# Video Element
|
||||
|
||||
|
||||
@router.post("/video")
|
||||
async def api_create_video_element(name: str = Form() , coursechapter_id: str = Form(), current_user: PublicUser = Depends(get_current_user), video_file: UploadFile | None = None):
|
||||
"""
|
||||
Create new Element
|
||||
"""
|
||||
return await create_video_element(name, coursechapter_id, current_user, video_file)
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ from typing import List
|
|||
from uuid import uuid4
|
||||
from pydantic import BaseModel
|
||||
from src.services.courses.courses import Course, CourseInDB
|
||||
from src.services.courses.elements import Element, ElementInDB
|
||||
from src.services.courses.elements.elements import Element, ElementInDB
|
||||
from src.services.database import create_config_collection, check_database, create_database, learnhouseDB, learnhouseDB
|
||||
from src.services.security import verify_user_rights_with_roles
|
||||
from src.services.users import PublicUser
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import os
|
|||
from typing import List
|
||||
from uuid import uuid4
|
||||
from pydantic import BaseModel
|
||||
from src.services.courses.elements import ElementInDB
|
||||
from src.services.courses.elements.elements import ElementInDB
|
||||
from src.services.uploads import upload_thumbnail
|
||||
from src.services.users import PublicUser, User
|
||||
from src.services.database import create_config_collection, check_database, create_database, learnhouseDB
|
||||
|
|
|
|||
55
src/services/courses/elements/video.py
Normal file
55
src/services/courses/elements/video.py
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
from pydantic import BaseModel
|
||||
from src.services.database import create_config_collection, check_database, create_database, learnhouseDB
|
||||
from src.services.security import verify_user_rights_with_roles
|
||||
from src.services.uploads import upload_video
|
||||
from src.services.users import PublicUser, User
|
||||
from src.services.courses.elements.elements import ElementInDB, Element
|
||||
from fastapi import FastAPI, HTTPException, status, Request, Response, BackgroundTasks, UploadFile, File
|
||||
from uuid import uuid4
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
async def create_video_element(name: str, coursechapter_id: str, current_user: PublicUser, video_file: UploadFile | None = None):
|
||||
await check_database()
|
||||
elements = learnhouseDB["elements"]
|
||||
coursechapters = learnhouseDB["coursechapters"]
|
||||
|
||||
# generate element_id
|
||||
element_id = str(f"element_{uuid4()}")
|
||||
|
||||
element_object = ElementInDB(
|
||||
element_id=element_id,
|
||||
coursechapter_id=coursechapter_id,
|
||||
name=name,
|
||||
type="video",
|
||||
content={
|
||||
"video": {
|
||||
"filename": video_file.filename,
|
||||
"element_id": element_id,
|
||||
}
|
||||
},
|
||||
creationDate=str(datetime.now()),
|
||||
updateDate=str(datetime.now()),
|
||||
)
|
||||
|
||||
hasRoleRights = await verify_user_rights_with_roles("create", current_user.user_id, element_id)
|
||||
|
||||
if not hasRoleRights:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_409_CONFLICT, detail="Roles : Insufficient rights to perform this action")
|
||||
|
||||
# create element
|
||||
element = ElementInDB(**element_object.dict())
|
||||
elements.insert_one(element.dict())
|
||||
|
||||
# upload video
|
||||
if video_file:
|
||||
print("uploading video")
|
||||
await upload_video(video_file, video_file.filename, element_id)
|
||||
|
||||
# todo : choose whether to update the chapter or not
|
||||
# update chapter
|
||||
coursechapters.update_one({"coursechapter_id": coursechapter_id}, {
|
||||
"$addToSet": {"elements": element_id}})
|
||||
|
||||
return element
|
||||
|
|
@ -1,3 +1,6 @@
|
|||
import os
|
||||
|
||||
|
||||
async def upload_thumbnail(thumbnail_file, name_in_disk):
|
||||
contents = thumbnail_file.file.read()
|
||||
try:
|
||||
|
|
@ -10,3 +13,21 @@ async def upload_thumbnail(thumbnail_file, name_in_disk):
|
|||
return {"message": "There was an error uploading the file"}
|
||||
finally:
|
||||
thumbnail_file.file.close()
|
||||
|
||||
|
||||
async def upload_video(video_file, name_in_disk, element_id):
|
||||
contents = video_file.file.read()
|
||||
|
||||
# create folder
|
||||
os.mkdir(f"content/uploads/video/{element_id}")
|
||||
|
||||
try:
|
||||
with open(f"content/uploads/video/{element_id}/{name_in_disk}", 'wb') as f:
|
||||
f.write(contents)
|
||||
f.close()
|
||||
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return {"message": "There was an error uploading the file"}
|
||||
finally:
|
||||
video_file.file.close()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue