website/src/hooks.server.ts

152 lines
3.3 KiB
TypeScript

import { SvelteKitAuth } from "@auth/sveltekit";
import Authentik from "@auth/core/providers/authentik";
import { env } from "$env/dynamic/private";
import type { Provider } from "@auth/core/providers";
import type { Profile } from "@auth/core/types";
import { redirect, type Handle } from "@sveltejs/kit";
import { sequence } from "@sveltejs/kit/hooks";
import {
announcements,
pubnixUsers,
blogPosts,
blogTags,
blogAuthors
} from "./stores";
import axios from "axios";
import { Agent } from "https";
const agent = new Agent({
family: 4
});
const hasAuth =
!env.AUTH_CLIENT_ID ||
!env.AUTH_CLIENT_SECRET ||
!env.AUTH_ISSUER ||
!env.AUTH_TRUST_HOST ||
!env.AUTH_SECRET
? false
: true;
export const handle: Handle = sequence(
//@ts-ignore
SvelteKitAuth({
providers: [
Authentik({
clientId: env.AUTH_CLIENT_ID,
clientSecret: env.AUTH_CLIENT_SECRET,
issuer: env.AUTH_ISSUER
}) as Provider<Profile>
]
}),
hasAuth
? async ({ event, resolve }) => {
if (event.url.pathname.startsWith("/admin")) {
const session = await event.locals.getSession();
if (!session) {
throw redirect(303, "/login");
}
}
const result = await resolve(event, {
transformPageChunk: ({ html }) => html
});
return result;
}
: async ({ event, resolve }) => {
if (event.url.pathname.startsWith("/admin")) {
throw redirect(303, "/login");
}
const result = await resolve(event, {
transformPageChunk: ({ html }) => html
});
return result;
}
);
export const fetchGhost = async (action: string, additional?: string) => {
return await axios(
env.GHOST_URL +
"/ghost/api/content/" +
action +
"/?key=" +
env.GHOST_API_KEY +
"&include=authors,tags&limit=all&formats=html,plaintext" +
additional || "",
{ httpsAgent: agent, timeout: 10000 }
);
};
const updateMap = async () => {
try {
const res = await axios(env.KUMA_URL, {
httpsAgent: agent,
timeout: 10000
});
if (res.status === 200) {
announcements.set(res.data);
} else {
announcements.set({ error: true, message: "Error: " + res.status });
}
} catch (err) {
announcements.set({ error: true, message: "Error: " + err });
}
try {
const res = await axios("https://publapi.p.projectsegfau.lt/users", {
httpsAgent: agent,
timeout: 10000
});
if (res.status === 200) {
pubnixUsers.set(res.data);
} else {
pubnixUsers.set({ error: true, message: "Error: " + res.status });
}
} catch (err) {
pubnixUsers.set({ error: true, message: "Error: " + err });
}
try {
const res = await fetchGhost("posts");
if (res.status === 200) {
blogPosts.set(res.data);
} else {
blogPosts.set({ error: true, message: "Error: " + res.status });
}
} catch (err) {
blogPosts.set({ error: true, message: "Error: " + err });
}
try {
const res = await fetchGhost("tags");
if (res.status === 200) {
blogTags.set(res.data);
} else {
blogTags.set({ error: true, message: "Error: " + res.status });
}
} catch (err) {
blogTags.set({ error: true, message: "Error: " + err });
}
try {
const res = await fetchGhost("authors");
if (res.status === 200) {
blogAuthors.set(res.data);
} else {
blogAuthors.set({ error: true, message: "Error: " + res.status });
}
} catch (err) {
blogAuthors.set({ error: true, message: "Error: " + err });
}
};
updateMap();
setInterval(updateMap, 30000);