vbv/client/src/router/guards.ts

113 lines
3.4 KiB
TypeScript

import { getLoginURLNext, shouldUseSSO } from "@/router/utils";
import { useCourseSessionsStore } from "@/stores/courseSessions";
import { useUserStore } from "@/stores/user";
import type { NavigationGuard, RouteLocationNormalized } from "vue-router";
export const updateLoggedIn: NavigationGuard = async () => {
const loggedIn = getCookieValue("loginStatus") === "true";
const userStore = useUserStore();
userStore.$patch({ loggedIn });
if (loggedIn && !userStore.id) {
await userStore.fetchUser();
}
};
export const redirectToLoginIfRequired: NavigationGuard = (to, from, next) => {
const user = useUserStore();
// redirect guests to /start if they access /
if (!user.loggedIn && to.path === "/") {
return next("/start");
}
if (loginRequired(to) && !user.loggedIn) {
const loginURL = getLoginURLNext();
if (shouldUseSSO()) {
// Redirect to SSO login page, handled by the server
window.location.href = loginURL;
} else {
// Handle local login with Vue router
next(loginURL);
}
} else {
// If login is not required or user is already logged in, continue with the navigation
next();
}
};
export const getCookieValue = (cookieName: string): string => {
// https://stackoverflow.com/questions/5639346/what-is-the-shortest-function-for-reading-a-cookie-by-name-in-javascript
const cookieValue = document.cookie.match(
"(^|[^;]+)\\s*" + cookieName + "\\s*=\\s*([^;]+)"
);
if (!cookieValue) {
return "";
}
return cookieValue.pop() || "";
};
const loginRequired = (to: RouteLocationNormalized) => {
return !to.meta?.public;
};
export const expertRequired: NavigationGuard = (to: RouteLocationNormalized) => {
const courseSessionsStore = useCourseSessionsStore();
if (courseSessionsStore.currentCourseSessionHasCockpit) {
return true;
} else {
const courseSlug = to.params.courseSlug as string;
return `/course/${courseSlug}/learn`;
}
};
export async function handleCurrentCourseSession(to: RouteLocationNormalized) {
// register after login hooks
const userStore = useUserStore();
if (userStore.loggedIn) {
const courseSessionsStore = useCourseSessionsStore();
if (to.params.courseSlug) {
courseSessionsStore._currentCourseSlug = to.params.courseSlug as string;
} else {
courseSessionsStore._currentCourseSlug = "";
}
if (!courseSessionsStore.loaded) {
await courseSessionsStore.loadCourseSessionsData();
}
}
}
export async function handleCourseSessionAsQueryParam(to: RouteLocationNormalized) {
/**
* switch to course session with id from query param `courseSessionId` if it
* is present and valid.
*/
// register after login hooks
const userStore = useUserStore();
if (userStore.loggedIn) {
const courseSessionsStore = useCourseSessionsStore();
if (!courseSessionsStore.loaded) {
await courseSessionsStore.loadCourseSessionsData();
}
if (to.query.courseSessionId) {
const { courseSessionId, ...restOfQuery } = to.query;
const switchSuccessful = courseSessionsStore.switchCourseSessionById(
courseSessionId.toString()
);
if (switchSuccessful) {
return {
path: to.path,
query: restOfQuery,
replace: true,
};
} else {
// courseSessionId is invalid for current user -> redirect to home
return {
path: "/",
};
}
}
}
}