diff --git a/.env.example b/.env.example index db0f0bb..7079bd0 100644 --- a/.env.example +++ b/.env.example @@ -14,4 +14,4 @@ DISCORD_LINK=http://example.com PAYPAL_LINK=http://example.com SERVER_IP=1.1.1.1 -BASE_PATH=http://localhost:4321 +ROOT_URL=http://localhost:4321/craftattack diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 80e9ffb..271b707 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -31,7 +31,7 @@ jobs: - name: Build website env: - BASE_PATH: ${{ vars.BASE_PATH }} + ROOT_URL: ${{ vars.ROOT_URL }} run: npm run build - name: Deploy diff --git a/astro.config.mjs b/astro.config.mjs index 3a0b847..5406b87 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -11,7 +11,7 @@ import node from '@astrojs/node'; export default defineConfig({ output: 'server', prefetch: true, - base: process.env.BASE_PATH ?? undefined, + base: process.env.ROOT_URL ? new URL(process.env.ROOT_URL).pathname.replace(/^\/+/, '') : undefined, security: { checkOrigin: false @@ -54,8 +54,7 @@ export default defineConfig({ DATABASE_URI: envField.string({ context: 'server', access: 'secret' }), - BASE_HOST: envField.string({ context: 'server', access: 'secret', default: 'http://localhost:4321' }), - BASE_PATH: envField.string({ context: 'server', access: 'secret', default: '/' }), + ROOT_URL: envField.string({ context: 'server', access: 'secret', default: 'http://localhost:4321' }), OPENXBL_API_KEY: envField.string({ context: 'server', access: 'secret', optional: true }) } diff --git a/flake.nix b/flake.nix index cb69c95..9fe86a0 100644 --- a/flake.nix +++ b/flake.nix @@ -28,6 +28,7 @@ let dbPort = 3306; webPort = 4321; + webBasePath = "/craftattack"; dbName = "website"; dbUser = "website"; dbPassword = "website"; @@ -49,8 +50,7 @@ PAYPAL_LINK = "http://example.com"; SERVER_IP = "example.com"; - BASE_HOST = "http://localhost:4321"; - BASE_PATH = "/craftattack"; + ROOT_URL = "http://localhost:${toString webPort}${webBasePath}"; }; webRun = pkgs.writeShellApplication { @@ -114,7 +114,7 @@ readiness_probe.http_get = { host = "127.0.0.1"; port = webPort; - path = devEnv.BASE_PATH; + path = webBasePath; }; }; }; diff --git a/src/db/schema/directSignup.ts b/src/db/schema/directSignup.ts index 783fa6b..d6800bf 100644 --- a/src/db/schema/directSignup.ts +++ b/src/db/schema/directSignup.ts @@ -3,7 +3,7 @@ import { int, mysqlTable, varchar } from 'drizzle-orm/mysql-core'; import { user } from '@db/schema/user.ts'; import { eq } from 'drizzle-orm'; import { generateRandomString } from '@util/random.ts'; -import { BASE_HOST, BASE_PATH } from 'astro:env/server'; +import { siteUrl } from '@util/url.ts'; type Database = MySql2Database<{ directSignup: typeof directSignup }>; @@ -36,7 +36,7 @@ export async function addDirectSignup(db: Database, _values: AddDirectSignupReq) code: code }); - return { code: code, url: `${BASE_HOST}/${BASE_PATH}/signup/${code}` }; + return { code: code, url: siteUrl(`signup/${code}`) }; } export async function setDirectSignupUser(db: Database, values: SetDirectSignupUserReq) { @@ -61,7 +61,7 @@ export async function getDirectSignups(db: Database, _values: GetDirectSignupsRe .from(directSignup) .leftJoin(user, eq(directSignup.userId, user.id)); - return directSignups.map((d) => ({ ...d, url: `${BASE_PATH}/signup/${d.code}` })); + return directSignups.map((d) => ({ ...d, url: siteUrl(`signup/${d.code}`) })); } export async function getDirectSignupByCode(db: Database, values: GetDirectSignupByCodeReq) { diff --git a/src/db/schema/report.ts b/src/db/schema/report.ts index 40d3fa4..78d8247 100644 --- a/src/db/schema/report.ts +++ b/src/db/schema/report.ts @@ -3,7 +3,7 @@ import type { MySql2Database } from 'drizzle-orm/mysql2'; import { and, desc, eq, isNotNull, like } from 'drizzle-orm'; import { reportStatus } from './reportStatus.ts'; import { generateRandomString } from '@util/random.ts'; -import { BASE_HOST, BASE_PATH } from 'astro:env/server'; +import { siteUrl } from '@util/url.ts'; import { strikeReason } from '@db/schema/strikeReason.ts'; import { strike } from '@db/schema/strike.ts'; import { user } from '@db/schema/user.ts'; @@ -70,7 +70,7 @@ export async function addReport(db: Database, values: AddReportReq) { }) .$returningId(); - return Object.assign(r[0], { url: `${BASE_HOST}/${BASE_PATH}/report/${urlHash}` }); + return Object.assign(r[0], { url: siteUrl(`report/${urlHash}`) }); } export async function editReport(db: Database, values: EditReportReq) { diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index 56957e7..f6f70cd 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -1,7 +1,7 @@ --- import '@styles/global.css'; import { ClientRouter } from 'astro:transitions'; -import { BASE_PATH } from 'astro:env/server'; +import { siteBase } from '@util/url.ts'; import logo512 from '@assets/img/logo-512.webp'; import favicon from '@assets/favicon.png'; @@ -36,7 +36,7 @@ const { title, description, keywords, openGraph, viewTransition } = Astro.props; {description && } {keywords && } - + diff --git a/src/pages/admin/admins/index.astro b/src/pages/admin/admins/index.astro index f7517b2..9df1fad 100644 --- a/src/pages/admin/admins/index.astro +++ b/src/pages/admin/admins/index.astro @@ -4,10 +4,10 @@ import Admins from '@app/admin/admins/Admins.svelte'; import SidebarActions from '@app/admin/admins/SidebarActions.svelte'; import { Session } from '@util/session.ts'; import { Permissions } from '@util/permissions.ts'; -import { BASE_PATH } from 'astro:env/server'; +import { siteUrl } from '@util/url.ts'; const session = Session.sessionFromCookies(Astro.cookies, Permissions.Admin); -if (!session) return Astro.redirect(`${BASE_PATH}/admin`); +if (!session) return Astro.redirect(siteUrl('admin')); --- diff --git a/src/pages/admin/admins/strike_reasons.astro b/src/pages/admin/admins/strike_reasons.astro index 43d630e..1e37e5f 100644 --- a/src/pages/admin/admins/strike_reasons.astro +++ b/src/pages/admin/admins/strike_reasons.astro @@ -1,13 +1,13 @@ --- import { Session } from '@util/session'; import { Permissions } from '@util/permissions'; -import { BASE_PATH } from 'astro:env/server'; +import { siteUrl } from '@util/url.ts'; import AdminLayout from '@layouts/admin/AdminLayout.astro'; import SidebarActions from '@app/admin/strikeReasons/SidebarActions.svelte'; import StrikeReasons from '@app/admin/strikeReasons/StrikeReasons.svelte'; const session = Session.sessionFromCookies(Astro.cookies, Permissions.Reports); -if (!session) return Astro.redirect(`${BASE_PATH}/admin`); +if (!session) return Astro.redirect(siteUrl('admin')); --- diff --git a/src/pages/admin/feedback.astro b/src/pages/admin/feedback.astro index 1a192ce..2e895dd 100644 --- a/src/pages/admin/feedback.astro +++ b/src/pages/admin/feedback.astro @@ -3,11 +3,11 @@ import Feedback from '@app/admin/feedback/Feedback.svelte'; import AdminLayout from '@layouts/admin/AdminLayout.astro'; import { Session } from '@util/session.ts'; import { Permissions } from '@util/permissions.ts'; -import { BASE_PATH } from 'astro:env/server'; +import { siteUrl } from '@util/url.ts'; import SidebarActions from '@app/admin/feedback/SidebarActions.svelte'; const session = Session.sessionFromCookies(Astro.cookies, Permissions.Feedback); -if (!session) return Astro.redirect(`${BASE_PATH}/admin`); +if (!session) return Astro.redirect(siteUrl('admin')); --- diff --git a/src/pages/admin/index.astro b/src/pages/admin/index.astro index f1fa10b..7aa3a9f 100644 --- a/src/pages/admin/index.astro +++ b/src/pages/admin/index.astro @@ -1,10 +1,10 @@ --- import { Session } from '@util/session.ts'; -import { BASE_PATH } from 'astro:env/server'; +import { siteUrl } from '@util/url.ts'; import AdminLayout from '@layouts/admin/AdminLayout.astro'; const session = Session.sessionFromCookies(Astro.cookies); -if (!session) return Astro.redirect(`${BASE_PATH}/admin/login`); +if (!session) return Astro.redirect(siteUrl('admin/login')); --- diff --git a/src/pages/admin/reports/index.astro b/src/pages/admin/reports/index.astro index 51aeb23..c844c47 100644 --- a/src/pages/admin/reports/index.astro +++ b/src/pages/admin/reports/index.astro @@ -1,13 +1,13 @@ --- import { Session } from '@util/session'; import { Permissions } from '@util/permissions'; -import { BASE_PATH } from 'astro:env/server'; +import { siteUrl } from '@util/url.ts'; import AdminLayout from '@layouts/admin/AdminLayout.astro'; import SidebarActions from '@app/admin/reports/SidebarActions.svelte'; import Reports from '@app/admin/reports/Reports.svelte'; const session = Session.sessionFromCookies(Astro.cookies, Permissions.Reports); -if (!session) return Astro.redirect(`${BASE_PATH}/admin`); +if (!session) return Astro.redirect(siteUrl('admin')); --- diff --git a/src/pages/admin/settings.astro b/src/pages/admin/settings.astro index c024386..41559cb 100644 --- a/src/pages/admin/settings.astro +++ b/src/pages/admin/settings.astro @@ -4,10 +4,10 @@ import Settings from '@app/admin/settings/Settings.svelte'; import { db } from '@db/database.ts'; import { Session } from '@util/session.ts'; import { Permissions } from '@util/permissions.ts'; -import { BASE_PATH } from 'astro:env/server'; +import { siteUrl } from '@util/url.ts'; const session = Session.sessionFromCookies(Astro.cookies, Permissions.Settings); -if (!session) return Astro.redirect(`${BASE_PATH}/admin`); +if (!session) return Astro.redirect(siteUrl('admin')); const settings = await db.getSettings({}); --- diff --git a/src/pages/admin/tools/index.astro b/src/pages/admin/tools/index.astro index 646f8cb..ce5fa31 100644 --- a/src/pages/admin/tools/index.astro +++ b/src/pages/admin/tools/index.astro @@ -1,12 +1,12 @@ --- import { Session } from '@util/session'; import { Permissions } from '@util/permissions'; -import { BASE_PATH } from 'astro:env/server'; +import { siteUrl } from '@util/url.ts'; import AdminLayout from '@layouts/admin/AdminLayout.astro'; import Tools from '@app/admin/tools/Tools.svelte'; const session = Session.sessionFromCookies(Astro.cookies, Permissions.Tools); -if (!session) return Astro.redirect(`${BASE_PATH}/admin`); +if (!session) return Astro.redirect(siteUrl('admin')); --- diff --git a/src/pages/admin/users/blocked.astro b/src/pages/admin/users/blocked.astro index cb69520..db17146 100644 --- a/src/pages/admin/users/blocked.astro +++ b/src/pages/admin/users/blocked.astro @@ -4,10 +4,10 @@ import BlockedUsers from '@app/admin/blockedUsers/BlockedUsers.svelte'; import SidebarActions from '@app/admin/blockedUsers/SidebarActions.svelte'; import { Session } from '@util/session.ts'; import { Permissions } from '@util/permissions.ts'; -import { BASE_PATH } from 'astro:env/server'; +import { siteUrl } from '@util/url.ts'; const session = Session.sessionFromCookies(Astro.cookies, Permissions.Users); -if (!session) return Astro.redirect(`${BASE_PATH}/admin`); +if (!session) return Astro.redirect(siteUrl('admin')); --- diff --git a/src/pages/admin/users/direct_invitations.astro b/src/pages/admin/users/direct_invitations.astro index e86dcb4..d979c3b 100644 --- a/src/pages/admin/users/direct_invitations.astro +++ b/src/pages/admin/users/direct_invitations.astro @@ -1,13 +1,13 @@ --- import { Session } from '@util/session.ts'; import { Permissions } from '@util/permissions.ts'; -import { BASE_PATH } from 'astro:env/server'; +import { siteUrl } from '@util/url.ts'; import AdminLayout from '@layouts/admin/AdminLayout.astro'; import SidebarActions from '@app/admin/directInvitations/SidebarActions.svelte'; import DirectInvitations from '@app/admin/directInvitations/DirectInvitations.svelte'; const session = Session.sessionFromCookies(Astro.cookies, Permissions.Reports); -if (!session) return Astro.redirect(`${BASE_PATH}/admin`); +if (!session) return Astro.redirect(siteUrl('admin')); --- diff --git a/src/pages/admin/users/index.astro b/src/pages/admin/users/index.astro index a49b911..b389364 100644 --- a/src/pages/admin/users/index.astro +++ b/src/pages/admin/users/index.astro @@ -4,10 +4,10 @@ import Users from '@app/admin/users/Users.svelte'; import SidebarActions from '@app/admin/users/SidebarActions.svelte'; import { Session } from '@util/session.ts'; import { Permissions } from '@util/permissions.ts'; -import { BASE_PATH } from 'astro:env/server'; +import { siteUrl } from '@util/url.ts'; const session = Session.sessionFromCookies(Astro.cookies, Permissions.Users); -if (!session) return Astro.redirect(`${BASE_PATH}/admin`); +if (!session) return Astro.redirect(siteUrl('admin')); --- diff --git a/src/pages/api/feedback/index.ts b/src/pages/api/feedback/index.ts index 67c2bfb..79a6d25 100644 --- a/src/pages/api/feedback/index.ts +++ b/src/pages/api/feedback/index.ts @@ -1,7 +1,7 @@ import { externalApi } from '../_api.ts'; import { z } from 'astro:schema'; import { db } from '@db/database.ts'; -import { BASE_HOST, BASE_PATH } from 'astro:env/server'; +import { siteUrl } from '@util/url.ts'; export const POST = externalApi({ input: z.object({ @@ -19,7 +19,7 @@ export const POST = externalApi({ const response = feedbacks.map((feedback) => ({ uuid: feedback.uuid, - url: `${BASE_HOST}/${BASE_PATH}/feedback/${feedback.urlHash}` + url: siteUrl(`feedback/${feedback.urlHash}`) })); return new Response(JSON.stringify({ feedback: response }), { status: 200 }); diff --git a/src/pages/api/reports/index.ts b/src/pages/api/reports/index.ts index 6bce3b1..ec9014f 100644 --- a/src/pages/api/reports/index.ts +++ b/src/pages/api/reports/index.ts @@ -2,7 +2,7 @@ import { externalApi } from '../_api.ts'; import { z } from 'astro:schema'; import { db } from '@db/database.ts'; import { sendWebhook, WebhookAction } from '@util/webhook.ts'; -import { BASE_HOST, BASE_PATH } from 'astro:env/server'; +import { siteUrl } from '@util/url.ts'; export const GET = externalApi({ auth: true, @@ -17,7 +17,7 @@ export const GET = externalApi({ reason: report.reason, created: report.createdAt?.getTime() ?? null, status: report.status?.status ?? null, - url: `${BASE_HOST}/${BASE_PATH}/report/${report.urlHash}` + url: siteUrl(`report/${report.urlHash}`) })) }), { status: 200 } diff --git a/src/pages/api/users/[...uuid]/reports.ts b/src/pages/api/users/[...uuid]/reports.ts index d6d4f37..3d8b20f 100644 --- a/src/pages/api/users/[...uuid]/reports.ts +++ b/src/pages/api/users/[...uuid]/reports.ts @@ -1,6 +1,6 @@ import { externalApi } from '../../_api.ts'; import { db } from '@db/database.ts'; -import { BASE_HOST, BASE_PATH } from 'astro:env/server'; +import { siteUrl } from '@util/url.ts'; export const GET = externalApi({ auth: true, @@ -18,14 +18,14 @@ export const GET = externalApi({ reason: report.reason, created: report.createdAt?.getTime() ?? null, status: report.status?.status ?? null, - url: `${BASE_HOST}/${BASE_PATH}/report/${report.urlHash}` + url: siteUrl(`report/${report.urlHash}`) })), to_self: toSelf.map((report) => ({ reporter: report.reporter?.uuid ?? null, reason: report.reason, created: report.createdAt?.getTime() ?? null, status: report.status?.status ?? null, - url: `${BASE_HOST}/${BASE_PATH}/report/${report.urlHash}` + url: siteUrl(`report/${report.urlHash}`) })) }), { status: 200 } diff --git a/src/pages/video/[name].astro b/src/pages/video/[name].astro index f7c0f02..2ed539d 100644 --- a/src/pages/video/[name].astro +++ b/src/pages/video/[name].astro @@ -2,7 +2,7 @@ import WebsiteLayout from '@layouts/website/WebsiteLayout.astro'; import VideoPlayer from '@app/website/video/VideoPlayer.svelte'; import { getVideoMetadata, resolveVideo } from '@util/video.ts'; -import { BASE_PATH } from 'astro:env/server'; +import { siteUrl } from '@util/url.ts'; const { name } = Astro.params; @@ -13,13 +13,13 @@ const metadata = await getVideoMetadata(video); if (!metadata) return new Response(null, { status: 404 }); const { title, description, width, height, duration } = metadata; -const streamPath = `${BASE_PATH}/video/${encodeURIComponent(video.name)}/stream`; +const streamUrl = siteUrl(`video/${encodeURIComponent(video.name)}/stream`); --- - + {width && } {height && } @@ -32,7 +32,7 @@ const streamPath = `${BASE_PATH}/video/${encodeURIComponent(video.name)}/stream`

{title}

- + {description && (

{description}

diff --git a/src/util/url.ts b/src/util/url.ts new file mode 100644 index 0000000..499bf9d --- /dev/null +++ b/src/util/url.ts @@ -0,0 +1,11 @@ +import { ROOT_URL } from 'astro:env/server'; + +const rootUrl = new URL(ROOT_URL.endsWith('/') ? ROOT_URL : `${ROOT_URL}/`); + +export function siteBase(): string { + return rootUrl.pathname; +} + +export function siteUrl(path: string): string { + return new URL(path.replace(/^\/+/, ''), rootUrl).href; +}