From 496ba125d0df6b346d677d1de6553700a0e86240 Mon Sep 17 00:00:00 2001 From: haetae Date: Wed, 13 Aug 2025 04:16:34 -0400 Subject: [PATCH] adding a lot to admin, mess around with dev-only routes --- .gitignore | 3 + .vscode/settings.json | 11 +- astro.config.mjs | 11 +- bun.lock | 18 ++- package.json | 8 +- src/actions/guestbook.ts | 118 ++++++++++----- src/assets/acnl-bulletin.png | Bin 0 -> 31484 bytes .../{buttons.png => guild-bbs-buttons.png} | Bin src/assets/moon-bullet.gif | Bin 0 -> 61 bytes src/assets/{border.png => pmd-border.png} | Bin src/assets/{frame.png => pmd-frame.png} | Bin src/assets/star-bullet.gif | Bin 0 -> 62 bytes src/components/Dialog.astro | 90 +++++++++++ src/components/Entries.astro | 30 +++- src/layouts/About.astro | 10 +- src/layouts/Blog.astro | 18 +-- src/layouts/Layout.astro | 38 ++--- src/pages/about.md | 1 + src/pages/blog/[...id].astro | 2 +- src/pages/blog/rss.xml.ts | 15 +- src/pages/guestbook/admin.astro | 101 +++++++++++-- src/pages/guestbook/index.astro | 84 +---------- src/pages/index.astro | 142 ++++++++++++------ 23 files changed, 478 insertions(+), 222 deletions(-) create mode 100644 src/assets/acnl-bulletin.png rename src/assets/{buttons.png => guild-bbs-buttons.png} (100%) create mode 100644 src/assets/moon-bullet.gif rename src/assets/{border.png => pmd-border.png} (100%) rename src/assets/{frame.png => pmd-frame.png} (100%) create mode 100644 src/assets/star-bullet.gif create mode 100644 src/components/Dialog.astro diff --git a/.gitignore b/.gitignore index 016b59e..b67e3c5 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,6 @@ pnpm-debug.log* # jetbrains setting folder .idea/ + +# dont grab database files you dont need that +local.db \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 3662b37..1170042 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,12 @@ { - "typescript.tsdk": "node_modules/typescript/lib" + "typescript.tsdk": "node_modules/typescript/lib", + "sqltools.useNodeRuntime": true, + "sqltools.connections": [ + { + "previewLimit": 50, + "driver": "SQLite", + "database": "./guestbook.db", + "name": "test" + } + ] } \ No newline at end of file diff --git a/astro.config.mjs b/astro.config.mjs index 34eb68b..cdc084c 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -3,8 +3,8 @@ import { defineConfig } from 'astro/config'; import { modifiedTime } from './src/utils/lastModified.mjs'; import mdx from "@astrojs/mdx"; import db from "@astrojs/db"; - import node from "@astrojs/node"; +import devOnlyRoutes from '@fujocoded/astro-dev-only'; // https://astro.build/config export default defineConfig({ @@ -13,7 +13,14 @@ export default defineConfig({ remarkPlugins: [modifiedTime], smartypants: false, }, - integrations: [mdx(), db()], + integrations: [ + mdx(), + db(), + devOnlyRoutes({ + // dryRun: true, + routePatterns: ["/guestbook/admin"] + }), + ], adapter: node({ mode: "standalone", }), diff --git a/bun.lock b/bun.lock index 8966634..04b3c2a 100644 --- a/bun.lock +++ b/bun.lock @@ -6,11 +6,11 @@ "dependencies": { "@astrojs/db": "^0.16.1", "@astrojs/mdx": "^4.3.3", - "@astrojs/node": "^9.3.3", + "@astrojs/node": "^9.4.0", "@astrojs/rss": "4.0.12", + "@fujocoded/astro-dev-only": "0.0.3", "astro": "5.12.3", "astro-breadcrumbs": "^3.3.1", - "bcryptjs": "^3.0.2", "dayjs": "^1.11.13", "markdown-it": "^14.1.0", "node-html-parser": "^7.0.1", @@ -18,7 +18,7 @@ }, "devDependencies": { "@types/markdown-it": "^14.1.2", - "@types/node": "^22.17.0", + "@types/node": "^22.17.1", "@types/sanitize-html": "^2.16.0", }, }, @@ -34,7 +34,7 @@ "@astrojs/mdx": ["@astrojs/mdx@4.3.3", "", { "dependencies": { "@astrojs/markdown-remark": "6.3.5", "@mdx-js/mdx": "^3.1.0", "acorn": "^8.14.1", "es-module-lexer": "^1.6.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", "kleur": "^4.1.5", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", "source-map": "^0.7.4", "unist-util-visit": "^5.0.0", "vfile": "^6.0.3" }, "peerDependencies": { "astro": "^5.0.0" } }, "sha512-+9+xGP2TBXxcm84cpiq4S9JbuHOHM1fcvREfqW7VHxlUyfUQPByoJ9YYliqHkLS6BMzG+O/+o7n8nguVhuEv4w=="], - "@astrojs/node": ["@astrojs/node@9.3.3", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.1", "send": "^1.2.0", "server-destroy": "^1.0.1" }, "peerDependencies": { "astro": "^5.3.0" } }, "sha512-5jVuDbSxrY7rH7H+6QoRiN78AITLobYXWu+t1A2wRaFPKywaXNr8YHSXfOE4i2YN4c+VqMCv83SjZLWjTK6f9w=="], + "@astrojs/node": ["@astrojs/node@9.4.0", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.1", "send": "^1.2.0", "server-destroy": "^1.0.1" }, "peerDependencies": { "astro": "^5.3.0" } }, "sha512-Gxs0iVUvOmQmK+H1DBoabcgvdSDg277SwbujRv2cUBlnpcOTJQDFRhRvyJ7G+Zkd06/jhRphsTTmmrBY0PqI4g=="], "@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="], @@ -106,6 +106,8 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.8", "", { "os": "win32", "cpu": "x64" }, "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw=="], + "@fujocoded/astro-dev-only": ["@fujocoded/astro-dev-only@0.0.3", "", {}, "sha512-BOLYZcivrJVUA60d4R2+yEGwDJZ+3Z/zndLACxk6YpClu5ETl0adghwCCt9yIHsq79KDx/Or8LH2aqS6fVlQbg=="], + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], @@ -262,7 +264,7 @@ "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="], - "@types/node": ["@types/node@22.17.0", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-bbAKTCqX5aNVryi7qXVMi+OkB3w/OyblodicMbvE38blyAz7GxXf6XYhklokijuPwwVg9sDLKRxt0ZHXQwZVfQ=="], + "@types/node": ["@types/node@22.17.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-y3tBaz+rjspDTylNjAX37jEC3TETEFGNJL6uQDxwF9/8GLLIjW1rvVHlynyuUKMnMr1Roq8jOv3vkopBjC4/VA=="], "@types/sanitize-html": ["@types/sanitize-html@2.16.0", "", { "dependencies": { "htmlparser2": "^8.0.0" } }, "sha512-l6rX1MUXje5ztPT0cAFtUayXF06DqPhRyfVXareEN5gGCFaP/iwsxIyKODr9XDhfxPpN6vXUFNfo5kZMXCxBtw=="], @@ -304,8 +306,6 @@ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - "bcryptjs": ["bcryptjs@3.0.2", "", { "bin": { "bcrypt": "bin/bcrypt" } }, "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog=="], - "blob-to-buffer": ["blob-to-buffer@1.2.9", "", {}, "sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA=="], "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], @@ -952,6 +952,10 @@ "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + "@types/fontkit/@types/node": ["@types/node@22.17.0", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-bbAKTCqX5aNVryi7qXVMi+OkB3w/OyblodicMbvE38blyAz7GxXf6XYhklokijuPwwVg9sDLKRxt0ZHXQwZVfQ=="], + + "@types/ws/@types/node": ["@types/node@22.17.0", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-bbAKTCqX5aNVryi7qXVMi+OkB3w/OyblodicMbvE38blyAz7GxXf6XYhklokijuPwwVg9sDLKRxt0ZHXQwZVfQ=="], + "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], diff --git a/package.json b/package.json index 8864d8a..68fe9ad 100644 --- a/package.json +++ b/package.json @@ -4,18 +4,18 @@ "version": "0.0.1", "scripts": { "dev": "astro dev", - "build": "astro build", + "build": "astro build --remote", "preview": "astro preview", "astro": "astro" }, "dependencies": { "@astrojs/db": "^0.16.1", "@astrojs/mdx": "^4.3.3", - "@astrojs/node": "^9.3.3", + "@astrojs/node": "^9.4.0", "@astrojs/rss": "4.0.12", + "@fujocoded/astro-dev-only": "0.0.3", "astro": "5.12.3", "astro-breadcrumbs": "^3.3.1", - "bcryptjs": "^3.0.2", "dayjs": "^1.11.13", "markdown-it": "^14.1.0", "node-html-parser": "^7.0.1", @@ -23,7 +23,7 @@ }, "devDependencies": { "@types/markdown-it": "^14.1.2", - "@types/node": "^22.17.0", + "@types/node": "^22.17.1", "@types/sanitize-html": "^2.16.0" } } diff --git a/src/actions/guestbook.ts b/src/actions/guestbook.ts index 97eaf5a..8ab6e4a 100644 --- a/src/actions/guestbook.ts +++ b/src/actions/guestbook.ts @@ -1,6 +1,6 @@ import { ActionError, defineAction } from "astro:actions"; import { z } from "astro:content"; -import { db, eq, Guestbook } from "astro:db"; +import { db, eq, Guestbook, isDbError } from "astro:db"; import sanitize from "sanitize-html"; export const guestbook = { @@ -12,42 +12,92 @@ export const guestbook = { message: z.string().min(1, "Can't be that short..."), }), handler: async ({ username, website, message }) => { - // figure out how to add line breaks and THEN sanitize message - const addLine = message.replaceAll("/n", "
"); - sanitize(addLine); + const addLine = message.replaceAll(/\r?\n/g, "
"); + const sanitized = sanitize(addLine, { allowedTags: ["br"] }); - const entry = await db.insert(Guestbook).values({ - username, - website, - message, - }).returning(); - - return entry[0]; + try { + const entry = await db.insert(Guestbook).values({ + username, + website, + message: sanitized, + }).returning(); + + return entry[0]; + } catch (e) { + if (isDbError(e)) { + return new Response(`Cannot insert entry\n\n${e.message}`, { status: 400 }); + } + return new Response('An unexpected error occurred', { status: 500 }); + } }, }), - reply: defineAction({ - accept: "form", - input: z.object({ - id: z.number(), - reply: z.string(), + ...import.meta.env.DEV && { + reply: defineAction({ + accept: "form", + input: z.object({ + id: z.coerce.number(), + reply: z.string(), + }), + handler: async ({ id, reply }) => { + if (!import.meta.env.DEV) { + throw new ActionError({ code: "UNAUTHORIZED" }); + } + + const entry = await db.select().from(Guestbook).where(eq(Guestbook.id, id)); + if (!entry) { + throw new ActionError({ + code: "NOT_FOUND", + message: "That entry doesn't exist!" + }); + } + + const addLine = reply.replaceAll(/\r?\n/g, "
"); + const sanitized = sanitize(addLine, { allowedTags: ["br"] }); + + try { + const update = await db.update(Guestbook).set({ + reply: sanitized, + updated: new Date(), + }).where(eq(Guestbook.id, id)).returning(); + + return update[0]; + } catch (e) { + if (isDbError(e)) { + return new Response(`Cannot update entry\n\n${e.message}`, { status: 400 }); + } + return new Response('An unexpected error occurred', { status: 500 }); + } + }, }), - handler: async ({ id, reply }, context) => { - if (context.url.hostname !== "127.0.0.1" || "localhost") { - throw new ActionError({ code: "UNAUTHORIZED" }); - } + deleteEntry: defineAction({ + accept: "form", + input: z.object({ + id: z.coerce.number() + }), + handler: async ({ id }) => { + if (!import.meta.env.DEV) { + throw new ActionError({ code: "UNAUTHORIZED" }); + } + + const entry = await db.select().from(Guestbook).where(eq(Guestbook.id, id)); + if (!entry) { + throw new ActionError({ + code: "NOT_FOUND", + message: "That entry doesn't exist!" + }); + } - const entry = await db.select().from(Guestbook).where(eq(Guestbook.id, id)); - if (!entry) { - throw new ActionError({ - code: "NOT_FOUND", - message: "That entry doesn't exist!" - }); - } - - // sanitize reply here - - const update = await db.update(Guestbook).set({ reply }).where(eq(Guestbook.id, id)).returning(); - return update[0]; - }, - }), + try { + const entry = await db.delete(Guestbook).where(eq(Guestbook.id, id)).returning(); + + return entry[0]; + } catch (e) { + if (isDbError(e)) { + return new Response(`Cannot update entry\n\n${e.message}`, { status: 400 }); + } + return new Response('An unexpected error occurred', { status: 500 }); + } + }, + }), + }, }; \ No newline at end of file diff --git a/src/assets/acnl-bulletin.png b/src/assets/acnl-bulletin.png new file mode 100644 index 0000000000000000000000000000000000000000..0ef22db9439dd152e9679e8777e781851e4af3e7 GIT binary patch literal 31484 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 literal 0 HcmV?d00001 diff --git a/src/assets/buttons.png b/src/assets/guild-bbs-buttons.png similarity index 100% rename from src/assets/buttons.png rename to src/assets/guild-bbs-buttons.png diff --git a/src/assets/moon-bullet.gif b/src/assets/moon-bullet.gif new file mode 100644 index 0000000000000000000000000000000000000000..29a3cac8456143843b41ae656dcdae7ad72ee5b1 GIT binary patch literal 61 zcmZ?wbhEHbWM^P!n8?IX;;sDuqVfO#{}~t<6o0ZXGB7YP=m6P3S#}_sZ%RWMBiBKh NoM*n4nqI67)&SpM4wL`@ literal 0 HcmV?d00001 diff --git a/src/assets/border.png b/src/assets/pmd-border.png similarity index 100% rename from src/assets/border.png rename to src/assets/pmd-border.png diff --git a/src/assets/frame.png b/src/assets/pmd-frame.png similarity index 100% rename from src/assets/frame.png rename to src/assets/pmd-frame.png diff --git a/src/assets/star-bullet.gif b/src/assets/star-bullet.gif new file mode 100644 index 0000000000000000000000000000000000000000..2947b894566853c29987b87689bba10a2d1a1564 GIT binary patch literal 62 zcmZ?wbhEHbWM^P!n8?IX;;r0sbl?B~{}~t<6o0aCN-{7p=m6P3S#|~nCjKdjoQ>NX Q!e;oK$dcR^Bf?+}0RHL_VE_OC literal 0 HcmV?d00001 diff --git a/src/components/Dialog.astro b/src/components/Dialog.astro new file mode 100644 index 0000000..fd1010b --- /dev/null +++ b/src/components/Dialog.astro @@ -0,0 +1,90 @@ +--- +interface Props { + id?: string; + title?: string; + class?: string; +} + +const { id, title, class: className, ...rest } = Astro.props; +--- + + +
+ + {title &&
{title}
} + +
+
+ +
+ +
+
+ + \ No newline at end of file diff --git a/src/components/Entries.astro b/src/components/Entries.astro index a9f25da..25312ac 100644 --- a/src/components/Entries.astro +++ b/src/components/Entries.astro @@ -1,6 +1,7 @@ --- import { db, desc, Guestbook } from "astro:db"; import formatDate from "@/utils/formatDate"; +import pikachu from "$/images/portrait-0025.png"; const entries = await db.select().from(Guestbook).orderBy(desc(Guestbook.published)); --- @@ -20,13 +21,14 @@ const entries = await db.select().from(Guestbook).orderBy(desc(Guestbook.publish - {entry.message} +
+ +
- {entry.reply && help -
- + {entry.reply &&
+ a portrait of pikachu

Reply to {entry.username}

@@ -35,16 +37,24 @@ const entries = await db.select().from(Guestbook).orderBy(desc(Guestbook.publish
- {entry.reply} +
+ +
} ))} + {entries.length === 0 && ( +
+

Huh...

+

There's nothing here! Want to be the first to comment?

+
+ )} \ No newline at end of file diff --git a/src/layouts/About.astro b/src/layouts/About.astro index 1ec42e2..e515f89 100644 --- a/src/layouts/About.astro +++ b/src/layouts/About.astro @@ -5,8 +5,8 @@ import Layout from "./Layout.astro"; import Navbar from "~/Navbar.astro"; import Figure from "~/Figure.astro"; -import border from "$/border.png"; -import frame from "$/frame.png"; +import border from "$/pmd-border.png"; +import frame from "$/pmd-frame.png"; type Props = MarkdownLayoutProps<{ avatar?: string; @@ -30,6 +30,10 @@ const { frontmatter } = Astro.props;
+ +
+ hi +
\ No newline at end of file diff --git a/src/pages/guestbook/index.astro b/src/pages/guestbook/index.astro index b8f1a6d..4c4bd0b 100644 --- a/src/pages/guestbook/index.astro +++ b/src/pages/guestbook/index.astro @@ -5,6 +5,7 @@ import { Font } from "astro:assets"; import Layout from "@/layouts/Layout.astro"; import speech from "$/speech.png"; import Entries from "~/Entries.astro"; +import Dialog from "~/Dialog.astro"; const result = Astro.getActionResult(actions.guestbook.addEntry); const inputErrors = isInputError(result?.error) ? result.error.fields : {}; @@ -19,6 +20,7 @@ const inputErrors = isInputError(result?.error) ? result.error.fields : {};

Guestbook

+ {import.meta.env.DEV &&

for your eyes only...

}
@@ -43,20 +45,9 @@ const inputErrors = isInputError(result?.error) ? result.error.fields : {};

Loading...

- - - - - - Successfully posted! Refreshing in 5 seconds. - -
- -
- hi -
+ + Successfully posted! Refreshing in 5 seconds. + @@ -91,70 +82,6 @@ const inputErrors = isInputError(result?.error) ? result.error.fields : {}; color: color-mix(in oklab, var(--fg-color) 80%, var(--bg-color)); } } - - #notification { - margin: auto; - max-width: 35ch; - color: var(--fg-color); - background: var(--bg-color); - transition: - display 1s allow-discrete, - overlay 1s allow-discrete; - animation: fadeOut 1s forwards; - - menu { - position: absolute; - top: 0; - right: 0; - width: calc(100% - 4px); - display: flex; - justify-content: end; - padding: 2px; - margin: 2px 2px 0; - background-color: color-mix(in oklab, var(--bg-color) 95%, var(--fg-color)); - border: 2px solid var(--fg-color); - line-height: 1; - - button { - padding: 0; - box-shadow: none; - line-height: 1; - transform: none; - display: grid; - place-content: center; - width: 44px; - height: 44px; - - span { transform: translateY(-2px); } - - &:focus { - border: 4px inset var(--secondary-color); - outline: 2px solid var(--fg-color); - box-shadow: none; - - span { transform: translateY(0); } - } - } - } - - form { - margin-top: calc(44px + 2px); - } - - &[open] { - animation: fadeIn 1.0s forwards; - } - } - - @keyframes fadeIn { - from { opacity: 0; } - to { opacity: 1; } - } - - @keyframes fadeOut { - from { opacity: 1; } - to { opacity: 0; } - }