diff --git a/front/app/_orgs/[orgslug]/(withmenu)/course/[courseid]/edit/page.tsx b/front/app/_orgs/[orgslug]/(withmenu)/course/[courseid]/edit/page.tsx index 22f9ef42..f77317c9 100644 --- a/front/app/_orgs/[orgslug]/(withmenu)/course/[courseid]/edit/page.tsx +++ b/front/app/_orgs/[orgslug]/(withmenu)/course/[courseid]/edit/page.tsx @@ -11,7 +11,7 @@ import { createChapter, deleteChapter, getCourseChaptersMetadata, updateChapters import { useRouter } from "next/navigation"; import NewChapterModal from "@components/Modals/Chapters/NewChapter"; import NewActivityModal from "@components/Modals/Activities/Create/NewActivity"; -import { createActivity, createFileActivity, createYouTubeVideoActivity } from "@services/courses/activities"; +import { createActivity, createFileActivity, createExternalVideoActivity } from "@services/courses/activities"; import { getOrganizationContextInfo } from "@services/organizations/orgs"; import Modal from "@components/UI/Modal/Modal"; import { denyAccessToUser } from "@services/utils/react/middlewares/views"; @@ -96,9 +96,10 @@ function CourseEdit(params: any) { }; // Submit YouTube Video Upload - const submitVideoYouTubeActivity = async (data : any, activity: any, chapterId: string) => { + const submitExternalVideo = async (external_video_data : any, activity: any, chapterId: string) => { + console.log("submitExternalVideo", external_video_data); await updateChaptersMetadata(courseid, data); - await createYouTubeVideoActivity(data, activity, chapterId); + await createExternalVideoActivity(external_video_data , activity, chapterId); await getCourseChapters(); setNewActivityModal(false); }; @@ -275,6 +276,7 @@ function CourseEdit(params: any) { dialogContent={} diff --git a/front/components/Modals/Activities/Create/NewActivity.tsx b/front/components/Modals/Activities/Create/NewActivity.tsx index 9cc28b5f..8f1166b5 100644 --- a/front/components/Modals/Activities/Create/NewActivity.tsx +++ b/front/components/Modals/Activities/Create/NewActivity.tsx @@ -9,7 +9,7 @@ import VideoModal from "./NewActivityModal/Video"; import Image from "next/image"; import DocumentPdfModal from "./NewActivityModal/DocumentPdf"; -function NewActivityModal({ closeModal, submitActivity, submitFileActivity, chapterId }: any) { +function NewActivityModal({ closeModal, submitActivity, submitFileActivity, submitExternalVideo, chapterId }: any) { const [selectedView, setSelectedView] = useState("home"); @@ -43,7 +43,8 @@ function NewActivityModal({ closeModal, submitActivity, submitFileActivity, chap )} {selectedView === "video" && ( - + )} {selectedView === "documentpdf" && ( diff --git a/front/components/Modals/Activities/Create/NewActivityModal/Video.tsx b/front/components/Modals/Activities/Create/NewActivityModal/Video.tsx index d0513edf..a510ae11 100644 --- a/front/components/Modals/Activities/Create/NewActivityModal/Video.tsx +++ b/front/components/Modals/Activities/Create/NewActivityModal/Video.tsx @@ -4,7 +4,14 @@ import * as Form from '@radix-ui/react-form'; import BarLoader from "react-spinners/BarLoader"; import { Youtube } from "lucide-react"; -function VideoModal({ submitFileActivity, chapterId }: any) { +interface ExternalVideoObject { + name: string, + type: string, + uri: string +} + + +function VideoModal({ submitFileActivity, submitExternalVideo, chapterId }: any) { const [video, setVideo] = React.useState(null) as any; const [isSubmitting, setIsSubmitting] = useState(false); const [name, setName] = React.useState(""); @@ -26,15 +33,21 @@ function VideoModal({ submitFileActivity, chapterId }: any) { const handleSubmit = async (e: any) => { e.preventDefault(); setIsSubmitting(true); + if (selectedView === "file") { let status = await submitFileActivity(video, "video", { name, type: "video" }, chapterId); - setIsSubmitting(false); + setIsSubmitting(false); } if (selectedView === "youtube") { - let status = await submitFileActivity(video, "video", { name, type: "video" }, chapterId); - setIsSubmitting(false); + let external_video_object: ExternalVideoObject = { + name, + type: "youtube", + uri: youtubeUrl + } + let status = await submitExternalVideo(external_video_object, 'activity' ,chapterId); + setIsSubmitting(false); } - + }; /* TODO : implement some sort of progress bar for file uploads, it is not possible yet because i'm not using axios. @@ -69,7 +82,6 @@ function VideoModal({ submitFileActivity, chapterId }: any) { )} {selectedView === "youtube" && ( -
diff --git a/front/services/courses/activities.ts b/front/services/courses/activities.ts index 49b41246..a7976e05 100644 --- a/front/services/courses/activities.ts +++ b/front/services/courses/activities.ts @@ -36,8 +36,12 @@ export async function createFileActivity(file: File, type: string, data: any, ch return res; } -export async function createYouTubeVideoActivity(data: any, activity: any, chapter_id: any) { - const result = await fetch(`${getAPIUrl()}activities/youtubevideo?coursechapter_id=${chapter_id}`, RequestBody("POST", data)); +export async function createExternalVideoActivity(data: any, activity: any, chapter_id: any) { + // add coursechapter_id to data + data.coursechapter_id = chapter_id; + data.activity_id = activity.id; + + const result = await fetch(`${getAPIUrl()}activities/external_video?coursechapter_id=${chapter_id}`, RequestBody("POST", data)); const res = await result.json(); return res; } diff --git a/src/routers/courses/activities.py b/src/routers/courses/activities.py index c7ee127c..2694c650 100644 --- a/src/routers/courses/activities.py +++ b/src/routers/courses/activities.py @@ -99,21 +99,19 @@ async def api_create_video_activity( async def api_create_external_video_activity( request: Request, external_video: ExternalVideo, - coursechapter_id: str = Form(), current_user: PublicUser = Depends(get_current_user), ): """ Create new activity """ return await create_external_video_activity( - request, coursechapter_id, current_user, external_video + request, current_user, external_video ) @router.post("/documentpdf") async def api_create_documentpdf_activity( request: Request, - org_id: str, name: str = Form(), coursechapter_id: str = Form(), current_user: PublicUser = Depends(get_current_user), diff --git a/src/services/courses/activities/video.py b/src/services/courses/activities/video.py index 61ccfef5..d34f65d9 100644 --- a/src/services/courses/activities/video.py +++ b/src/services/courses/activities/video.py @@ -28,6 +28,12 @@ async def create_video_activity( {"chapters_content.coursechapter_id": coursechapter_id} ) + if not coursechapter: + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, + detail="CourseChapter : No coursechapter found", + ) + org_id = coursechapter["org_id"] # check if video_file is not None @@ -101,12 +107,14 @@ class ExternalVideo(BaseModel): name: str uri: str type: Literal["youtube", "vimeo"] + coursechapter_id: str + +class ExternalVideoInDB(BaseModel): activity_id: str async def create_external_video_activity( request: Request, - coursechapter_id: str, current_user: PublicUser, data: ExternalVideo, ): @@ -118,15 +126,21 @@ async def create_external_video_activity( # get org_id from course coursechapter = await courses.find_one( - {"chapters_content.coursechapter_id": coursechapter_id} + {"chapters_content.coursechapter_id": data.coursechapter_id} ) + if not coursechapter: + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, + detail="CourseChapter : No coursechapter found", + ) + org_id = coursechapter["org_id"] activity_object = ActivityInDB( org_id=org_id, activity_id=activity_id, - coursechapter_id=coursechapter_id, + coursechapter_id=data.coursechapter_id, name=data.name, type="video", content={ @@ -157,7 +171,7 @@ async def create_external_video_activity( # todo : choose whether to update the chapter or not # update chapter await courses.update_one( - {"chapters_content.coursechapter_id": coursechapter_id}, + {"chapters_content.coursechapter_id": data.coursechapter_id}, {"$addToSet": {"chapters_content.$.activities": activity_id}}, )