Updates to database and API for dropdowns.

This commit is contained in:
Eric Gullickson
2025-11-11 10:29:02 -06:00
parent 3dc0f2a733
commit 8376aee7ed
157 changed files with 2573659 additions and 1548221 deletions

View File

@@ -171,20 +171,20 @@ export class VehiclesController {
}
}
async getDropdownModels(request: FastifyRequest<{ Querystring: { year: number; make_id: number } }>, reply: FastifyReply) {
async getDropdownModels(request: FastifyRequest<{ Querystring: { year: number; make: string } }>, reply: FastifyReply) {
try {
const { year, make_id } = request.query;
if (!year || !make_id || year < 1980 || year > new Date().getFullYear() + 1 || make_id < 1) {
const { year, make } = request.query;
if (!year || !make || year < 1980 || year > new Date().getFullYear() + 1 || make.trim().length === 0) {
return reply.code(400).send({
error: 'Bad Request',
message: 'Valid year and make_id parameters are required'
message: 'Valid year and make parameters are required'
});
}
const models = await this.vehiclesService.getDropdownModels(year, make_id);
const models = await this.vehiclesService.getDropdownModels(year, make);
return reply.code(200).send(models);
} catch (error) {
logger.error('Error getting dropdown models', { error, year: request.query?.year, make_id: request.query?.make_id });
logger.error('Error getting dropdown models', { error, year: request.query?.year, make: request.query?.make });
return reply.code(500).send({
error: 'Internal server error',
message: 'Failed to get models'
@@ -192,20 +192,20 @@ export class VehiclesController {
}
}
async getDropdownTransmissions(request: FastifyRequest<{ Querystring: { year: number; make_id: number; model_id: number } }>, reply: FastifyReply) {
async getDropdownTransmissions(request: FastifyRequest<{ Querystring: { year: number; make: string; model: string } }>, reply: FastifyReply) {
try {
const { year, make_id, model_id } = request.query;
if (!year || !make_id || !model_id || year < 1980 || year > new Date().getFullYear() + 1 || make_id < 1 || model_id < 1) {
const { year, make, model } = request.query;
if (!year || !make || !model || year < 1980 || year > new Date().getFullYear() + 1 || make.trim().length === 0 || model.trim().length === 0) {
return reply.code(400).send({
error: 'Bad Request',
message: 'Valid year, make_id, and model_id parameters are required'
message: 'Valid year, make, and model parameters are required'
});
}
const transmissions = await this.vehiclesService.getDropdownTransmissions(year, make_id, model_id);
const transmissions = await this.vehiclesService.getDropdownTransmissions(year, make, model);
return reply.code(200).send(transmissions);
} catch (error) {
logger.error('Error getting dropdown transmissions', { error, year: request.query?.year, make_id: request.query?.make_id, model_id: request.query?.model_id });
logger.error('Error getting dropdown transmissions', { error, year: request.query?.year, make: request.query?.make, model: request.query?.model });
return reply.code(500).send({
error: 'Internal server error',
message: 'Failed to get transmissions'
@@ -213,20 +213,20 @@ export class VehiclesController {
}
}
async getDropdownEngines(request: FastifyRequest<{ Querystring: { year: number; make_id: number; model_id: number; trim_id: number } }>, reply: FastifyReply) {
async getDropdownEngines(request: FastifyRequest<{ Querystring: { year: number; make: string; model: string; trim: string } }>, reply: FastifyReply) {
try {
const { year, make_id, model_id, trim_id } = request.query;
if (!year || !make_id || !model_id || !trim_id || year < 1980 || year > new Date().getFullYear() + 1 || make_id < 1 || model_id < 1 || trim_id < 1) {
const { year, make, model, trim } = request.query;
if (!year || !make || !model || !trim || year < 1980 || year > new Date().getFullYear() + 1 || make.trim().length === 0 || model.trim().length === 0 || trim.trim().length === 0) {
return reply.code(400).send({
error: 'Bad Request',
message: 'Valid year, make_id, model_id, and trim_id parameters are required'
message: 'Valid year, make, model, and trim parameters are required'
});
}
const engines = await this.vehiclesService.getDropdownEngines(year, make_id, model_id, trim_id);
const engines = await this.vehiclesService.getDropdownEngines(year, make, model, trim);
return reply.code(200).send(engines);
} catch (error) {
logger.error('Error getting dropdown engines', { error, year: request.query?.year, make_id: request.query?.make_id, model_id: request.query?.model_id, trim_id: request.query?.trim_id });
logger.error('Error getting dropdown engines', { error, year: request.query?.year, make: request.query?.make, model: request.query?.model, trim: request.query?.trim });
return reply.code(500).send({
error: 'Internal server error',
message: 'Failed to get engines'
@@ -234,20 +234,20 @@ export class VehiclesController {
}
}
async getDropdownTrims(request: FastifyRequest<{ Querystring: { year: number; make_id: number; model_id: number } }>, reply: FastifyReply) {
async getDropdownTrims(request: FastifyRequest<{ Querystring: { year: number; make: string; model: string } }>, reply: FastifyReply) {
try {
const { year, make_id, model_id } = request.query;
if (!year || !make_id || !model_id || year < 1980 || year > new Date().getFullYear() + 1 || make_id < 1 || model_id < 1) {
const { year, make, model } = request.query;
if (!year || !make || !model || year < 1980 || year > new Date().getFullYear() + 1 || make.trim().length === 0 || model.trim().length === 0) {
return reply.code(400).send({
error: 'Bad Request',
message: 'Valid year, make_id, and model_id parameters are required'
message: 'Valid year, make, and model parameters are required'
});
}
const trims = await this.vehiclesService.getDropdownTrims(year, make_id, model_id);
const trims = await this.vehiclesService.getDropdownTrims(year, make, model);
return reply.code(200).send(trims);
} catch (error) {
logger.error('Error getting dropdown trims', { error, year: request.query?.year, make_id: request.query?.make_id, model_id: request.query?.model_id });
logger.error('Error getting dropdown trims', { error, year: request.query?.year, make: request.query?.make, model: request.query?.model });
return reply.code(500).send({
error: 'Internal server error',
message: 'Failed to get trims'

View File

@@ -45,26 +45,26 @@ export const vehiclesRoutes: FastifyPluginAsync = async (
handler: vehiclesController.getDropdownMakes.bind(vehiclesController)
});
// GET /api/vehicles/dropdown/models?year=2024&make_id=1 - Get models for year/make (Level 2)
fastify.get<{ Querystring: { year: number; make_id: number } }>('/vehicles/dropdown/models', {
// GET /api/vehicles/dropdown/models?year=2024&make=Ford - Get models for year/make (Level 2)
fastify.get<{ Querystring: { year: number; make: string } }>('/vehicles/dropdown/models', {
preHandler: [fastify.authenticate],
handler: vehiclesController.getDropdownModels.bind(vehiclesController)
});
// GET /api/vehicles/dropdown/trims?year=2024&make_id=1&model_id=1 - Get trims (Level 3)
fastify.get<{ Querystring: { year: number; make_id: number; model_id: number } }>('/vehicles/dropdown/trims', {
// GET /api/vehicles/dropdown/trims?year=2024&make=Ford&model=F-150 - Get trims (Level 3)
fastify.get<{ Querystring: { year: number; make: string; model: string } }>('/vehicles/dropdown/trims', {
preHandler: [fastify.authenticate],
handler: vehiclesController.getDropdownTrims.bind(vehiclesController)
});
// GET /api/vehicles/dropdown/engines?year=2024&make_id=1&model_id=1&trim_id=1 - Get engines (Level 4)
fastify.get<{ Querystring: { year: number; make_id: number; model_id: number; trim_id: number } }>('/vehicles/dropdown/engines', {
// GET /api/vehicles/dropdown/engines?year=2024&make=Ford&model=F-150&trim=XLT - Get engines (Level 4)
fastify.get<{ Querystring: { year: number; make: string; model: string; trim: string } }>('/vehicles/dropdown/engines', {
preHandler: [fastify.authenticate],
handler: vehiclesController.getDropdownEngines.bind(vehiclesController)
});
// GET /api/vehicles/dropdown/transmissions?year=2024&make_id=1&model_id=1 - Get transmissions (Level 3)
fastify.get<{ Querystring: { year: number; make_id: number; model_id: number } }>('/vehicles/dropdown/transmissions', {
// GET /api/vehicles/dropdown/transmissions?year=2024&make=Ford&model=F-150 - Get transmissions (Level 3)
fastify.get<{ Querystring: { year: number; make: string; model: string } }>('/vehicles/dropdown/transmissions', {
preHandler: [fastify.authenticate],
handler: vehiclesController.getDropdownTransmissions.bind(vehiclesController)
});

View File

@@ -162,7 +162,7 @@ export class VehiclesService {
await cacheService.del(cacheKey);
}
async getDropdownMakes(year: number): Promise<{ id: number; name: string }[]> {
async getDropdownMakes(year: number): Promise<string[]> {
const vehicleDataService = getVehicleDataService();
const pool = getPool();
@@ -170,36 +170,36 @@ export class VehiclesService {
return vehicleDataService.getMakes(pool, year);
}
async getDropdownModels(year: number, makeId: number): Promise<{ id: number; name: string }[]> {
async getDropdownModels(year: number, make: string): Promise<string[]> {
const vehicleDataService = getVehicleDataService();
const pool = getPool();
logger.info('Fetching dropdown models via platform module', { year, makeId });
return vehicleDataService.getModels(pool, year, makeId);
logger.info('Fetching dropdown models via platform module', { year, make });
return vehicleDataService.getModels(pool, year, make);
}
async getDropdownTransmissions(_year: number, _makeId: number, _modelId: number): Promise<{ id: number; name: string }[]> {
logger.info('Providing dropdown transmissions from static list');
return [
{ id: 1, name: 'Automatic' },
{ id: 2, name: 'Manual' }
];
}
async getDropdownEngines(year: number, makeId: number, modelId: number, trimId: number): Promise<{ id: number; name: string }[]> {
async getDropdownTransmissions(year: number, make: string, model: string): Promise<string[]> {
const vehicleDataService = getVehicleDataService();
const pool = getPool();
logger.info('Fetching dropdown engines via platform module', { year, makeId, modelId, trimId });
return vehicleDataService.getEngines(pool, year, modelId, trimId);
logger.info('Fetching dropdown transmissions via platform module', { year, make, model });
return vehicleDataService.getTransmissions(pool, year, make, model);
}
async getDropdownTrims(year: number, makeId: number, modelId: number): Promise<{ id: number; name: string }[]> {
async getDropdownEngines(year: number, make: string, model: string, trim: string): Promise<string[]> {
const vehicleDataService = getVehicleDataService();
const pool = getPool();
logger.info('Fetching dropdown trims via platform module', { year, makeId, modelId });
return vehicleDataService.getTrims(pool, year, modelId);
logger.info('Fetching dropdown engines via platform module', { year, make, model, trim });
return vehicleDataService.getEngines(pool, year, make, model, trim);
}
async getDropdownTrims(year: number, make: string, model: string): Promise<string[]> {
const vehicleDataService = getVehicleDataService();
const pool = getPool();
logger.info('Fetching dropdown trims via platform module', { year, make, model });
return vehicleDataService.getTrims(pool, year, make, model);
}
async getDropdownYears(): Promise<number[]> {