/* * This file is a part of the SteamWar software. * * Copyright (C) 2023 SteamWar.de-Serverteam * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ import type { Page, PageList } from "@type/page.ts"; import { fetchWithToken, tokenStore } from "./repo.ts"; import { PageListSchema, PageSchema } from "@type/page.ts"; import { bytesToBase64 } from "../admin/util.ts"; import { z } from "zod"; import { derived } from "svelte/store"; export class PageRepo { constructor(private token: string) {} public async listPages(branch: string = "master"): Promise { return await fetchWithToken(this.token, `/page?branch=${branch}`) .then((value) => value.json()) .then(PageListSchema.parse) .then((value) => value.map((value1) => ({ ...value1, path: value1.path.replace("src/content/", "") }))); } public async getPage(id: number, branch: string = "master"): Promise { return await fetchWithToken(this.token, `/page/${id}?branch=${branch}`) .then((value) => value.json()) .then(PageSchema.parse); } public async updatePage(id: number, content: string, sha: string, message: string, branch: string = "master"): Promise { await fetchWithToken(this.token, `/page/${id}?branch=${branch}`, { method: "PUT", body: JSON.stringify({ content: bytesToBase64(new TextEncoder().encode(content)), sha, message, }), }); } public async getBranches(): Promise { return await fetchWithToken(this.token, "/page/branch") .then((value) => value.json()) .then((value) => z.array(z.string()).parse(value)); } public async createBranch(branch: string): Promise { await fetchWithToken(this.token, "/page/branch", { method: "POST", body: JSON.stringify({ branch }) }); } public async deleteBranch(branch: string): Promise { await fetchWithToken(this.token, "/page/branch", { method: "DELETE", body: JSON.stringify({ branch }) }); } public async createFile(path: string, branch: string = "master", slug: string | null = null, title: string | null = null): Promise { await fetchWithToken(this.token, `/page?branch=${branch}`, { method: "POST", body: JSON.stringify({ path, slug, title }) }); } public async merge(branch: string, message: string): Promise { await fetchWithToken(this.token, "/page/branch/merge", { method: "POST", body: JSON.stringify({ branch, message }), }); } public async deletePage(id: number, message: string, sha: string, branch: string = "master"): Promise { await fetchWithToken(this.token, `/page/${id}?branch=${branch}`, { method: "DELETE", body: JSON.stringify({ message, sha }), }); } public async listImages(branch: string = "master"): Promise { return await fetchWithToken(this.token, `/page/images?branch=${branch}`) .then((value) => value.json()) .then(PageListSchema.parse) .then((value) => value.map((value1) => ({ ...value1, path: value1.path.replace("src/content/", "") }))); } public async createImage(name: string, data: string, branch: string = "master"): Promise { await fetchWithToken(this.token, `/page/images?branch=${branch}`, { method: "POST", body: JSON.stringify({ name, data }), }); } } export const pageRepo = derived(tokenStore, ($token) => new PageRepo($token));