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; };