2024-08-04 16:15:09 +02:00
|
|
|
import { readFile, mkdir, writeFile } from "node:fs/promises";
|
|
|
|
|
import { join } from "node:path";
|
|
|
|
|
import { md } from "$lib/utils";
|
2024-08-05 14:38:44 +02:00
|
|
|
import type { Actions, PageServerLoad } from "./$types";
|
2024-08-14 19:33:41 +02:00
|
|
|
import { API_BASE_PREFIX, NGINX_BASE_PREFIX } from "$lib/utils";
|
2024-08-03 18:07:27 +02:00
|
|
|
|
2024-08-05 14:38:44 +02:00
|
|
|
export const load: PageServerLoad = async ({ params, fetch, cookies, locals }) => {
|
2024-08-14 19:33:41 +02:00
|
|
|
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"
|
|
|
|
|
}
|
2024-08-04 16:15:09 +02:00
|
|
|
}
|
2024-08-14 19:33:41 +02:00
|
|
|
);
|
2024-08-04 16:15:09 +02:00
|
|
|
|
|
|
|
|
const websiteOverview = await websiteOverviewData.json();
|
|
|
|
|
|
2024-08-07 19:13:39 +02:00
|
|
|
generateStaticFiles(websiteOverview);
|
2024-08-04 17:46:41 +02:00
|
|
|
|
2024-08-14 19:33:41 +02:00
|
|
|
const websitePreviewUrl = `${NGINX_BASE_PREFIX}/previews/${websiteOverview.user_id}/${websiteOverview.id}/index.html`;
|
2024-08-10 22:20:57 +02:00
|
|
|
|
2024-08-04 17:46:41 +02:00
|
|
|
return {
|
2024-08-10 22:20:57 +02:00
|
|
|
websiteOverview,
|
|
|
|
|
websitePreviewUrl
|
2024-08-04 17:46:41 +02:00
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
2024-08-05 14:38:44 +02:00
|
|
|
export const actions: Actions = {
|
2024-08-10 22:20:57 +02:00
|
|
|
publishWebsite: async ({ request }) => {
|
2024-08-04 17:46:41 +02:00
|
|
|
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);
|
2024-08-10 22:20:57 +02:00
|
|
|
|
|
|
|
|
return { success: true, message: "Successfully published website" };
|
2024-08-04 17:46:41 +02:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2024-08-07 19:13:39 +02:00
|
|
|
const generateStaticFiles = async (websiteData: any, isPreview: boolean = true) => {
|
2024-08-04 16:15:09 +02:00
|
|
|
const templatePath = join(
|
|
|
|
|
process.cwd(),
|
|
|
|
|
"..",
|
|
|
|
|
"templates",
|
2024-08-04 17:46:41 +02:00
|
|
|
websiteData.content_type.toLowerCase()
|
2024-08-04 16:15:09 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const indexFile = await readFile(join(templatePath, "index.html"), { encoding: "utf-8" });
|
2024-08-04 17:46:41 +02:00
|
|
|
const articleFile = await readFile(join(templatePath, "article.html"), {
|
2024-08-04 16:15:09 +02:00
|
|
|
encoding: "utf-8"
|
|
|
|
|
});
|
2024-08-10 22:20:57 +02:00
|
|
|
const stylesFile = await readFile(join(templatePath, "styles.css"), { encoding: "utf-8" });
|
2024-08-04 16:15:09 +02:00
|
|
|
|
|
|
|
|
const indexFileContents = indexFile
|
2024-08-04 17:46:41 +02:00
|
|
|
.replace(
|
|
|
|
|
"{{logo}}",
|
|
|
|
|
websiteData.logo_type === "text"
|
|
|
|
|
? `<strong>${websiteData.logo_text}</strong>`
|
|
|
|
|
: `<img src="https://picsum.photos/32/32" />`
|
|
|
|
|
)
|
|
|
|
|
.replace("{{title}}", `<h1>${websiteData.title}</h1>`)
|
2024-08-08 20:31:38 +02:00
|
|
|
.replace("{{main_content}}", md.render(websiteData.main_content ?? ""))
|
2024-08-04 17:46:41 +02:00
|
|
|
.replace(
|
|
|
|
|
"{{articles}}",
|
2024-08-08 20:31:38 +02:00
|
|
|
Array.isArray(websiteData.articles) && websiteData.articles.length > 0
|
|
|
|
|
? `
|
|
|
|
|
<h2>Articles</h2>
|
|
|
|
|
${websiteData.articles
|
|
|
|
|
.map(
|
|
|
|
|
(article: { title: string; publication_date: string; meta_description: string }) => {
|
|
|
|
|
const articleFileName = article.title.toLowerCase().split(" ").join("-");
|
|
|
|
|
|
|
|
|
|
return `
|
|
|
|
|
<article>
|
|
|
|
|
<p>${article.publication_date}</p>
|
|
|
|
|
<h3>
|
|
|
|
|
<a href="./articles/${articleFileName}.html">
|
|
|
|
|
${article.title}
|
|
|
|
|
</a>
|
|
|
|
|
</h3>
|
|
|
|
|
<p>${article.meta_description ?? "No description provided"}</p>
|
|
|
|
|
</article>
|
|
|
|
|
`;
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
.join("")}
|
|
|
|
|
`
|
|
|
|
|
: "<h2>Articles</h2><p>No articles available at this time.</p>"
|
2024-08-04 17:46:41 +02:00
|
|
|
)
|
2024-08-08 20:31:38 +02:00
|
|
|
.replace("{{additional_text}}", md.render(websiteData.additional_text ?? ""));
|
2024-08-04 17:46:41 +02:00
|
|
|
|
|
|
|
|
let uploadDir = "";
|
|
|
|
|
|
|
|
|
|
if (isPreview) {
|
2024-08-10 22:20:57 +02:00
|
|
|
uploadDir = join(
|
|
|
|
|
"/",
|
|
|
|
|
"var",
|
|
|
|
|
"www",
|
|
|
|
|
"archtika-websites",
|
|
|
|
|
"previews",
|
|
|
|
|
websiteData.user_id,
|
|
|
|
|
websiteData.id
|
|
|
|
|
);
|
2024-08-04 17:46:41 +02:00
|
|
|
} else {
|
2024-08-08 16:30:01 +02:00
|
|
|
uploadDir = join("/", "var", "www", "archtika-websites", websiteData.user_id, websiteData.id);
|
2024-08-04 17:46:41 +02:00
|
|
|
}
|
2024-08-04 16:15:09 +02:00
|
|
|
|
|
|
|
|
await mkdir(uploadDir, { recursive: true });
|
|
|
|
|
|
|
|
|
|
await writeFile(join(uploadDir, "index.html"), indexFileContents);
|
|
|
|
|
|
|
|
|
|
await mkdir(join(uploadDir, "articles"), { recursive: true });
|
|
|
|
|
|
2024-08-08 20:31:38 +02:00
|
|
|
for (const article of websiteData.articles ?? []) {
|
2024-08-04 16:15:09 +02:00
|
|
|
const articleFileName = article.title.toLowerCase().split(" ").join("-");
|
|
|
|
|
|
2024-08-04 17:46:41 +02:00
|
|
|
const articleFileContents = articleFile
|
|
|
|
|
.replace(
|
|
|
|
|
"{{logo}}",
|
|
|
|
|
websiteData.logo_type === "text"
|
|
|
|
|
? `<strong>${websiteData.logo_text}</strong>`
|
|
|
|
|
: `<img src="https://picsum.photos/32/32" />`
|
|
|
|
|
)
|
2024-08-10 22:20:57 +02:00
|
|
|
.replace(
|
|
|
|
|
"{{cover_image}}",
|
2024-08-14 19:33:41 +02:00
|
|
|
`<img src="${article.cover_image ? `${API_BASE_PREFIX}/rpc/retrieve_file?id=${article.cover_image}` : "https://picsum.photos/600/200"}" />`
|
2024-08-10 22:20:57 +02:00
|
|
|
)
|
2024-08-04 17:46:41 +02:00
|
|
|
.replace("{{title}}", `<h1>${article.title}</h1>`)
|
|
|
|
|
.replace("{{publication_date}}", `<p>${article.publication_date}</p>`)
|
2024-08-08 20:31:38 +02:00
|
|
|
.replace("{{main_content}}", md.render(article.main_content ?? ""))
|
|
|
|
|
.replace("{{additional_text}}", md.render(websiteData.additional_text ?? ""));
|
2024-08-03 18:07:27 +02:00
|
|
|
|
2024-08-04 17:46:41 +02:00
|
|
|
await writeFile(join(uploadDir, "articles", `${articleFileName}.html`), articleFileContents);
|
2024-08-03 18:07:27 +02:00
|
|
|
}
|
2024-08-10 22:20:57 +02:00
|
|
|
|
|
|
|
|
await writeFile(join(uploadDir, "styles.css"), stylesFile);
|
2024-08-03 18:07:27 +02:00
|
|
|
};
|