Files
hwinkel b22e5baa5c
Build and Push Docker Image / build (push) Successful in 1m23s
feat: add client-side validation utilities and debugging tools
- Implemented client-side validation functions for tax ID, VAT ID, IBAN, BIC, and website URL.
- Added debug logging functionality to assist in development.
- Created a comprehensive validation function for company form data.

feat: initialize database with Prisma migrations

- Added a server-side script to run Prisma migrations and check database health.
- Ensured safe initialization of the database to prevent concurrent migrations.

feat: comprehensive server-side error logging

- Developed an error logging system that captures detailed error context, including request details and stack traces.
- Implemented logging functions for different error types (route, action, database, API, startup).

fix: validate user ID existence in audit logs

- Updated the logging function to validate that the user ID exists in the database before logging actions.

fix: update schemas for optional fields and validation

- Modified schemas to allow for nullable fields and refined validation logic for tax ID, VAT ID, IBAN, and BIC.

feat: enhance error boundary for better debugging

- Improved error boundary to log detailed error information in development mode.
- Added a debug panel to the main application layout for real-time error tracking.

feat: implement company deletion functionality in admin routes

- Added a new API route for deleting companies with appropriate logging.
- Integrated delete confirmation in the admin interface for better user experience.

fix: handle API errors gracefully

- Wrapped API actions in try-catch blocks to log errors and return appropriate responses.

feat: generate and save invoice PDFs

- Implemented functionality to generate and save invoice PDFs upon status updates.
- Added a new column in the database for storing the URL of the generated PDF.

chore: update Docker image reference

- Changed the Docker image reference to point to the new Git repository.

chore: update package dependencies

- Added @radix-ui/react-tooltip for enhanced UI components.
- Updated package-lock.json to reflect new dependencies.
2026-05-03 08:46:58 +02:00

74 lines
1.8 KiB
TypeScript

import { execSync } from "node:child_process";
import prisma from "./prisma.server";
let initStarted = false;
let initCompleted = false;
/**
* Run Prisma migrations to bring database schema up to date
*/
async function runMigrations(): Promise<void> {
try {
console.log("[DB Init] Running Prisma migrations...");
execSync("npx prisma migrate deploy", {
stdio: "inherit",
env: { ...process.env },
});
console.log("[DB Init] ✓ Migrations completed successfully");
} catch (error) {
console.error("[DB Init] ✗ Migration failed:", error);
throw new Error("Database migration failed. See logs above.");
}
}
/**
* Initialize database: run all pending migrations
* Safe to call multiple times (idempotent)
*/
export async function initializeDatabase(): Promise<void> {
// Prevent concurrent initialization attempts
if (initCompleted) return;
if (initStarted) {
// Wait for initialization to complete
while (!initCompleted) {
await new Promise((resolve) => setTimeout(resolve, 100));
}
return;
}
initStarted = true;
try {
await runMigrations();
console.log("[DB Init] ✓ Database initialization complete");
} catch (error) {
console.error("[DB Init] Fatal error during database initialization:", error);
throw error;
} finally {
initCompleted = true;
}
}
/**
* Check database health (non-blocking)
*/
export async function checkDatabaseHealth(): Promise<{
connected: boolean;
isEmpty: boolean;
error?: string;
}> {
try {
const userCount = await prisma.user.count();
return {
connected: true,
isEmpty: userCount === 0,
};
} catch (error) {
return {
connected: false,
isEmpty: false,
error: error instanceof Error ? error.message : "Unknown error",
};
}
}