mirror of
https://github.com/rzmk/learnhouse.git
synced 2025-12-19 04:19:25 +00:00
feat(backend): init course metadata service
This commit is contained in:
parent
fba161b55d
commit
a8bad0427b
3 changed files with 84 additions and 2 deletions
|
|
@ -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="" />
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -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"]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue