diff options
| author | ivarlovlie <git@ivarlovlie.no> | 2023-02-25 13:15:44 +0100 |
|---|---|---|
| committer | ivarlovlie <git@ivarlovlie.no> | 2023-02-25 13:15:44 +0100 |
| commit | 900bb5e845c3ad44defbd427cae3d44a4a43321f (patch) | |
| tree | df3d96a93771884add571e82336c29fc3d9c7a1c /code/app/src/routes/(main)/+layout.server.ts | |
| download | greatoffice-900bb5e845c3ad44defbd427cae3d44a4a43321f.tar.xz greatoffice-900bb5e845c3ad44defbd427cae3d44a4a43321f.zip | |
feat: Initial commit
Diffstat (limited to 'code/app/src/routes/(main)/+layout.server.ts')
| -rw-r--r-- | code/app/src/routes/(main)/+layout.server.ts | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/code/app/src/routes/(main)/+layout.server.ts b/code/app/src/routes/(main)/+layout.server.ts new file mode 100644 index 0000000..25043aa --- /dev/null +++ b/code/app/src/routes/(main)/+layout.server.ts @@ -0,0 +1,45 @@ +import { api_base, CookieNames } from "$configuration"; +import { cached_result_async, CacheKeys } from "$utilities/cache"; +import { log_debug, log_error } from "$utilities/logger"; +import { get_md5_hash } from "$utilities/crypto-helpers"; +import { error, redirect } from "@sveltejs/kit"; +import type { LayoutServerLoad } from "./$types"; + +export const load: LayoutServerLoad = async ({ route, cookies, locals, fetch }) => { + const isBaseRoute = route.id === "/(main)"; + const isPortalRoute = route.id === "/(main)/(public)/portal"; + const isPublicRoute = (isBaseRoute || (route.id?.startsWith("/(main)/(public)") ?? false)) ?? true; + const sessionCookieValue = cookies.get(CookieNames.session); + let sessionIsValid = false; + if ((sessionCookieValue?.length > 0 ?? false)) { + const sessionHash = get_md5_hash(sessionCookieValue); + sessionIsValid = (await cached_result_async<Response>(sessionHash + "_" + CacheKeys.isAuthenticated, 120, () => fetch(api_base("_/is-authenticated"), { + headers: { + Cookie: CookieNames.session + "=" + sessionCookieValue, + }, + }).catch((e) => { + log_error(e); + throw error(503, { + message: "We are experiencing a service disruption! Have patience while we resolve the issue.", + }); + }))).ok; + } + + log_debug("Base Layout loaded", { + sessionIsValid, + isPublicRoute, + isBaseRoute, + isPortalRoute, + routeId: route.id, + }); + + if (sessionIsValid && isPublicRoute && !isPortalRoute) { + throw redirect(302, "/home"); + } else if (!isPortalRoute && (isBaseRoute || !sessionIsValid && !isPublicRoute)) { + throw redirect(302, "/sign-in"); + } + + return { + locale: locals.locale, + }; +}; |
