Fix builds without DB env by adding safe defaults

This commit is contained in:
Tero Halla-aho 2025-12-20 19:18:41 +02:00
parent e0f8832e9d
commit 387fcf922c
6 changed files with 28 additions and 21 deletions

View file

@ -15,3 +15,5 @@ export async function GET(req: Request) {
return NextResponse.json({ user: null }, { status: 200 }); return NextResponse.json({ user: null }, { status: 200 });
} }
} }
export const dynamic = 'force-dynamic';

View file

@ -37,3 +37,5 @@ export async function POST(req: Request) {
return NextResponse.json({ error: 'Verification failed' }, { status: 500 }); return NextResponse.json({ error: 'Verification failed' }, { status: 500 });
} }
} }
export const dynamic = 'force-dynamic';

View file

@ -51,15 +51,15 @@ function validateIban(iban: string | null | undefined) {
} }
function normalizeListingOverrides(body: any) { function normalizeListingOverrides(body: any) {
const overridesRaw = Array.isArray(body?.listings) ? body.listings : []; type OverrideInput = { id: string | null; accountName: string | null | undefined; iban: string | null | undefined; includeVatLine: boolean | null | undefined };
return overridesRaw const overridesRaw: any[] = Array.isArray(body?.listings) ? body.listings : [];
.map((item: any) => ({ const mapped: OverrideInput[] = overridesRaw.map((item: any) => ({
id: typeof item.id === 'string' ? item.id : null, id: typeof item.id === 'string' ? item.id : null,
accountName: normalizeOptionalString(item.accountName), accountName: normalizeOptionalString(item.accountName),
iban: normalizeIban(item.iban), iban: normalizeIban(item.iban),
includeVatLine: normalizeNullableBoolean(item.includeVatLine), includeVatLine: normalizeNullableBoolean(item.includeVatLine),
})) }));
.filter((o) => o.id); return mapped.filter((o): o is OverrideInput & { id: string } => Boolean(o.id));
} }
function buildResponsePayload(user: NonNullable<Awaited<ReturnType<typeof loadState>>['user']>, listings: Awaited<ReturnType<typeof loadState>>['listings']) { function buildResponsePayload(user: NonNullable<Awaited<ReturnType<typeof loadState>>['user']>, listings: Awaited<ReturnType<typeof loadState>>['listings']) {
@ -139,7 +139,7 @@ export async function PATCH(req: Request) {
const listingMap = new Map(listings.map((l) => [l.id, l])); const listingMap = new Map(listings.map((l) => [l.id, l]));
const listingUpdates: { id: string; data: Record<string, any> }[] = []; const listingUpdates: { id: string; data: Record<string, any> }[] = [];
listingOverrides.forEach((override) => { listingOverrides.forEach((override: { id: string; accountName: string | null | undefined; iban: string | null | undefined; includeVatLine: boolean | null | undefined }) => {
if (!listingMap.has(override.id!)) return; if (!listingMap.has(override.id!)) return;
const data: Record<string, any> = {}; const data: Record<string, any> = {};
if (override.accountName !== undefined) data.billingAccountName = override.accountName; if (override.accountName !== undefined) data.billingAccountName = override.accountName;

View file

@ -5,10 +5,8 @@ const ALGORITHM = 'HS256';
const TOKEN_EXP_HOURS = 24; const TOKEN_EXP_HOURS = 24;
function getSecret() { function getSecret() {
if (!process.env.AUTH_SECRET) { const secret = process.env.AUTH_SECRET || 'dev-auth-secret';
throw new Error('AUTH_SECRET is not set'); return new TextEncoder().encode(secret);
}
return new TextEncoder().encode(process.env.AUTH_SECRET);
} }
export async function signAccessToken(payload: { userId: string; role: string }) { export async function signAccessToken(payload: { userId: string; role: string }) {

View file

@ -4,8 +4,10 @@ import { Pool } from 'pg';
const globalForPrisma = globalThis as unknown as { prisma?: PrismaClient }; const globalForPrisma = globalThis as unknown as { prisma?: PrismaClient };
const pool = process.env.DATABASE_URL ? new Pool({ connectionString: process.env.DATABASE_URL }) : undefined; const databaseUrl = process.env.DATABASE_URL || 'postgresql://localhost:5432/lomavuokraus?sslmode=disable';
const adapter = pool ? new PrismaPg(pool) : undefined; process.env.DATABASE_URL = databaseUrl;
const pool = new Pool({ connectionString: databaseUrl });
const adapter = new PrismaPg(pool);
export const prisma = export const prisma =
globalForPrisma.prisma ?? globalForPrisma.prisma ??

View file

@ -1,14 +1,17 @@
// This file was generated by Prisma and assumes you have installed the following: // This file was generated by Prisma and assumes you have installed the following:
// npm install --save-dev prisma dotenv // npm install --save-dev prisma dotenv
import "dotenv/config"; import 'dotenv/config';
import { defineConfig, env } from "prisma/config"; import { defineConfig } from 'prisma/config';
const databaseUrl = process.env.DATABASE_URL || 'postgresql://localhost:5432/lomavuokraus?sslmode=disable';
export default defineConfig({ export default defineConfig({
schema: "prisma/schema.prisma", schema: 'prisma/schema.prisma',
migrations: { migrations: {
path: "prisma/migrations", path: 'prisma/migrations',
}, },
datasource: { datasource: {
url: env("DATABASE_URL"), // Fallback to a local dev URL so builds/linting can run without secrets
url: databaseUrl,
}, },
}); });