Skip to content

Commit

Permalink
Merge pull request #48 from avantifellows/feat/performance-optimizations
Browse files Browse the repository at this point in the history
Feat: Performance Optimization
  • Loading branch information
Bahugunajii authored Apr 11, 2024
2 parents 25e6c7c + 727225e commit a56ec4b
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 161 deletions.
92 changes: 7 additions & 85 deletions api/afdb/session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,66 +5,6 @@ import getFetchConfig from '../fetchConfig';
const url = process.env.AF_DB_SERVICE_URL;
const bearerToken = process.env.AF_DB_SERVICE_BEARER_TOKEN || '';

export const getGroupUser = async (userDbId: number) => {
try {
const queryParams = new URLSearchParams({
user_id: userDbId.toString(),
});

const urlWithParams = `${url}/group-user?${queryParams.toString()}`;
const response = await fetch(urlWithParams, getFetchConfig(bearerToken));

if (!response.ok) {
throw new Error(`Error in fetching Session Details: ${response.statusText}`);
}

const data = await response.json();
return data;
} catch (error) {
console.error("Error in fetching Session Details:", error);
throw error;
}
};


export const getGroupSessions = async (groupId: number) => {
try {
const queryParams = new URLSearchParams({
group_id: groupId.toString(),
});

const urlWithParams = `${url}/group-session?${queryParams.toString()}`;
const response = await fetch(urlWithParams, getFetchConfig(bearerToken));

if (!response.ok) {
throw new Error(`Error in fetching Session Details: ${response.statusText}`);
}

const data = await response.json();
return data;
} catch (error) {
console.error("Error in fetching Session Details:", error);
throw error;
}
};

export const getSessions = async (sessionId: number) => {
try {
const urlWithParams = `${url}/session/${sessionId}`;
const response = await fetch(urlWithParams, getFetchConfig(bearerToken));

if (!response.ok) {
throw new Error(`Error in fetching Session Details: ${response.statusText}`);
}

const data = await response.json();
return data;
} catch (error) {
console.error("Error in fetching Session Details:", error);
throw error;
}
};

export const getSessionSchedule = async (sessionId: number, batchId?: number) => {
try {
const queryParams = new URLSearchParams();
Expand All @@ -85,40 +25,22 @@ export const getSessionSchedule = async (sessionId: number, batchId?: number) =>
}
};

