From 3581b4409f7d76f39cd11b3d294049c05108ddb6 Mon Sep 17 00:00:00 2001 From: swve Date: Fri, 14 Oct 2022 21:52:28 +0200 Subject: [PATCH] feat: add course thumbnail update & upload api --- src/routers/courses.py | 9 ++++++++- src/services/courses.py | 43 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/routers/courses.py b/src/routers/courses.py index 6ec619cb..7409d5f4 100644 --- a/src/routers/courses.py +++ b/src/routers/courses.py @@ -1,7 +1,7 @@ from fastapi import APIRouter, Depends, File, UploadFile from src.services.auth import get_current_user -from src.services.courses import Course, CourseChapter, create_course, create_coursechapter, delete_coursechapter, get_course, get_coursechapter, get_coursechapters, get_courses, update_course, delete_course, update_coursechapter +from src.services.courses import Course, CourseChapter, create_course, create_coursechapter, delete_coursechapter, get_course, get_coursechapter, get_coursechapters, get_courses, update_course, delete_course, update_course_thumbnail, update_coursechapter from src.services.users import PublicUser, User @@ -15,6 +15,13 @@ async def api_create_course(course_object: Course, org_id :str , current_user: """ return await create_course(course_object, org_id , current_user) +@router.put("/thumbnail/{course_id}") +async def api_create_course_thumbnail(course_id : str, thumbnail: UploadFile | None = None, current_user: PublicUser = Depends(get_current_user)): + """ + Create new Course Thumbnail + """ + return await update_course_thumbnail(course_id, current_user, thumbnail) + @router.get("/{course_id}") async def api_get_course(course_id: str, org_id : str, current_user: PublicUser = Depends(get_current_user)): diff --git a/src/services/courses.py b/src/services/courses.py index db205e72..516c3272 100644 --- a/src/services/courses.py +++ b/src/services/courses.py @@ -18,7 +18,7 @@ class Course(BaseModel): description: str photo: str learnings: List[str] - cover_photo: str + thumbnail : str public: bool chapters: List[str] org_id: str @@ -105,6 +105,47 @@ async def create_course(course_object: Course, org_id : str , current_user: Publ return course.dict() +async def update_course_thumbnail(course_id: str , current_user: PublicUser, thumbnail_file: UploadFile | None = None): + await check_database() + + # verify course rights + await verify_rights(course_id, current_user, "update") + + courses = learnhouseDB["courses"] + + course = courses.find_one({"course_id": course_id}) + # TODO(fix) : the implementation here is clearly not the best one + if course: + creationDate = course["creationDate"] + authors = course["authors"] + if thumbnail_file: + contents = thumbnail_file.file.read() + name_in_disk = f"{course_id}_thumbnail_{uuid4()}.{thumbnail_file.filename.split('.')[-1]}" + course = Course(**course).copy(update={"thumbnail": name_in_disk}) + try: + with open(f"content/uploads/img/{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: + thumbnail_file.file.close() + + + updated_course = CourseInDB(course_id=course_id, creationDate=creationDate, authors=authors, updateDate=str(datetime.now()) , **course.dict()) + + courses.update_one({"course_id": course_id}, { + "$set": updated_course.dict()}) + + return CourseInDB(**updated_course.dict()) + + + else: + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, detail="Course does not exist") + async def update_course(course_object: Course, course_id: str, current_user: PublicUser): await check_database()