From 776d1a0bcad7bc4eed91d3080ea8159c9b2563cc Mon Sep 17 00:00:00 2001 From: Bad Manners Date: Thu, 5 Dec 2024 21:46:09 -0300 Subject: [PATCH] Move ToS to content collection --- .vscode/settings.json | 3 +++ package-lock.json | 15 ++++++++------- package.json | 7 ++++--- src/content.config.ts | 12 ++++++++++++ src/data/tos.ts | 21 --------------------- src/data/tos/2024-07-11.yaml | 2 ++ src/data/tos/2024-08-25.yaml | 2 ++ src/data/tos_status.ts | 5 +++++ src/pages/feed.xml.ts | 12 ++++++++---- src/pages/terms_of_service.astro | 4 ++-- src/pages/work.astro | 2 +- 11 files changed, 47 insertions(+), 38 deletions(-) create mode 100644 src/content.config.ts delete mode 100644 src/data/tos.ts create mode 100644 src/data/tos/2024-07-11.yaml create mode 100644 src/data/tos/2024-08-25.yaml create mode 100644 src/data/tos_status.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 9ef8ff4..e62e426 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,6 +2,9 @@ "files.associations": { "*.css": "tailwindcss" }, + "yaml.schemas": { + "./.astro/collections/tos.schema.json": "/src/data/tos/**" + }, "[astro]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, diff --git a/package-lock.json b/package-lock.json index 28c7d81..51bf963 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "badmanners.xyz", - "version": "2.3.0", + "version": "2.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "badmanners.xyz", - "version": "2.3.0", + "version": "2.3.1", "hasInstallScript": true, "dependencies": { "@astrojs/alpinejs": "^0.4.0", @@ -16,12 +16,13 @@ "@types/alpinejs": "^3.13.10", "alpinejs": "^3.14.1", "astro": "^5.0.1", - "astro-htaccess": "^0.2.2", + "astro-htaccess": "^0.2.3", "date-fns": "^3.6.0", "tailwindcss": "^3.4.11", "tippy.js": "^6.3.7", "toml": "^3.0.0", - "typescript": "^5.6.2" + "typescript": "^5.6.2", + "yaml": "^2.6.1" }, "devDependencies": { "@types/node": "^22.10.1", @@ -2005,9 +2006,9 @@ } }, "node_modules/astro-htaccess": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/astro-htaccess/-/astro-htaccess-0.2.2.tgz", - "integrity": "sha512-xBtEQIhK5NzQ72YKfpPkzfTYvXz4SNDi1+SmHXObvfsEN5MS/FeWQCcnIYb+f0KrGAr5DVtV0VOTu3sLQZsM5Q==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/astro-htaccess/-/astro-htaccess-0.2.3.tgz", + "integrity": "sha512-9Rraech/5sZi+3V7SsPdhNzoVdh4iLN/nQ0RACylqPs1+s6k025MKnYHuO7AUjXD0gD9iZcpDX/N3r54N15Zeg==", "license": "MIT", "peerDependencies": { "astro": ">= 4.0.0 < 6" diff --git a/package.json b/package.json index 05243e9..00c41d6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "badmanners.xyz", "type": "module", - "version": "2.3.0", + "version": "2.3.1", "scripts": { "postinstall": "astro sync", "dev": "astro dev", @@ -21,12 +21,13 @@ "@types/alpinejs": "^3.13.10", "alpinejs": "^3.14.1", "astro": "^5.0.1", - "astro-htaccess": "^0.2.2", + "astro-htaccess": "^0.2.3", "date-fns": "^3.6.0", "tailwindcss": "^3.4.11", "tippy.js": "^6.3.7", "toml": "^3.0.0", - "typescript": "^5.6.2" + "typescript": "^5.6.2", + "yaml": "^2.6.1" }, "devDependencies": { "@types/node": "^22.10.1", diff --git a/src/content.config.ts b/src/content.config.ts new file mode 100644 index 0000000..b850a6f --- /dev/null +++ b/src/content.config.ts @@ -0,0 +1,12 @@ +import { defineCollection, z } from "astro:content"; +import { glob } from "astro/loaders"; + +const tos = defineCollection({ + loader: glob({ pattern: "*.{yml,yaml}", base: "./src/data/tos" }), + schema: z.object({ + status: z.enum(["CLOSED", "OPEN", "SEMI_OPEN", "PRIVATE"]), + updatedAt: z.date(), + }), +}); + +export const collections = { tos }; diff --git a/src/data/tos.ts b/src/data/tos.ts deleted file mode 100644 index 50130a0..0000000 --- a/src/data/tos.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { parse } from "date-fns"; - -type CommissionStatus = "CLOSED" | "OPEN" | "SEMI_OPEN" | "PRIVATE"; - -interface TosFeedItem { - status: CommissionStatus; - updatedAt: Date; -} - -const d = (date: string) => parse(date, "yyyy-MM-dd", 0); - -export const TOS_FEED: TosFeedItem[] = ( - [ - { status: "CLOSED", updatedAt: d("2024-08-25") }, - { status: "OPEN", updatedAt: d("2024-07-11") }, - ] satisfies TosFeedItem[] -) - .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime()) - .slice(0, 5); - -export const { status: TOS_COMMISSION_STATUS, updatedAt: TOS_UPDATED_AT } = TOS_FEED[0]; diff --git a/src/data/tos/2024-07-11.yaml b/src/data/tos/2024-07-11.yaml new file mode 100644 index 0000000..79565ef --- /dev/null +++ b/src/data/tos/2024-07-11.yaml @@ -0,0 +1,2 @@ +updatedAt: 2024-07-11 +status: OPEN diff --git a/src/data/tos/2024-08-25.yaml b/src/data/tos/2024-08-25.yaml new file mode 100644 index 0000000..8f123c0 --- /dev/null +++ b/src/data/tos/2024-08-25.yaml @@ -0,0 +1,2 @@ +updatedAt: 2024-08-25 +status: CLOSED diff --git a/src/data/tos_status.ts b/src/data/tos_status.ts new file mode 100644 index 0000000..410bc4a --- /dev/null +++ b/src/data/tos_status.ts @@ -0,0 +1,5 @@ +import { getCollection } from "astro:content"; + +export const { status: TOS_COMMISSION_STATUS, updatedAt: TOS_UPDATED_AT } = (await getCollection("tos")).sort( + (a, b) => b.data.updatedAt.getTime() - a.data.updatedAt.getTime(), +)[0].data; diff --git a/src/pages/feed.xml.ts b/src/pages/feed.xml.ts index 91761d4..b9ae64b 100644 --- a/src/pages/feed.xml.ts +++ b/src/pages/feed.xml.ts @@ -1,7 +1,11 @@ import rss from "@astrojs/rss"; import type { APIRoute } from "astro"; -import { set as dateSet, subMinutes } from "date-fns"; -import { TOS_FEED } from "@data/tos"; +import { getCollection } from "astro:content"; +import { addHours } from "date-fns"; + +const TOS_FEED = (await getCollection("tos")) + .sort((a, b) => b.data.updatedAt.getTime() - a.data.updatedAt.getTime()) + .slice(0, 5); export const GET: APIRoute = ({ site }) => { if (!site) { @@ -13,7 +17,7 @@ export const GET: APIRoute = ({ site }) => { site, xmlns: { atom: "http://www.w3.org/2005/Atom" }, customData: ``, - items: TOS_FEED.map(({ status, updatedAt }) => ({ + items: TOS_FEED.map(({ data: { status, updatedAt } }) => ({ title: { CLOSED: "Story commissions are closed.", OPEN: "Story commissions are open!", @@ -21,7 +25,7 @@ export const GET: APIRoute = ({ site }) => { PRIVATE: "Story commissions are private; they are only open to select commissioners.", }[status], link: new URL("terms_of_service", site).toString(), - pubDate: subMinutes(dateSet(updatedAt, { hours: 12, minutes: 0, seconds: 0 }), updatedAt.getTimezoneOffset()), + pubDate: addHours(updatedAt, 12), })), }); }; diff --git a/src/pages/terms_of_service.astro b/src/pages/terms_of_service.astro index 1132c07..389ded2 100644 --- a/src/pages/terms_of_service.astro +++ b/src/pages/terms_of_service.astro @@ -2,7 +2,7 @@ import BaseLayout from "@layouts/BaseLayout.astro"; import { IconSquareRSS } from "@components/icons"; -import { TOS_COMMISSION_STATUS, TOS_UPDATED_AT } from "@data/tos"; +import { TOS_COMMISSION_STATUS, TOS_UPDATED_AT } from "@data/tos_status"; --- @@ -20,7 +20,7 @@ import { TOS_COMMISSION_STATUS, TOS_UPDATED_AT } from "@data/tos";

Last update: {TOS_UPDATED_AT.toLocaleDateString("en-US", { dateStyle: "long", timeZone: "GMT" })}