feat(backend): init course metadata service

This commit is contained in:
swve 2022-11-14 22:52:18 +01:00
parent fba161b55d
commit a8bad0427b
3 changed files with 84 additions and 2 deletions

View file

@ -17,6 +17,8 @@ const CourseIdPage = () => {
const course = await getCourse("course_" + courseid); const course = await getCourse("course_" + courseid);
setCourseInfo(course); setCourseInfo(course);
console.log("courseinfo" , courseInfo); console.log("courseinfo" , courseInfo);
setIsLoading(false); setIsLoading(false);
@ -37,6 +39,7 @@ const CourseIdPage = () => {
) : ( ) : (
<div> <div>
<br></br> <br></br>
<p>Course</p>
<h1>{courseInfo.name}</h1> <h1>{courseInfo.name}</h1>
<CourseWrapper> <CourseWrapper>
<img src={`${getBackendUrl()}content/uploads/img/${courseInfo.thumbnail}`} alt="" /> <img src={`${getBackendUrl()}content/uploads/img/${courseInfo.thumbnail}`} alt="" />

View file

@ -1,7 +1,7 @@
from fastapi import APIRouter, Depends, UploadFile, Form from fastapi import APIRouter, Depends, UploadFile, Form
from src.dependencies.auth import get_current_user 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 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) 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}") @router.get("/{org_id}/page/{page}/limit/{limit}")
async def api_get_course_by(page: int, limit: int, org_id: str): async def api_get_course_by(page: int, limit: int, org_id: str):
""" """

View file

@ -3,6 +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.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
@ -30,6 +31,21 @@ class CourseInDB(Course):
updateDate: str updateDate: str
authors: List[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 #################################################### #### Classes ####################################################
# TODO : Add courses photo & cover upload and delete # TODO : Add courses photo & cover upload and delete
@ -56,6 +72,61 @@ async def get_course(course_id: str, current_user: PublicUser):
return course 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): async def create_course(course_object: Course, org_id: str, current_user: PublicUser, thumbnail_file: UploadFile | None = None):
await check_database() await check_database()
courses = learnhouseDB["courses"] courses = learnhouseDB["courses"]