export const getGroup = async (groupId?: number, childId?: number) => {
export const fetchUserSession = async (userId: number, isQuiz = false) => {
try {
const queryParams = new URLSearchParams();
if (groupId !== undefined) queryParams.append('id', groupId.toString());
if (childId !== undefined) queryParams.append('child_id', childId.toString());
queryParams.append('type', "batch")
const urlWithParams = `${url}/group?${queryParams.toString()}`;
const response = await fetch(urlWithParams, getFetchConfig(bearerToken));

if (!response.ok) {
throw new Error(`Error in fetching Group Details: ${response.statusText}`);
let urlWithParams = `${url}/user/${userId}/sessions`;
if (isQuiz) {
urlWithParams += '?quiz=true';
}

const data = await response.json();
return data;
} catch (error) {
console.error("Error in fetching Group Details:", error);
throw error;
}
};

export const getQuizBatchData = async (id: number) => {
try {
const urlWithParams = `${url}/batch/${id}`;
const response = await fetch(urlWithParams, getFetchConfig(bearerToken));

const response = await fetch(urlWithParams);
if (!response.ok) {
throw new Error(`Error in fetching Batch Details: ${response.statusText}`);
throw new Error('Failed to fetch sessions');
}

const data = await response.json();
return data;
} catch (error) {
console.error("Error in fetching Batch Details:", error);
console.error('Error fetching sessions for a user:', error);
throw error;
}
};
93 changes: 28 additions & 65 deletions app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import { useAuth } from "@/services/AuthContext";
import TopBar from "@/components/TopBar";
import BottomNavigationBar from "@/components/BottomNavigationBar";
import { getGroupUser, getGroupSessions, getGroup, getSessions, getSessionSchedule } from "@/api/afdb/session";
import { getSessionSchedule, fetchUserSession } from "@/api/afdb/session";
import { useState, useEffect } from "react";
import { GroupUser, GroupSession, QuizSession, SessionSchedule, MessageDisplayProps } from "./types";
import { QuizSession, SessionSchedule, MessageDisplayProps, Session } from "./types";
import Link from "next/link";
import PrimaryButton from "@/components/Button";
import Loading from "./loading";
Expand All @@ -21,77 +21,40 @@ export default function Home() {
const commonTextClass = "text-gray-700 text-xs md:text-sm mx-3 md:mx-8 whitespace-nowrap w-12";
const infoMessageClass = "flex items-center justify-center text-center h-72 mx-4 pb-40";
const portalBaseUrl = api.portal.frontend.baseUrl;
const [batchId, setBatchId] = useState();

const fetchUserSessions = async () => {
try {
const currentDay = (new Date().getDay() + 6) % 7 + 1;
const groupUserData = await getGroupUser(userDbId!);

const groupSessions = await Promise.all(groupUserData.map(async (userData: GroupUser) => {
const group = await getGroup(userData.group_id);

const groupIds = group.map((type: any) => type.id);

const quizId = group.map((quiz: any) => quiz.child_id.parent_id)

const quizGroup = await getGroup(undefined, quizId[0]);

const quizGroupIds = quizGroup.map((quizGroup: any) => quizGroup.id);

const batchId = group.map((groupData: any) => groupData.child_id.id)
setBatchId(batchId[0])

const groupSessionData = await Promise.all(groupIds.map(async (groupId: number) => {
return await getGroupSessions(groupId);
}));

const quizGroupSessionData = await Promise.all(quizGroupIds.map(async (quizGroupId: number) => {
return await getGroupSessions(quizGroupId);
}));
const flattenedQuizGroupSessions = quizGroupSessionData.flat();

const sessionsData = await Promise.all(flattenedQuizGroupSessions.map(async (groupSession: GroupSession) => {
const sessionData = await getSessions(groupSession.session_id);
if (!sessionData) {
return null;
}
const isActive = sessionData.is_active;
const repeatSchedule = sessionData.repeat_schedule;

if (isActive && repeatSchedule && repeatSchedule.type === 'weekly' && repeatSchedule.params.includes(currentDay)) {
return sessionData;
}
return null;
}));
const filteredSessions = sessionsData.filter(session => session !== null);
const quizzesData = filteredSessions.filter((session: any) => session.platform === 'quiz');

const flattenedGroupSessions = groupSessionData.flat();
setQuizzes(quizzesData);
return flattenedGroupSessions;
}));

const flattenedGroupSessions = groupSessions.flat();

const sessionsData = await Promise.all(flattenedGroupSessions.map(async (groupSession: GroupSession) => {
const sessionScheduleData = await getSessionSchedule(groupSession.session_id, batchId);
if (!sessionScheduleData) {
return null;
}
const isActive = sessionScheduleData.session.is_active;
const repeatSchedule = sessionScheduleData.session.repeat_schedule;

if (isActive && repeatSchedule && repeatSchedule.type === 'weekly' && repeatSchedule.params.includes(currentDay)) {
return sessionScheduleData;
}
return null;
const [liveSessionData, quizSessionData] = await Promise.all([
fetchUserSession(userDbId!),
fetchUserSession(userDbId!, true)
]);

const filteredQuizSessions = quizSessionData.filter((quiz: Session) => {
const { is_active: isActive, repeat_schedule: repeatSchedule } = quiz;
return isActive && repeatSchedule &&
repeatSchedule.type === 'weekly' &&
repeatSchedule.params.includes(currentDay);
}).filter(Boolean);

const quizSessions = filteredQuizSessions.filter((session: Session) => session.platform === 'quiz');
setQuizzes(quizSessions);

const sessionsData = await Promise.all(liveSessionData.map(async (liveSession: Session) => {
const sessionScheduleData = await getSessionSchedule(liveSession.id);
if (!sessionScheduleData) return null;

const { is_active: isActive, repeat_schedule: repeatSchedule } = sessionScheduleData.session;
return isActive && repeatSchedule &&
repeatSchedule.type === 'weekly' &&
repeatSchedule.params.includes(currentDay) ? sessionScheduleData : null;
}));

const filteredSessions = sessionsData.filter(session => session !== null);
const liveSessions = sessionsData.filter(sessionSchedule => sessionSchedule)
.filter(sessionSchedule => sessionSchedule.session.platform === 'meet');

const liveClassesData = filteredSessions.filter((sessionSchedule: SessionSchedule) => sessionSchedule.session.platform === 'meet');
setLiveClasses(liveClassesData);
setLiveClasses(liveSessions);
MixpanelTracking.getInstance().identify(userId!);
} catch (error) {
console.error("Error fetching user sessions:", error);
Expand Down
11 changes: 0 additions & 11 deletions app/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,17 +103,6 @@ export interface User {
first_name: string;
last_name: string;
}

export interface GroupSession {
session_id: number;
group_id: number
}

export interface GroupUser {
user_id: number;
group_id: number
}

export interface Student {
id: number;
student_id: string;
Expand Down

0 comments on commit a56ec4b

Please sign in to comment.