From e797f0ab1d7c4122c02c419a53a65859c06ee760 Mon Sep 17 00:00:00 2001 From: Chris Amico Date: Thu, 3 Oct 2024 14:02:54 -0400 Subject: [PATCH] Flatpage routes now raise a 404 when they should --- src/lib/api/flatpages.ts | 41 +++++++++++++++++------ src/lib/api/tests/flatpages.test.ts | 35 +++++++++++++++++++ src/routes/(pages)/[...path]/+page.svelte | 4 +-- src/routes/(pages)/[...path]/+page.ts | 20 +++++------ src/routes/(pages)/home/+page.ts | 19 ++++------- 5 files changed, 81 insertions(+), 38 deletions(-) create mode 100644 src/lib/api/tests/flatpages.test.ts diff --git a/src/lib/api/flatpages.ts b/src/lib/api/flatpages.ts index f6acbb2c5..86f0a255a 100644 --- a/src/lib/api/flatpages.ts +++ b/src/lib/api/flatpages.ts @@ -1,18 +1,37 @@ -import type { Flatpage } from "./types"; +import type { APIResponse, Flatpage } from "./types"; + import { BASE_API_URL } from "@/config/config"; +import { getApiResponse } from "$lib/utils/api"; +/** + * Return the tip of the day flatpage + * @param fetch + */ export async function getTipOfDay( fetch = globalThis.fetch, ): Promise { - const endpoint = new URL("flatpages/tipofday/", BASE_API_URL); - try { - const resp = await fetch(endpoint, { credentials: "include" }).catch( - console.error, - ); - if (!resp) return; - if (!resp.ok) return; - return resp.json(); - } catch (e) { - return; + const { data, error } = await get("/tipofday/", fetch); + if (!error) { + return data; } } + +/** + * Get a single flat page + * @param path + * @param fetch + */ +export async function get( + path: string, + fetch = globalThis.fetch, +): Promise> { + if (!path.startsWith("/")) { + path = "/" + path; + } + + const endpoint = new URL("flatpages" + path, BASE_API_URL); + console.log(endpoint.href); + const resp = await fetch(endpoint, { credentials: "include" }); + + return getApiResponse(resp); +} diff --git a/src/lib/api/tests/flatpages.test.ts b/src/lib/api/tests/flatpages.test.ts new file mode 100644 index 000000000..e2f91f356 --- /dev/null +++ b/src/lib/api/tests/flatpages.test.ts @@ -0,0 +1,35 @@ +import { afterEach, describe, expect, test, vi } from "vitest"; + +import { BASE_API_URL } from "@/config/config"; +import { flatpage } from "@/test/fixtures/flatpages"; +import * as flatpages from "../flatpages"; + +describe("flatpages", () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("flatpages.get", async () => { + const mockFetch = vi.fn().mockImplementation(async (endpoint, options) => { + return { + ok: true, + status: 200, + async json() { + return flatpage; + }, + }; + }); + + const { error, data } = await flatpages.get(flatpage.url, mockFetch); + + expect(error).toBeUndefined(); + expect(data).toEqual(flatpage); + + expect(mockFetch).toHaveBeenCalledWith( + new URL("/api/flatpages" + flatpage.url, BASE_API_URL), + { + credentials: "include", + }, + ); + }); +}); diff --git a/src/routes/(pages)/[...path]/+page.svelte b/src/routes/(pages)/[...path]/+page.svelte index b12b67a93..fe1c76220 100644 --- a/src/routes/(pages)/[...path]/+page.svelte +++ b/src/routes/(pages)/[...path]/+page.svelte @@ -3,8 +3,8 @@ export let data; - $: title = data.data.title; - $: content = data.data.content; + $: title = data.title; + $: content = data.content; diff --git a/src/routes/(pages)/[...path]/+page.ts b/src/routes/(pages)/[...path]/+page.ts index d90716626..4c246c88c 100644 --- a/src/routes/(pages)/[...path]/+page.ts +++ b/src/routes/(pages)/[...path]/+page.ts @@ -1,19 +1,15 @@ // load data for flatpages -import { redirect } from "@sveltejs/kit"; +import { error } from "@sveltejs/kit"; import { BASE_API_URL } from "@/config/config.js"; -import { isRedirectCode } from "@/lib/utils/api"; -import { getApiResponse } from "$lib/utils/api"; -import type { Flatpage } from "@/lib/api/types.js"; -const ROOT = new URL("flatpages/", BASE_API_URL); +import * as flatpages from "$lib/api/flatpages"; -/** @type {import('./$types').PageLoad} */ export async function load({ fetch, params }) { - const endpoint = new URL(params.path, ROOT); - const resp = await fetch(endpoint, { credentials: "include" }); - // we should be following redirects, so this shouldn't happen - if (isRedirectCode(resp.status)) { - redirect(resp.status, resp.headers.get("Location")); + const { data, error: err } = await flatpages.get(params.path, fetch); + + if (err) { + return error(err.status, { message: err.message }); } - return getApiResponse(resp); + + return data; } diff --git a/src/routes/(pages)/home/+page.ts b/src/routes/(pages)/home/+page.ts index 8bd97e6d0..8a26dd2b4 100644 --- a/src/routes/(pages)/home/+page.ts +++ b/src/routes/(pages)/home/+page.ts @@ -1,27 +1,20 @@ // load homepage data import { error } from "@sveltejs/kit"; +import DOMPurify from "isomorphic-dompurify"; import { marked } from "marked"; import { gfmHeadingId } from "marked-gfm-heading-id"; -import DOMPurify from "isomorphic-dompurify"; -import { BASE_API_URL } from "@/config/config.js"; -import { isErrorCode } from "@/lib/utils/api"; +import * as flatpages from "$lib/api/flatpages"; marked.use(gfmHeadingId()); -const ROOT = new URL("flatpages/", BASE_API_URL); -const endpoint = new URL("home/", ROOT); - -/** @type {import('./$types').PageLoad} */ export async function load({ fetch }) { - const resp = await fetch(endpoint, { credentials: "include" }); + const { data: page, error: err } = await flatpages.get("/home/", fetch); - if (isErrorCode(resp.status)) { - error(resp.status, resp.statusText); + if (err) { + return error(err.status, { message: err.message }); } - const page = await resp.json(); - return { title: page.title, url: page.url, @@ -29,6 +22,6 @@ export async function load({ fetch }) { }; } -function render(content) { +function render(content: string): string { return DOMPurify.sanitize(marked.parse(content)); }