diff --git a/front/pages/org/[orgslug]/course/[courseid]/index.tsx b/front/pages/org/[orgslug]/course/[courseid]/index.tsx index 0ad18355..6fddd3c4 100644 --- a/front/pages/org/[orgslug]/course/[courseid]/index.tsx +++ b/front/pages/org/[orgslug]/course/[courseid]/index.tsx @@ -17,6 +17,8 @@ const CourseIdPage = () => { const course = await getCourse("course_" + courseid); setCourseInfo(course); + + console.log("courseinfo" , courseInfo); setIsLoading(false); @@ -37,6 +39,7 @@ const CourseIdPage = () => { ) : (


+

Course

{courseInfo.name}

diff --git a/src/routers/courses/courses.py b/src/routers/courses/courses.py index a4eae909..450d63ad 100644 --- a/src/routers/courses/courses.py +++ b/src/routers/courses/courses.py @@ -1,7 +1,7 @@ from fastapi import APIRouter, Depends, UploadFile, Form from src.dependencies.auth import get_current_user -from src.services.courses.courses import Course, create_course, get_course, get_courses, update_course, delete_course, update_course_thumbnail +from src.services.courses.courses import Course, create_course, get_course, get_course_meta, get_courses, update_course, delete_course, update_course_thumbnail from src.services.users import PublicUser @@ -34,6 +34,14 @@ async def api_get_course(course_id: str, current_user: PublicUser = Depends(get return await get_course(course_id, current_user=current_user) +@router.get("/meta/{course_id}") +async def api_get_course_meta(course_id: str, current_user: PublicUser = Depends(get_current_user)): + """ + Get single Course Metadata (chapters, elements) by course_id + """ + return await get_course_meta(course_id, current_user=current_user) + + @router.get("/{org_id}/page/{page}/limit/{limit}") async def api_get_course_by(page: int, limit: int, org_id: str): """ @@ -56,4 +64,4 @@ async def api_delete_course(course_id: str, current_user: PublicUser = Depends(g Delete Course by ID """ - return await delete_course(course_id, current_user) \ No newline at end of file + return await delete_course(course_id, current_user) diff --git a/src/services/courses/courses.py b/src/services/courses/courses.py index 5f15b1af..15178904 100644 --- a/src/services/courses/courses.py +++ b/src/services/courses/courses.py @@ -3,6 +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.uploads import upload_thumbnail from src.services.users import PublicUser, User from src.services.database import create_config_collection, check_database, create_database, learnhouseDB @@ -30,6 +31,21 @@ class CourseInDB(Course): updateDate: str authors: List[str] + +# TODO : wow terrible, fix this +# those models need to be available only in the chapters service +class CourseChapter(BaseModel): + name: str + description: str + elements: list + + +class CourseChapterInDB(CourseChapter): + coursechapter_id: str + course_id: str + creationDate: str + updateDate: str + #### Classes #################################################### # TODO : Add courses photo & cover upload and delete @@ -56,6 +72,61 @@ async def get_course(course_id: str, current_user: PublicUser): return course +async def get_course_meta(course_id: str, current_user: PublicUser): + await check_database() + courses = learnhouseDB["courses"] + coursechapters = learnhouseDB["coursechapters"] + course = courses.find_one({"course_id": course_id}) + elements = learnhouseDB["elements"] + + + # verify course rights + await verify_rights(course_id, current_user, "read") + + if not course: + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, detail="Course does not exist") + + + coursechapters = coursechapters.find( + {"course_id": course_id}).sort("name", 1) + + # elements + coursechapter_elementIds_global = [] + + # chapters + chapters = {} + for coursechapter in coursechapters: + coursechapter = CourseChapterInDB(**coursechapter) + coursechapter_elementIds = [] + + for element in coursechapter.elements: + coursechapter_elementIds.append(element) + coursechapter_elementIds_global.append(element) + + chapters[coursechapter.coursechapter_id] = { + "id": coursechapter.coursechapter_id, "name": coursechapter.name, "elementIds": coursechapter_elementIds + } + + # elements + elements_list = {} + for element in elements.find({"element_id": {"$in": coursechapter_elementIds_global}}): + element = ElementInDB(**element) + elements_list[element.element_id] = { + "id": element.element_id, "name": element.name, "type": element.type, "content": element.content + } + + chapters_list_with_elements = [] + for chapter in chapters: + chapters_list_with_elements.append( + {"id": chapters[chapter]["id"], "name": chapters[chapter]["name"], "elements": [elements_list[element] for element in chapters[chapter]["elementIds"]]}) + course = Course(**course) + return { + "course": course, + "chapters": chapters_list_with_elements, + } + + async def create_course(course_object: Course, org_id: str, current_user: PublicUser, thumbnail_file: UploadFile | None = None): await check_database() courses = learnhouseDB["courses"]