Files
archtika/web-app/src/routes/(authenticated)/website/[websiteId]/publish/+page.server.ts

100 lines
3.1 KiB
TypeScript
Raw Normal View History

import { mkdir, writeFile } from "node:fs/promises";
import { join } from "node:path";
import { md } from "$lib/utils";
import type { Actions, PageServerLoad } from "./$types";
import { API_BASE_PREFIX, NGINX_BASE_PREFIX } from "$lib/utils";
import { render } from "svelte/server";
import BlogIndex from "$lib/templates/blog/BlogIndex.svelte";
import BlogArticle from "$lib/templates/blog/BlogArticle.svelte";
export const load: PageServerLoad = async ({ params, fetch, cookies }) => {
const websiteOverviewData = await fetch(
`${API_BASE_PREFIX}/website_overview?id=eq.${params.websiteId}`,
{
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${cookies.get("session_token")}`,
Accept: "application/vnd.pgrst.object+json"
}
}
);
const websiteOverview = await websiteOverviewData.json();
2024-08-07 19:13:39 +02:00
generateStaticFiles(websiteOverview);
const websitePreviewUrl = `${NGINX_BASE_PREFIX}/previews/${websiteOverview.user_id}/${websiteOverview.id}/index.html`;
return {
websiteOverview,
websitePreviewUrl
};
};
export const actions: Actions = {
publishWebsite: async ({ request }) => {
const data = await request.formData();
const websiteOverview = JSON.parse(data.get("website-overview") as string);
2024-08-07 19:13:39 +02:00
generateStaticFiles(websiteOverview, false);
return { success: true, message: "Successfully published website" };
}
};
2024-08-07 19:13:39 +02:00
const generateStaticFiles = async (websiteData: any, isPreview: boolean = true) => {
const { head, body } = render(BlogIndex, {
props: {
title: websiteData.title,
logoType: websiteData.logo_type,
logo: websiteData.logo_text,
mainContent: md.render(websiteData.main_content ?? ""),
articles: websiteData.articles ?? [],
footerAdditionalText: websiteData.additional_text ?? ""
}
});
const indexFileContents = head.concat(body);
let uploadDir = "";
if (isPreview) {
uploadDir = join(
"/",
"var",
"www",
"archtika-websites",
"previews",
websiteData.user_id,
websiteData.id
);
} else {
uploadDir = join("/", "var", "www", "archtika-websites", websiteData.user_id, websiteData.id);
}
await mkdir(uploadDir, { recursive: true });
await writeFile(join(uploadDir, "index.html"), indexFileContents);
await mkdir(join(uploadDir, "articles"), { recursive: true });
for (const article of websiteData.articles ?? []) {
const articleFileName = article.title.toLowerCase().split(" ").join("-");
const { head, body } = render(BlogArticle, {
props: {
title: article.title,
logoType: websiteData.logo_type,
logo: websiteData.logo_text,
coverImage: `${API_BASE_PREFIX}/rpc/retrieve_file?id=${article.cover_image}`,
publicationDate: article.publication_date,
mainContent: md.render(article.main_content ?? ""),
footerAdditionalText: websiteData.additional_text ?? ""
}
});
const articleFileContents = head.concat(body);
await writeFile(join(uploadDir, "articles", `${articleFileName}.html`), articleFileContents);
}
};