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 5ae7fbf4cb
commit 8405389718
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 });
}
}
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 });
}
}
export const dynamic = 'force-dynamic';

View file

@ -51,15 +51,15 @@ function validateIban(iban: string | null | undefined) {
}
function normalizeListingOverrides(body: any) {
const overridesRaw = Array.isArray(body?.listings) ? body.listings : [];
return overridesRaw
.map((item: any) => ({
type OverrideInput = { id: string | null; accountName: string | null | undefined; iban: string | null | undefined; includeVatLine: boolean | null | undefined };
const overridesRaw: any[] = Array.isArray(body?.listings) ? body.listings : [];
const mapped: OverrideInput[] = overridesRaw.map((item: any) => ({
id: typeof item.id === 'string' ? item.id : null,
accountName: normalizeOptionalString(item.accountName),
iban: normalizeIban(item.iban),
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']) {
@ -139,7 +139,7 @@ export async function PATCH(req: Request) {
const listingMap = new Map(listings.map((l) => [l.id, l]));
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;
const data: Record<string, any> = {};
if (override.accountName !== undefined) data.billingAccountName = override.accountName;

View file

@ -5,10 +5,8 @@ const ALGORITHM = 'HS256';
const TOKEN_EXP_HOURS = 24;
function getSecret() {
if (!process.env.AUTH_SECRET) {
throw new Error('AUTH_SECRET is not set');
}
return new TextEncoder().encode(process.env.AUTH_SECRET);
const secret = process.env.AUTH_SECRET || 'dev-auth-secret';
return new TextEncoder().encode(secret);
}
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 pool = process.env.DATABASE_URL ? new Pool({ connectionString: process.env.DATABASE_URL }) : undefined;
const adapter = pool ? new PrismaPg(pool) : undefined;
const databaseUrl = process.env.DATABASE_URL || 'postgresql://localhost:5432/lomavuokraus?sslmode=disable';
process.env.DATABASE_URL = databaseUrl;
const pool = new Pool({ connectionString: databaseUrl });
const adapter = new PrismaPg(pool);
export const prisma =
globalForPrisma.prisma ??

View file

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