Modernization Project Complete. Updated to latest versions of frameworks.

This commit is contained in:
Eric Gullickson
2025-08-24 09:49:21 -05:00
parent 673fe7ce91
commit b534e92636
46 changed files with 2341 additions and 5267 deletions

View File

@@ -1,186 +1,219 @@
/**
* @ai-summary HTTP request handlers for fuel logs
* @ai-summary Fastify route handlers for fuel logs API
* @ai-context HTTP request/response handling with Fastify reply methods
*/
import { Request, Response, NextFunction } from 'express';
import { FastifyRequest, FastifyReply } from 'fastify';
import { FuelLogsService } from '../domain/fuel-logs.service';
import { validateCreateFuelLog, validateUpdateFuelLog } from './fuel-logs.validators';
import { FuelLogsRepository } from '../data/fuel-logs.repository';
import { pool } from '../../../core/config/database';
import { logger } from '../../../core/logging/logger';
import { CreateFuelLogBody, UpdateFuelLogBody, FuelLogParams, VehicleParams } from '../domain/fuel-logs.types';
export class FuelLogsController {
constructor(private service: FuelLogsService) {}
private fuelLogsService: FuelLogsService;
constructor() {
const repository = new FuelLogsRepository(pool);
this.fuelLogsService = new FuelLogsService(repository);
}
create = async (req: Request, res: Response, next: NextFunction) => {
async createFuelLog(request: FastifyRequest<{ Body: CreateFuelLogBody }>, reply: FastifyReply) {
try {
const userId = req.user?.sub;
if (!userId) {
return res.status(401).json({ error: 'Unauthorized' });
}
const userId = (request as any).user.sub;
const fuelLog = await this.fuelLogsService.createFuelLog(request.body, userId);
const validation = validateCreateFuelLog(req.body);
if (!validation.success) {
return res.status(400).json({
error: 'Validation failed',
details: validation.error.errors
return reply.code(201).send(fuelLog);
} catch (error: any) {
logger.error('Error creating fuel log', { error, userId: (request as any).user?.sub });
if (error.message.includes('not found')) {
return reply.code(404).send({
error: 'Not Found',
message: error.message
});
}
if (error.message.includes('Unauthorized')) {
return reply.code(403).send({
error: 'Forbidden',
message: error.message
});
}
const result = await this.service.createFuelLog(validation.data, userId);
res.status(201).json(result);
return reply.code(500).send({
error: 'Internal server error',
message: 'Failed to create fuel log'
});
}
}
async getFuelLogsByVehicle(request: FastifyRequest<{ Params: VehicleParams }>, reply: FastifyReply) {
try {
const userId = (request as any).user.sub;
const { vehicleId } = request.params;
const fuelLogs = await this.fuelLogsService.getFuelLogsByVehicle(vehicleId, userId);
return reply.code(200).send(fuelLogs);
} catch (error: any) {
logger.error('Error creating fuel log', { error: error.message });
logger.error('Error listing fuel logs', { error, vehicleId: request.params.vehicleId, userId: (request as any).user?.sub });
if (error.message.includes('not found')) {
return res.status(404).json({ error: error.message });
return reply.code(404).send({
error: 'Not Found',
message: error.message
});
}
if (error.message.includes('Unauthorized')) {
return res.status(403).json({ error: error.message });
return reply.code(403).send({
error: 'Forbidden',
message: error.message
});
}
return next(error);
return reply.code(500).send({
error: 'Internal server error',
message: 'Failed to get fuel logs'
});
}
}
listByVehicle = async (req: Request, res: Response, next: NextFunction) => {
async getUserFuelLogs(request: FastifyRequest, reply: FastifyReply) {
try {
const userId = req.user?.sub;
if (!userId) {
return res.status(401).json({ error: 'Unauthorized' });
}
const userId = (request as any).user.sub;
const fuelLogs = await this.fuelLogsService.getUserFuelLogs(userId);
const { vehicleId } = req.params;
const result = await this.service.getFuelLogsByVehicle(vehicleId, userId);
res.json(result);
return reply.code(200).send(fuelLogs);
} catch (error: any) {
logger.error('Error listing fuel logs', { error: error.message });
if (error.message.includes('not found')) {
return res.status(404).json({ error: error.message });
}
if (error.message.includes('Unauthorized')) {
return res.status(403).json({ error: error.message });
}
return next(error);
logger.error('Error listing all fuel logs', { error, userId: (request as any).user?.sub });
return reply.code(500).send({
error: 'Internal server error',
message: 'Failed to get fuel logs'
});
}
}
listAll = async (req: Request, res: Response, next: NextFunction) => {
async getFuelLog(request: FastifyRequest<{ Params: FuelLogParams }>, reply: FastifyReply) {
try {
const userId = req.user?.sub;
if (!userId) {
return res.status(401).json({ error: 'Unauthorized' });
}
const userId = (request as any).user.sub;
const { id } = request.params;
const result = await this.service.getUserFuelLogs(userId);
res.json(result);
} catch (error: any) {
logger.error('Error listing all fuel logs', { error: error.message });
return next(error);
}
}
get = async (req: Request, res: Response, next: NextFunction) => {
try {
const userId = req.user?.sub;
if (!userId) {
return res.status(401).json({ error: 'Unauthorized' });
}
const fuelLog = await this.fuelLogsService.getFuelLog(id, userId);
const { id } = req.params;
const result = await this.service.getFuelLog(id, userId);
res.json(result);
return reply.code(200).send(fuelLog);
} catch (error: any) {
logger.error('Error getting fuel log', { error: error.message });
logger.error('Error getting fuel log', { error, fuelLogId: request.params.id, userId: (request as any).user?.sub });
if (error.message === 'Fuel log not found') {
return res.status(404).json({ error: error.message });
return reply.code(404).send({
error: 'Not Found',
message: error.message
});
}
if (error.message === 'Unauthorized') {
return res.status(403).json({ error: error.message });
}
return next(error);
}
}
update = async (req: Request, res: Response, next: NextFunction) => {
try {
const userId = req.user?.sub;
if (!userId) {
return res.status(401).json({ error: 'Unauthorized' });
}
const { id } = req.params;
const validation = validateUpdateFuelLog(req.body);
if (!validation.success) {
return res.status(400).json({
error: 'Validation failed',
details: validation.error.errors
return reply.code(403).send({
error: 'Forbidden',
message: error.message
});
}
const result = await this.service.updateFuelLog(id, validation.data, userId);
res.json(result);
} catch (error: any) {
logger.error('Error updating fuel log', { error: error.message });
if (error.message.includes('not found')) {
return res.status(404).json({ error: error.message });
}
if (error.message === 'Unauthorized') {
return res.status(403).json({ error: error.message });
}
return next(error);
return reply.code(500).send({
error: 'Internal server error',
message: 'Failed to get fuel log'
});
}
}
delete = async (req: Request, res: Response, next: NextFunction) => {
async updateFuelLog(request: FastifyRequest<{ Params: FuelLogParams; Body: UpdateFuelLogBody }>, reply: FastifyReply) {
try {
const userId = req.user?.sub;
if (!userId) {
return res.status(401).json({ error: 'Unauthorized' });
}
const userId = (request as any).user.sub;
const { id } = request.params;
const { id } = req.params;
await this.service.deleteFuelLog(id, userId);
res.status(204).send();
const fuelLog = await this.fuelLogsService.updateFuelLog(id, request.body, userId);
return reply.code(200).send(fuelLog);
} catch (error: any) {
logger.error('Error deleting fuel log', { error: error.message });
logger.error('Error updating fuel log', { error, fuelLogId: request.params.id, userId: (request as any).user?.sub });
if (error.message.includes('not found')) {
return res.status(404).json({ error: error.message });
return reply.code(404).send({
error: 'Not Found',
message: error.message
});
}
if (error.message === 'Unauthorized') {
return res.status(403).json({ error: error.message });
return reply.code(403).send({
error: 'Forbidden',
message: error.message
});
}
return next(error);
return reply.code(500).send({
error: 'Internal server error',
message: 'Failed to update fuel log'
});
}
}
getStats = async (req: Request, res: Response, next: NextFunction) => {
async deleteFuelLog(request: FastifyRequest<{ Params: FuelLogParams }>, reply: FastifyReply) {
try {
const userId = req.user?.sub;
if (!userId) {
return res.status(401).json({ error: 'Unauthorized' });
}
const userId = (request as any).user.sub;
const { id } = request.params;
const { vehicleId } = req.params;
const result = await this.service.getVehicleStats(vehicleId, userId);
res.json(result);
await this.fuelLogsService.deleteFuelLog(id, userId);
return reply.code(204).send();
} catch (error: any) {
logger.error('Error getting fuel stats', { error: error.message });
logger.error('Error deleting fuel log', { error, fuelLogId: request.params.id, userId: (request as any).user?.sub });
if (error.message.includes('not found')) {
return res.status(404).json({ error: error.message });
return reply.code(404).send({
error: 'Not Found',
message: error.message
});
}
if (error.message === 'Unauthorized') {
return res.status(403).json({ error: error.message });
return reply.code(403).send({
error: 'Forbidden',
message: error.message
});
}
return next(error);
return reply.code(500).send({
error: 'Internal server error',
message: 'Failed to delete fuel log'
});
}
}
async getFuelStats(request: FastifyRequest<{ Params: VehicleParams }>, reply: FastifyReply) {
try {
const userId = (request as any).user.sub;
const { vehicleId } = request.params;
const stats = await this.fuelLogsService.getVehicleStats(vehicleId, userId);
return reply.code(200).send(stats);
} catch (error: any) {
logger.error('Error getting fuel stats', { error, vehicleId: request.params.vehicleId, userId: (request as any).user?.sub });
if (error.message.includes('not found')) {
return reply.code(404).send({
error: 'Not Found',
message: error.message
});
}
if (error.message === 'Unauthorized') {
return reply.code(403).send({
error: 'Forbidden',
message: error.message
});
}
return reply.code(500).send({
error: 'Internal server error',
message: 'Failed to get fuel stats'
});
}
}
}