From a9c3d24c62906ec24de3d506d63b1d0d461a9616 Mon Sep 17 00:00:00 2001 From: swve Date: Sun, 22 Jan 2023 17:24:11 +0100 Subject: [PATCH] feat: mark lectures as done --- .../[courseid]/lecture/[lectureid]/page.tsx | 34 ++++++++++++++----- front/services/courses/activity.ts | 7 ++++ src/services/activity.py | 30 ++++++++-------- 3 files changed, 47 insertions(+), 24 deletions(-) diff --git a/front/app/_orgs/[orgslug]/course/[courseid]/lecture/[lectureid]/page.tsx b/front/app/_orgs/[orgslug]/course/[courseid]/lecture/[lectureid]/page.tsx index 8deb297b..2ddcc840 100644 --- a/front/app/_orgs/[orgslug]/course/[courseid]/lecture/[lectureid]/page.tsx +++ b/front/app/_orgs/[orgslug]/course/[courseid]/lecture/[lectureid]/page.tsx @@ -10,6 +10,7 @@ import styled from "styled-components"; import { getCourse, getCourseMetadata } from "../../../../../../../services/courses/courses"; import VideoLecture from "@components/LectureViews/Video/Video"; import { Check } from "lucide-react"; +import { maskLectureAsComplete } from "@services/courses/activity"; function LecturePage(params: any) { const router = useRouter(); @@ -32,6 +33,11 @@ function LecturePage(params: any) { setIsLoading(false); } + async function markLectureAsCompleteFront() { + const activity = await maskLectureAsComplete("" + lectureid, courseid, lecture.lecture_id.replace("lecture_", "")); + fetchCourseData(); + } + React.useEffect(() => { if (lectureid) { fetchLectureData(); @@ -85,10 +91,24 @@ function LecturePage(params: any) { {lecture.type == "video" && } - + {course.activity.lectures_marked_complete.includes("lecture_"+lectureid) ? ( + + ) : ( + + )} - )} @@ -169,8 +189,7 @@ const ActivityMarkerWrapper = styled.div` margin: 0 auto; align-items: center; - - button{ + button { background-color: #151515; border: none; padding: 18px; @@ -190,20 +209,17 @@ const ActivityMarkerWrapper = styled.div` font-size: 16px; letter-spacing: -0.05em; box-shadow: 0px 13px 33px -13px rgba(0, 0, 0, 0.42); - - i{ + i { margin-right: 5px; // center the icon display: flex; align-items: center; justify-content: center; - - } - &:hover{ + &:hover { background-color: #000000; } } diff --git a/front/services/courses/activity.ts b/front/services/courses/activity.ts index d1da007f..0185e5d1 100644 --- a/front/services/courses/activity.ts +++ b/front/services/courses/activity.ts @@ -22,3 +22,10 @@ export async function closeActivity(org_id: string, activity_id: string) { .catch((error) => console.log("error", error)); return result; } + +export async function maskLectureAsComplete(org_id: string, course_id: string, lecture_id: string) { + const result: any = await fetch(`${getAPIUrl()}activity/${org_id}/add_lecture/${course_id}/${lecture_id}`, RequestBody("POST", null)) + .then((result) => result.json()) + .catch((error) => console.log("error", error)); + return result; +} diff --git a/src/services/activity.py b/src/services/activity.py index 6b621740..9d8048cf 100644 --- a/src/services/activity.py +++ b/src/services/activity.py @@ -1,3 +1,4 @@ +from cmath import log from datetime import datetime import json from typing import List, Literal, Optional @@ -14,8 +15,8 @@ class Activity(BaseModel): course_id: str status: Optional[Literal['ongoing', 'done', 'closed']] = 'ongoing' masked: Optional[bool] = False - lectures_marked_complete: Optional[List[str]] - lectures_data: Optional[List[dict]] + lectures_marked_complete: Optional[List[str]] = [] + lectures_data: Optional[List[dict]] = [] class ActivityInDB(Activity): @@ -70,29 +71,28 @@ async def get_user_activities(request: Request, user: PublicUser, org_id: str): async def add_lecture_to_activity(request: Request, user: PublicUser, org_id: str, course_id: str, lecture_id: str): activities = request.app.db["activities"] - + print(lecture_id) + course_id = f"course_{course_id}" + lecture_id = f"lecture_{lecture_id}" + print(lecture_id) activity = activities.find_one( {"course_id": course_id, - "user_id": user.user_id, - "org_id": org_id - }) + "user_id": user.user_id + }, {'_id': 0}) if not activity: raise HTTPException( status_code=status.HTTP_409_CONFLICT, detail="Activity not found") - if lecture_id in activity['lectures_marked_complete']: + if lecture_id not in activity['lectures_marked_complete']: + activity['lectures_marked_complete'].append(str(lecture_id)) + activities.update_one( + {"activity_id": activity['activity_id']}, {"$set": activity}) + return activity + else: raise HTTPException( status_code=status.HTTP_409_CONFLICT, detail="Lecture already marked complete") - activity['lectures_marked_complete'].append(lecture_id) - - activities.update_one( - {"activity_id": activity['activity_id']}, {"$set": activity}) - - # send 200 custom message - return {"message": "Lecture added to activity"} - async def close_activity(request: Request, user: PublicUser, activity_id: str, org_id: str,): activities = request.app.db["activities"]