feat: add batch insert operations to repositories (refs #26)
Add batchInsert methods to vehicles, fuel-logs, maintenance, and documents repositories. Multi-value INSERT syntax provides 10-100x performance improvement over individual operations for bulk data import. - vehicles.repository: batchInsert for vehicles - fuel-logs.repository: batchInsert for fuel logs - maintenance.repository: batchInsertRecords and batchInsertSchedules - documents.repository: batchInsert for documents - All methods support empty array (immediate return) and optional transaction client - Fix lint error: replace require() with ES6 import in test mock Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -164,6 +164,57 @@ export class VehiclesRepository {
|
||||
return this.mapRow(result.rows[0]);
|
||||
}
|
||||
|
||||
async batchInsert(
|
||||
vehicles: Array<CreateVehicleRequest & { userId: string, make?: string, model?: string, year?: number }>,
|
||||
client?: any
|
||||
): Promise<Vehicle[]> {
|
||||
if (vehicles.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Multi-value INSERT for performance (avoids N round-trips)
|
||||
const queryClient = client || this.pool;
|
||||
const placeholders: string[] = [];
|
||||
const values: any[] = [];
|
||||
let paramCount = 1;
|
||||
|
||||
vehicles.forEach((vehicle) => {
|
||||
const vehicleParams = [
|
||||
vehicle.userId,
|
||||
(vehicle.vin && vehicle.vin.trim().length > 0) ? vehicle.vin.trim() : null,
|
||||
vehicle.make,
|
||||
vehicle.model,
|
||||
vehicle.year,
|
||||
vehicle.engine,
|
||||
vehicle.transmission,
|
||||
vehicle.trimLevel,
|
||||
vehicle.driveType,
|
||||
vehicle.fuelType,
|
||||
vehicle.nickname,
|
||||
vehicle.color,
|
||||
vehicle.licensePlate,
|
||||
vehicle.odometerReading || 0
|
||||
];
|
||||
|
||||
const placeholder = `($${paramCount++}, $${paramCount++}, $${paramCount++}, $${paramCount++}, $${paramCount++}, $${paramCount++}, $${paramCount++}, $${paramCount++}, $${paramCount++}, $${paramCount++}, $${paramCount++}, $${paramCount++}, $${paramCount++}, $${paramCount++})`;
|
||||
placeholders.push(placeholder);
|
||||
values.push(...vehicleParams);
|
||||
});
|
||||
|
||||
const query = `
|
||||
INSERT INTO vehicles (
|
||||
user_id, vin, make, model, year,
|
||||
engine, transmission, trim_level, drive_type, fuel_type,
|
||||
nickname, color, license_plate, odometer_reading
|
||||
)
|
||||
VALUES ${placeholders.join(', ')}
|
||||
RETURNING *
|
||||
`;
|
||||
|
||||
const result = await queryClient.query(query, values);
|
||||
return result.rows.map((row: any) => this.mapRow(row));
|
||||
}
|
||||
|
||||
async softDelete(id: string): Promise<boolean> {
|
||||
const query = `
|
||||
UPDATE vehicles
|
||||
|
||||
@@ -12,9 +12,8 @@ import fastifyPlugin from 'fastify-plugin';
|
||||
|
||||
// Mock auth plugin to bypass JWT validation in tests
|
||||
jest.mock('../../../../core/plugins/auth.plugin', () => {
|
||||
const fp = require('fastify-plugin');
|
||||
return {
|
||||
default: fp(async function(fastify: any) {
|
||||
default: fastifyPlugin(async function(fastify: any) {
|
||||
fastify.decorate('authenticate', async function(request: any, _reply: any) {
|
||||
request.user = { sub: 'test-user-123' };
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user