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"]