merge BASE_URL and BASE_PASH into ROOT_URL

This commit is contained in:
bytedream committed 2026-10-31 03:18:42 +01:00
1 parent e0a0b188ad
commit e22c664aae
22 files changed
+56 -46

No files matched your search

+1 -1
View File
@@ -14,4 +14,4 @@ DISCORD_LINK=http://example.com
PAYPAL_LINK=http://example.com PAYPAL_LINK=http://example.com
SERVER_IP=1.1.1.1 SERVER_IP=1.1.1.1
BASE_PATH=http://localhost:4321 ROOT_URL=http://localhost:4321/craftattack
+1 -1
View File
@@ -31,7 +31,7 @@ jobs:
- name: Build website - name: Build website
env: env:
BASE_PATH: ${{ vars.BASE_PATH }} ROOT_URL: ${{ vars.ROOT_URL }}
run: npm run build run: npm run build
- name: Deploy - name: Deploy
+2 -3
View File
@@ -11,7 +11,7 @@ import node from '@astrojs/node';
export default defineConfig({ export default defineConfig({
output: 'server', output: 'server',
prefetch: true, prefetch: true,
base: process.env.BASE_PATH ?? undefined, base: process.env.ROOT_URL ? new URL(process.env.ROOT_URL).pathname.replace(/^\/+/, '') : undefined,
security: { security: {
checkOrigin: false checkOrigin: false
@@ -54,8 +54,7 @@ export default defineConfig({
DATABASE_URI: envField.string({ context: 'server', access: 'secret' }), DATABASE_URI: envField.string({ context: 'server', access: 'secret' }),
BASE_HOST: envField.string({ context: 'server', access: 'secret', default: 'http://localhost:4321' }), ROOT_URL: envField.string({ context: 'server', access: 'secret', default: 'http://localhost:4321' }),
BASE_PATH: envField.string({ context: 'server', access: 'secret', default: '/' }),
OPENXBL_API_KEY: envField.string({ context: 'server', access: 'secret', optional: true }) OPENXBL_API_KEY: envField.string({ context: 'server', access: 'secret', optional: true })
} }
+3 -3
View File
@@ -28,6 +28,7 @@
let let
dbPort = 3306; dbPort = 3306;
webPort = 4321; webPort = 4321;
webBasePath = "/craftattack";
dbName = "website"; dbName = "website";
dbUser = "website"; dbUser = "website";
dbPassword = "website"; dbPassword = "website";
@@ -49,8 +50,7 @@
PAYPAL_LINK = "http://example.com"; PAYPAL_LINK = "http://example.com";
SERVER_IP = "example.com"; SERVER_IP = "example.com";
BASE_HOST = "http://localhost:4321"; ROOT_URL = "http://localhost:${toString webPort}${webBasePath}";
BASE_PATH = "/craftattack";
}; };
webRun = pkgs.writeShellApplication { webRun = pkgs.writeShellApplication {
@@ -114,7 +114,7 @@
readiness_probe.http_get = { readiness_probe.http_get = {
host = "127.0.0.1"; host = "127.0.0.1";
port = webPort; port = webPort;
path = devEnv.BASE_PATH; path = webBasePath;
}; };
}; };
}; };
+3 -3
View File
@@ -3,7 +3,7 @@ import { int, mysqlTable, varchar } from 'drizzle-orm/mysql-core';
import { user } from '@db/schema/user.ts'; import { user } from '@db/schema/user.ts';
import { eq } from 'drizzle-orm'; import { eq } from 'drizzle-orm';
import { generateRandomString } from '@util/random.ts'; 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 }>; type Database = MySql2Database<{ directSignup: typeof directSignup }>;
@@ -36,7 +36,7 @@ export async function addDirectSignup(db: Database, _values: AddDirectSignupReq)
code: code 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) { export async function setDirectSignupUser(db: Database, values: SetDirectSignupUserReq) {
@@ -61,7 +61,7 @@ export async function getDirectSignups(db: Database, _values: GetDirectSignupsRe
.from(directSignup) .from(directSignup)
.leftJoin(user, eq(directSignup.userId, user.id)); .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) { export async function getDirectSignupByCode(db: Database, values: GetDirectSignupByCodeReq) {
+2 -2
View File
@@ -3,7 +3,7 @@ import type { MySql2Database } from 'drizzle-orm/mysql2';
import { and, desc, eq, isNotNull, like } from 'drizzle-orm'; import { and, desc, eq, isNotNull, like } from 'drizzle-orm';
import { reportStatus } from './reportStatus.ts'; import { reportStatus } from './reportStatus.ts';
import { generateRandomString } from '@util/random.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 { strikeReason } from '@db/schema/strikeReason.ts';
import { strike } from '@db/schema/strike.ts'; import { strike } from '@db/schema/strike.ts';
import { user } from '@db/schema/user.ts'; import { user } from '@db/schema/user.ts';
@@ -70,7 +70,7 @@ export async function addReport(db: Database, values: AddReportReq) {
}) })
.$returningId(); .$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) { export async function editReport(db: Database, values: EditReportReq) {
+2 -2
View File
@@ -1,7 +1,7 @@
--- ---
import '@styles/global.css'; import '@styles/global.css';
import { ClientRouter } from 'astro:transitions'; 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 logo512 from '@assets/img/logo-512.webp';
import favicon from '@assets/favicon.png'; import favicon from '@assets/favicon.png';
@@ -36,7 +36,7 @@ const { title, description, keywords, openGraph, viewTransition } = Astro.props;
<slot name="head" /> <slot name="head" />
{description && <meta name="description" content={description} />} {description && <meta name="description" content={description} />}
{keywords && <meta name="keywords" content={keywords.join(', ')} />} {keywords && <meta name="keywords" content={keywords.join(', ')} />}
<base href=`${BASE_PATH}/` /> <base href={siteBase()} />
</head> </head>
<body> <body>
<slot /> <slot />
+2 -2
View File
@@ -4,10 +4,10 @@ import Admins from '@app/admin/admins/Admins.svelte';
import SidebarActions from '@app/admin/admins/SidebarActions.svelte'; import SidebarActions from '@app/admin/admins/SidebarActions.svelte';
import { Session } from '@util/session.ts'; import { Session } from '@util/session.ts';
import { Permissions } from '@util/permissions.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); const session = Session.sessionFromCookies(Astro.cookies, Permissions.Admin);
if (!session) return Astro.redirect(`${BASE_PATH}/admin`); if (!session) return Astro.redirect(siteUrl('admin'));
--- ---
<AdminLayout title="Website Admins"> <AdminLayout title="Website Admins">
+2 -2
View File
@@ -1,13 +1,13 @@
--- ---
import { Session } from '@util/session'; import { Session } from '@util/session';
import { Permissions } from '@util/permissions'; 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 AdminLayout from '@layouts/admin/AdminLayout.astro';
import SidebarActions from '@app/admin/strikeReasons/SidebarActions.svelte'; import SidebarActions from '@app/admin/strikeReasons/SidebarActions.svelte';
import StrikeReasons from '@app/admin/strikeReasons/StrikeReasons.svelte'; import StrikeReasons from '@app/admin/strikeReasons/StrikeReasons.svelte';
const session = Session.sessionFromCookies(Astro.cookies, Permissions.Reports); const session = Session.sessionFromCookies(Astro.cookies, Permissions.Reports);
if (!session) return Astro.redirect(`${BASE_PATH}/admin`); if (!session) return Astro.redirect(siteUrl('admin'));
--- ---
<AdminLayout title="Reports"> <AdminLayout title="Reports">
+2 -2
View File
@@ -3,11 +3,11 @@ import Feedback from '@app/admin/feedback/Feedback.svelte';
import AdminLayout from '@layouts/admin/AdminLayout.astro'; import AdminLayout from '@layouts/admin/AdminLayout.astro';
import { Session } from '@util/session.ts'; import { Session } from '@util/session.ts';
import { Permissions } from '@util/permissions.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'; import SidebarActions from '@app/admin/feedback/SidebarActions.svelte';
const session = Session.sessionFromCookies(Astro.cookies, Permissions.Feedback); const session = Session.sessionFromCookies(Astro.cookies, Permissions.Feedback);
if (!session) return Astro.redirect(`${BASE_PATH}/admin`); if (!session) return Astro.redirect(siteUrl('admin'));
--- ---
<AdminLayout title="Feedback"> <AdminLayout title="Feedback">
+2 -2
View File
@@ -1,10 +1,10 @@
--- ---
import { Session } from '@util/session.ts'; 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'; import AdminLayout from '@layouts/admin/AdminLayout.astro';
const session = Session.sessionFromCookies(Astro.cookies); const session = Session.sessionFromCookies(Astro.cookies);
if (!session) return Astro.redirect(`${BASE_PATH}/admin/login`); if (!session) return Astro.redirect(siteUrl('admin/login'));
--- ---
<AdminLayout title="Admin Panel" /> <AdminLayout title="Admin Panel" />
+2 -2
View File
@@ -1,13 +1,13 @@
--- ---
import { Session } from '@util/session'; import { Session } from '@util/session';
import { Permissions } from '@util/permissions'; 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 AdminLayout from '@layouts/admin/AdminLayout.astro';
import SidebarActions from '@app/admin/reports/SidebarActions.svelte'; import SidebarActions from '@app/admin/reports/SidebarActions.svelte';
import Reports from '@app/admin/reports/Reports.svelte'; import Reports from '@app/admin/reports/Reports.svelte';
const session = Session.sessionFromCookies(Astro.cookies, Permissions.Reports); const session = Session.sessionFromCookies(Astro.cookies, Permissions.Reports);
if (!session) return Astro.redirect(`${BASE_PATH}/admin`); if (!session) return Astro.redirect(siteUrl('admin'));
--- ---
<AdminLayout title="Reports"> <AdminLayout title="Reports">
+2 -2
View File
@@ -4,10 +4,10 @@ import Settings from '@app/admin/settings/Settings.svelte';
import { db } from '@db/database.ts'; import { db } from '@db/database.ts';
import { Session } from '@util/session.ts'; import { Session } from '@util/session.ts';
import { Permissions } from '@util/permissions.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); 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({}); const settings = await db.getSettings({});
--- ---
+2 -2
View File
@@ -1,12 +1,12 @@
--- ---
import { Session } from '@util/session'; import { Session } from '@util/session';
import { Permissions } from '@util/permissions'; 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 AdminLayout from '@layouts/admin/AdminLayout.astro';
import Tools from '@app/admin/tools/Tools.svelte'; import Tools from '@app/admin/tools/Tools.svelte';
const session = Session.sessionFromCookies(Astro.cookies, Permissions.Tools); const session = Session.sessionFromCookies(Astro.cookies, Permissions.Tools);
if (!session) return Astro.redirect(`${BASE_PATH}/admin`); if (!session) return Astro.redirect(siteUrl('admin'));
--- ---
<AdminLayout title="Tools"> <AdminLayout title="Tools">
+2 -2
View File
@@ -4,10 +4,10 @@ import BlockedUsers from '@app/admin/blockedUsers/BlockedUsers.svelte';
import SidebarActions from '@app/admin/blockedUsers/SidebarActions.svelte'; import SidebarActions from '@app/admin/blockedUsers/SidebarActions.svelte';
import { Session } from '@util/session.ts'; import { Session } from '@util/session.ts';
import { Permissions } from '@util/permissions.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); const session = Session.sessionFromCookies(Astro.cookies, Permissions.Users);
if (!session) return Astro.redirect(`${BASE_PATH}/admin`); if (!session) return Astro.redirect(siteUrl('admin'));
--- ---
<AdminLayout title="Blockierte Nutzer"> <AdminLayout title="Blockierte Nutzer">
@@ -1,13 +1,13 @@
--- ---
import { Session } from '@util/session.ts'; import { Session } from '@util/session.ts';
import { Permissions } from '@util/permissions.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 AdminLayout from '@layouts/admin/AdminLayout.astro';
import SidebarActions from '@app/admin/directInvitations/SidebarActions.svelte'; import SidebarActions from '@app/admin/directInvitations/SidebarActions.svelte';
import DirectInvitations from '@app/admin/directInvitations/DirectInvitations.svelte'; import DirectInvitations from '@app/admin/directInvitations/DirectInvitations.svelte';
const session = Session.sessionFromCookies(Astro.cookies, Permissions.Reports); const session = Session.sessionFromCookies(Astro.cookies, Permissions.Reports);
if (!session) return Astro.redirect(`${BASE_PATH}/admin`); if (!session) return Astro.redirect(siteUrl('admin'));
--- ---
<AdminLayout title="Direkte Einladungen"> <AdminLayout title="Direkte Einladungen">
+2 -2
View File
@@ -4,10 +4,10 @@ import Users from '@app/admin/users/Users.svelte';
import SidebarActions from '@app/admin/users/SidebarActions.svelte'; import SidebarActions from '@app/admin/users/SidebarActions.svelte';
import { Session } from '@util/session.ts'; import { Session } from '@util/session.ts';
import { Permissions } from '@util/permissions.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); const session = Session.sessionFromCookies(Astro.cookies, Permissions.Users);
if (!session) return Astro.redirect(`${BASE_PATH}/admin`); if (!session) return Astro.redirect(siteUrl('admin'));
--- ---
<AdminLayout title="Registrierte Nutzer"> <AdminLayout title="Registrierte Nutzer">
+2 -2
View File
@@ -1,7 +1,7 @@
import { externalApi } from '../_api.ts'; import { externalApi } from '../_api.ts';
import { z } from 'astro:schema'; import { z } from 'astro:schema';
import { db } from '@db/database.ts'; 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({ export const POST = externalApi({
input: z.object({ input: z.object({
@@ -19,7 +19,7 @@ export const POST = externalApi({
const response = feedbacks.map((feedback) => ({ const response = feedbacks.map((feedback) => ({
uuid: feedback.uuid, 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 }); return new Response(JSON.stringify({ feedback: response }), { status: 200 });
+2 -2
View File
@@ -2,7 +2,7 @@ import { externalApi } from '../_api.ts';
import { z } from 'astro:schema'; import { z } from 'astro:schema';
import { db } from '@db/database.ts'; import { db } from '@db/database.ts';
import { sendWebhook, WebhookAction } from '@util/webhook.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({ export const GET = externalApi({
auth: true, auth: true,
@@ -17,7 +17,7 @@ export const GET = externalApi({
reason: report.reason, reason: report.reason,
created: report.createdAt?.getTime() ?? null, created: report.createdAt?.getTime() ?? null,
status: report.status?.status ?? null, status: report.status?.status ?? null,
url: `${BASE_HOST}/${BASE_PATH}/report/${report.urlHash}` url: siteUrl(`report/${report.urlHash}`)
})) }))
}), }),
{ status: 200 } { status: 200 }
+3 -3
View File
@@ -1,6 +1,6 @@
import { externalApi } from '../../_api.ts'; import { externalApi } from '../../_api.ts';
import { db } from '@db/database.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({ export const GET = externalApi({
auth: true, auth: true,
@@ -18,14 +18,14 @@ export const GET = externalApi({
reason: report.reason, reason: report.reason,
created: report.createdAt?.getTime() ?? null, created: report.createdAt?.getTime() ?? null,
status: report.status?.status ?? null, status: report.status?.status ?? null,
url: `${BASE_HOST}/${BASE_PATH}/report/${report.urlHash}` url: siteUrl(`report/${report.urlHash}`)
})), })),
to_self: toSelf.map((report) => ({ to_self: toSelf.map((report) => ({
reporter: report.reporter?.uuid ?? null, reporter: report.reporter?.uuid ?? null,
reason: report.reason, reason: report.reason,
created: report.createdAt?.getTime() ?? null, created: report.createdAt?.getTime() ?? null,
status: report.status?.status ?? null, status: report.status?.status ?? null,
url: `${BASE_HOST}/${BASE_PATH}/report/${report.urlHash}` url: siteUrl(`report/${report.urlHash}`)
})) }))
}), }),
{ status: 200 } { status: 200 }
+4 -4
View File
@@ -2,7 +2,7 @@
import WebsiteLayout from '@layouts/website/WebsiteLayout.astro'; import WebsiteLayout from '@layouts/website/WebsiteLayout.astro';
import VideoPlayer from '@app/website/video/VideoPlayer.svelte'; import VideoPlayer from '@app/website/video/VideoPlayer.svelte';
import { getVideoMetadata, resolveVideo } from '@util/video.ts'; import { getVideoMetadata, resolveVideo } from '@util/video.ts';
import { BASE_PATH } from 'astro:env/server'; import { siteUrl } from '@util/url.ts';
const { name } = Astro.params; const { name } = Astro.params;
@@ -13,13 +13,13 @@ const metadata = await getVideoMetadata(video);
if (!metadata) return new Response(null, { status: 404 }); if (!metadata) return new Response(null, { status: 404 });
const { title, description, width, height, duration } = metadata; const { title, description, width, height, duration } = metadata;
const streamPath = `${BASE_PATH}/video/${encodeURIComponent(video.name)}/stream`; const streamUrl = siteUrl(`video/${encodeURIComponent(video.name)}/stream`);
--- ---
<WebsiteLayout title={`${title} - Video`} description={description ?? undefined} openGraph="minimal"> <WebsiteLayout title={`${title} - Video`} description={description ?? undefined} openGraph="minimal">
<Fragment slot="head"> <Fragment slot="head">
<meta property="og:type" content="video" /> <meta property="og:type" content="video" />
<meta property="og:video" content={streamPath} /> <meta property="og:video" content={streamUrl} />
<meta property="og:video:type" content={video.contentType} /> <meta property="og:video:type" content={video.contentType} />
{width && <meta property="og:video:width" content={width.toString()} />} {width && <meta property="og:video:width" content={width.toString()} />}
{height && <meta property="og:video:height" content={height.toString()} />} {height && <meta property="og:video:height" content={height.toString()} />}
@@ -32,7 +32,7 @@ const streamPath = `${BASE_PATH}/video/${encodeURIComponent(video.name)}/stream`
<h1 class="mt-1 text-2xl font-semibold break-words lg:text-4xl">{title}</h1> <h1 class="mt-1 text-2xl font-semibold break-words lg:text-4xl">{title}</h1>
</div> </div>
<VideoPlayer client:load src={streamPath} type={video.contentType} title={title} /> <VideoPlayer client:load src={streamUrl} type={video.contentType} title={title} />
{description && ( {description && (
<p class="max-w-3xl text-base leading-relaxed whitespace-pre-line text-base-content/70">{description}</p> <p class="max-w-3xl text-base leading-relaxed whitespace-pre-line text-base-content/70">{description}</p>
+11
View File
@@ -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;
}