All checks were successful
Build Formula11 Docker Image / pocketbase-docker (push) Successful in 25s
77 lines
3.0 KiB
TypeScript
77 lines
3.0 KiB
TypeScript
import type { Graphic, User } from "$lib/schema";
|
|
import type { Handle } from "@sveltejs/kit";
|
|
import { env } from "$env/dynamic/private";
|
|
import PocketBase from "pocketbase";
|
|
|
|
// This function will run serverside on each request.
|
|
// The event.locals will be passed onto serverside load functions and handlers.
|
|
// We create a new PocketBase client for each request, so it always carries the
|
|
// most recent authentication data.
|
|
// The authenticated PocketBase client will be available in all *.server.ts files.
|
|
export const handle: Handle = async ({ event, resolve }) => {
|
|
const requestStartTime: number = Date.now();
|
|
|
|
// If env variables are defined (e.g. in the prod environment), use those.
|
|
// Otherwise use the default local development IP:Port.
|
|
// Because we imported "$env/dynamic/private",
|
|
// the variables will only be available to the server (e.g. .server.ts files).
|
|
let pb_url: string = "http://192.168.86.50:8090";
|
|
if (env.PB_PROTOCOL && env.PB_HOST && env.PB_PORT) {
|
|
pb_url = `${env.PB_PROTOCOL}://${env.PB_HOST}:${env.PB_PORT}`;
|
|
}
|
|
if (env.PB_PROTOCOL && env.PB_URL) {
|
|
pb_url = `${env.PB_PROTOCOL}://${env.PB_URL}`;
|
|
}
|
|
|
|
event.locals.pb = new PocketBase(pb_url);
|
|
|
|
// Load the most recent authentication data from a cookie (is updated below)
|
|
event.locals.pb.authStore.loadFromCookie(event.request.headers.get("cookie") || "");
|
|
|
|
if (event.locals.pb.authStore.isValid) {
|
|
// If the authentication data is valid, we make a "user" object easily available.
|
|
event.locals.user = structuredClone(event.locals.pb.authStore.model) as User;
|
|
|
|
if (event.locals.user) {
|
|
if (event.locals.pb.authStore.model.avatar) {
|
|
// Fill in the avatar URL
|
|
event.locals.user.avatar_url = event.locals.pb.files.getURL(
|
|
event.locals.pb.authStore.model,
|
|
event.locals.pb.authStore.model.avatar,
|
|
);
|
|
} else {
|
|
// Fill in the driver_headshot_template URL if no avatar chosen
|
|
const driver_headshot_template: Graphic = await event.locals.pb
|
|
.collection("graphics")
|
|
.getFirstListItem('name="driver_headshot_template"');
|
|
event.locals.user.avatar_url = event.locals.pb.files.getURL(
|
|
driver_headshot_template,
|
|
driver_headshot_template.file,
|
|
);
|
|
}
|
|
|
|
// Set admin status for easier access
|
|
event.locals.admin = event.locals.user.admin;
|
|
}
|
|
} else {
|
|
event.locals.user = undefined;
|
|
}
|
|
|
|
// Resolve the request. This is what happens by default.
|
|
const response = await resolve(event);
|
|
|
|
console.log(
|
|
"=====\n",
|
|
`Request Date: ${new Date(requestStartTime).toISOString()}\n`,
|
|
`Method: ${event.request.method}\n`,
|
|
`Path: ${event.url.pathname}\n`,
|
|
`Duration: ${Date.now() - requestStartTime}ms\n`,
|
|
`Status: ${response.status}`,
|
|
);
|
|
|
|
// Store the current authentication data to a cookie, so it can be loaded above.
|
|
response.headers.set("set-cookie", event.locals.pb.authStore.exportToCookie({ secure: false }));
|
|
|
|
return response;
|
|
};
|