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;
+}