diff --git a/front/app/_orgs/[orgslug]/activity/page.tsx b/front/app/_orgs/[orgslug]/activity/page.tsx index 5228795c..cbfbf690 100644 --- a/front/app/_orgs/[orgslug]/activity/page.tsx +++ b/front/app/_orgs/[orgslug]/activity/page.tsx @@ -1,41 +1,27 @@ "use client"; -import { getBackendUrl } from "@services/config"; +import { getAPIUrl, getBackendUrl } from "@services/config"; import { getActivities } from "@services/courses/activity"; import { getOrganizationContextInfo } from "@services/orgs"; -import { RequestBody } from "@services/utils/requests"; +import { swrFetcher } from "@services/utils/requests"; import React from "react"; import { styled } from "styled-components"; import useSWR from "swr"; function Activity(params: any) { let orgslug = params.params.orgslug; - const [isLoading, setIsLoading] = React.useState(true); - const [activities, setActivities] = React.useState([]); - - async function fetchActivities() { - setIsLoading(true); - const org = await getOrganizationContextInfo(orgslug); - const activities = await getActivities(org.org_id); - console.log(activities); - - setActivities(activities); - setIsLoading(false); - } - React.useEffect(() => { - fetchActivities(); - }, []); + const { data: activities, error: error } = useSWR(`${getAPIUrl()}activity/org_slug/${orgslug}/activities`, swrFetcher); return (

Activity


- {isLoading ? ( + {error &&

Failed to load

} + {!activities ? (
Loading...
) : (
{activities.map((activity: any) => ( - diff --git a/front/app/organizations/page.tsx b/front/app/organizations/page.tsx index bc7181ab..f48e39be 100644 --- a/front/app/organizations/page.tsx +++ b/front/app/organizations/page.tsx @@ -3,17 +3,17 @@ import Link from "next/link"; import React from "react"; import Layout from "../../components/UI/Layout"; import { Title } from "../../components/UI/Elements/Styles/Title"; -import { deleteOrganizationFromBackend } from "../../services/orgs"; +import { deleteOrganizationFromBackend } from "@services/orgs"; import useSWR, { mutate } from "swr"; import { swrFetcher } from "@services/utils/requests"; import { getAPIUrl } from "@services/config"; const Organizations = () => { - const { data, error } = useSWR(`${getAPIUrl()}orgs/user/page/1/limit/10`, swrFetcher) + const { data : organizations , error } = useSWR(`${getAPIUrl()}orgs/user/page/1/limit/10`, swrFetcher) async function deleteOrganization(org_id: any) { const response = await deleteOrganizationFromBackend(org_id); - response && mutate(`${getAPIUrl()}orgs/user/page/1/limit/10`, data.filter((org: any) => org.org_id !== org_id)); + response && mutate(`${getAPIUrl()}orgs/user/page/1/limit/10`, organizations.filter((org: any) => org.org_id !== org_id)); } return ( @@ -26,11 +26,11 @@ const Organizations = () => {
{error &&

Failed to load

} - {!data ? ( + {!organizations ? (

Loading...

) : (
- {data.map((org: any) => ( + {organizations.map((org: any) => (

{org.name}

diff --git a/front/services/courses/activity.ts b/front/services/courses/activity.ts index e6fa9ebf..82e29a6e 100644 --- a/front/services/courses/activity.ts +++ b/front/services/courses/activity.ts @@ -1,5 +1,5 @@ import { RequestBody } from "@services/utils/requests"; -import { getAPIUrl } from "../config"; +import { getAPIUrl } from "@services/config"; /* This file includes only POST, PUT, DELETE requests @@ -30,11 +30,3 @@ export async function maskLectureAsComplete(org_id: string, course_id: string, l return result; } -// get all activities -export async function getActivities(org_id: string) { - const result: any = await fetch(`${getAPIUrl()}activity/${org_id}/activities`, RequestBody("GET", null)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); - return result; -} - diff --git a/front/services/orgs.ts b/front/services/orgs.ts index a407048a..b7b945ff 100644 --- a/front/services/orgs.ts +++ b/front/services/orgs.ts @@ -1,19 +1,9 @@ -import { getAPIUrl } from "./config"; +import { getAPIUrl } from "@services/config"; -export async function getUserOrganizations() { - const HeadersConfig = new Headers({ "Content-Type": "application/json" }); - - const requestOptions: any = { - method: "GET", - headers: HeadersConfig, - redirect: "follow", - credentials: "include", - }; - - return fetch(`${getAPIUrl()}orgs/user/page/1/limit/10`, requestOptions) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); -} +/* + This file includes only POST, PUT, DELETE requests + GET requests are called from the frontend using SWR (https://swr.vercel.app/) +*/ export async function createNewOrganization(body: any) { const HeadersConfig = new Headers({ "Content-Type": "application/json" }); @@ -31,8 +21,6 @@ export async function createNewOrganization(body: any) { .catch((error) => console.log("error", error)); } -// export async function getOrganizationData(org_id) {} - export async function deleteOrganizationFromBackend(org_id: any) { const HeadersConfig = new Headers({ "Content-Type": "application/json" }); @@ -48,7 +36,6 @@ export async function deleteOrganizationFromBackend(org_id: any) { .catch((error) => console.log("error", error)); } -// export async function updateOrganization(org_id) {} export async function getOrganizationContextInfo(org_slug : any){ const HeadersConfig = new Headers({ "Content-Type": "application/json" }); diff --git a/src/routers/activity.py b/src/routers/activity.py index edc5e000..34441401 100644 --- a/src/routers/activity.py +++ b/src/routers/activity.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, Depends, Request from src.dependencies.auth import get_current_user -from src.services.activity import Activity, add_lecture_to_activity, close_activity, create_activity, get_user_activities +from src.services.activity import Activity, add_lecture_to_activity, close_activity, create_activity, get_user_activities, get_user_activities_orgslug router = APIRouter() @@ -16,13 +16,20 @@ async def api_start_activity(request: Request, activity_object: Activity, user=D # TODO : get activity by user_is and org_id and course_id -@router.get("/{org_id}/activities") -async def api_get_activity_by_userid(request: Request, org_id: str, user=Depends(get_current_user)): +@router.get("/org_id/{org_id}/activities") +async def api_get_activity_by_orgid(request: Request, org_id: str, user=Depends(get_current_user)): """ Get a user activities """ return await get_user_activities(request, user, org_id=org_id) +@router.get("/org_slug/{org_slug}/activities") +async def api_get_activity_by_orgslug(request: Request, org_slug: str, user=Depends(get_current_user)): + """ + Get a user activities using org slug + """ + return await get_user_activities_orgslug(request, user, org_slug=org_slug) + @router.post("/{org_id}/add_lecture/{course_id}/{lecture_id}") async def api_add_lecture_to_activity(request: Request, org_id: str, course_id: str, lecture_id: str, user=Depends(get_current_user)): diff --git a/src/services/activity.py b/src/services/activity.py index afaf0d56..6ad810e9 100644 --- a/src/services/activity.py +++ b/src/services/activity.py @@ -89,6 +89,36 @@ async def get_user_activities(request: Request, user: PublicUser, org_id: str): return activities_metadata +async def get_user_activities_orgslug(request: Request, user: PublicUser, org_slug: str): + activities = request.app.db["activities"] + courses = request.app.db["courses"] + coursechapters = request.app.db["coursechapters"] + + activities_metadata = [] + + user_activities = activities.find( + {"user_id": user.user_id}, {'_id': 0}) + + if not user_activities: + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, detail="No activities found") + + for activity in user_activities: + # get number of lectures in the course + coursechapters = await get_coursechapters_meta(request, activity['course_id'], user) + + # calculate progression using the number of lectures marked complete and the total number of lectures + progression = round( + len(activity['lectures_marked_complete']) / len(coursechapters['lectures']) * 100, 2) + + course = courses.find_one({"course_id": activity['course_id']}, {'_id': 0}) + + # add progression to the activity + one_activity = {"course": course, "activitydata": activity, "progression": progression} + activities_metadata.append(one_activity) + + return activities_metadata + async def add_lecture_to_activity(request: Request, user: PublicUser, org_id: str, course_id: str, lecture_id: str): activities = request.app.db["activities"]