feat: add client-side validation utilities and debugging tools
Build and Push Docker Image / build (push) Successful in 1m23s
Build and Push Docker Image / build (push) Successful in 1m23s
- 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.
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
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",
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user