- Rate limiting counters live in PostgreSQL (throttler_records), shared by every instance, one atomic upsert per request; fails open. - On shutdown, new syncs are refused (503) and the running one is waited for up to SYNC_SHUTDOWN_TIMEOUT; Prisma disconnects last. - Hiboutik calls never follow redirects and are capped at 50 MB. - Prisma errors no longer print query arguments (errorFormat minimal). - In production, DATABASE_URL must require TLS. - The sync lock connection times out after 10 s. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
26 lines
1.0 KiB
TypeScript
26 lines
1.0 KiB
TypeScript
import { Injectable, OnApplicationShutdown, OnModuleInit } from '@nestjs/common';
|
|
import { PrismaClient } from './generated/client';
|
|
import { PrismaPg } from '@prisma/adapter-pg';
|
|
|
|
/** Prisma client shared by the whole app (global PrismaModule), connected to `DATABASE_URL` through the pg driver adapter. */
|
|
@Injectable()
|
|
export class PrismaService extends PrismaClient implements OnModuleInit, OnApplicationShutdown {
|
|
constructor() {
|
|
const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
|
|
// 'minimal': by default, error messages print the query arguments (emails, names, addresses...), which end up in the logs
|
|
super({ adapter, errorFormat: 'minimal' });
|
|
}
|
|
|
|
async onModuleInit() {
|
|
await this.$connect();
|
|
}
|
|
|
|
/**
|
|
* Last shutdown hook (after `onModuleDestroy` and `beforeApplicationShutdown`, once the HTTP server is closed):
|
|
* a synchronization still running is waited for in `beforeApplicationShutdown` and keeps the database until then.
|
|
*/
|
|
async onApplicationShutdown() {
|
|
await this.$disconnect();
|
|
}
|
|
}
|