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
|
# Byte-compiled / optimized / DLL files
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.py[cod]
|
*.py[cod]
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
from fastapi import APIRouter, Depends, UploadFile, Form
|
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.dependencies.auth import get_current_user
|
||||||
|
from src.services.courses.elements.video import create_video_element
|
||||||
|
|
||||||
router = APIRouter()
|
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)
|
return await get_element(element_id, current_user=current_user)
|
||||||
|
|
||||||
|
|
||||||
@router.get("/coursechapter/{coursechapter_id}")
|
@router.get("/coursechapter/{coursechapter_id}")
|
||||||
async def api_get_elements(coursechapter_id: str, current_user: PublicUser = Depends(get_current_user)):
|
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)
|
return await get_elements(coursechapter_id, current_user)
|
||||||
|
|
||||||
|
|
||||||
@router.put("/{element_id}")
|
@router.put("/{element_id}")
|
||||||
async def api_update_element(element_object: Element, element_id: str, current_user: PublicUser = Depends(get_current_user)):
|
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)
|
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 uuid import uuid4
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from src.services.courses.courses import Course, CourseInDB
|
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.database import create_config_collection, check_database, create_database, learnhouseDB, learnhouseDB
|
||||||
from src.services.security import verify_user_rights_with_roles
|
from src.services.security import verify_user_rights_with_roles
|
||||||
from src.services.users import PublicUser
|
from src.services.users import PublicUser
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ import os
|
||||||
from typing import List
|
from typing import List
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
from pydantic import BaseModel
|
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.uploads import upload_thumbnail
|
||||||
from src.services.users import PublicUser, User
|
from src.services.users import PublicUser, User
|
||||||
from src.services.database import create_config_collection, check_database, create_database, learnhouseDB
|
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):
|
async def upload_thumbnail(thumbnail_file, name_in_disk):
|
||||||
contents = thumbnail_file.file.read()
|
contents = thumbnail_file.file.read()
|
||||||
try:
|
try:
|
||||||
|
|
@ -10,3 +13,21 @@ async def upload_thumbnail(thumbnail_file, name_in_disk):
|
||||||
return {"message": "There was an error uploading the file"}
|
return {"message": "There was an error uploading the file"}
|
||||||
finally:
|
finally:
|
||||||
thumbnail_file.file.close()
|
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