Files
Project/src/dal/postgresDAL.js
2025-12-01 23:00:34 -07:00

160 lines
3.6 KiB
JavaScript

import pg from "pg";
const pool = new pg.Pool({
connectionString: "postgresql://nate@localhost:5432/gtfs"
});
async function dbQuery(sql, params = []) {
const client = await pool.connect();
try {
const res = await client.query(sql, params);
return res.rows;
} finally {
client.release();
}
}
function toNumber(v) {
const n = Number(v);
return Number.isFinite(n) ? n : undefined;
}
export async function getVehicles() {
const rows = await dbQuery(
`SELECT vehicle_id, route_num, route_name, destination,
bearing, speed, latitude, longitude
FROM vehicles`
);
return rows.map((v) => ({
vehicleId: v.vehicle_id,
routeNum: v.route_num,
routeName: v.route_name,
destination: v.destination,
bearing: v.bearing == null ? undefined : toNumber(v.bearing),
speed: v.speed == null ? undefined : toNumber(v.speed),
location: {
latitude: toNumber(v.latitude),
longitude: toNumber(v.longitude),
},
}));
}
export async function getVehicleById(id) {
if (id == null) return null;
const rows = await dbQuery(
`SELECT vehicle_id, route_num, route_name, destination,
bearing, speed, latitude, longitude
FROM vehicles
WHERE vehicle_id = $1`,
[String(id)]
);
if (!rows.length) return null;
const v = rows[0];
return {
vehicleId: v.vehicle_id,
routeNum: v.route_num,
routeName: v.route_name,
destination: v.destination,
bearing: v.bearing == null ? undefined : toNumber(v.bearing),
speed: v.speed == null ? undefined : toNumber(v.speed),
location: {
latitude: toNumber(v.latitude),
longitude: toNumber(v.longitude),
},
};
}
export async function getRoutes() {
const rows = await dbQuery(`SELECT data FROM routes ORDER BY route_id`);
return rows.map((r) => r.data);
}
export async function getRouteById(routeId) {
if (routeId == null) return null;
const rows = await dbQuery(
`SELECT data FROM routes WHERE route_id = $1`,
[String(routeId)]
);
return rows[0]?.data || null;
}
export async function getRoutePathsMap() {
const rows = await dbQuery(`SELECT route_id, path FROM route_paths`);
const map = {};
for (const row of rows) {
map[String(row.route_id)] = row.path;
}
return map;
}
export async function getRoutePath(routeId) {
if (routeId == null) return null;
const rows = await dbQuery(
`SELECT path FROM route_paths WHERE route_id = $1`,
[String(routeId)]
);
return rows[0]?.path || null;
}
function transformationStationRow(row) {
return {
stop_id: row.stop_id,
stop_code: row.stop_code,
stop_name: row.stop_name,
stop_desc: row.stop_desc,
location: {
latitude: toNumber(row.latitude),
longitude: toNumber(row.longitude),
},
stop_url: row.stop_url,
location_type: row.location_type,
parent_station: row.parent_station,
lines: row.lines, // text[]
};
}
export async function getStationsRaw() {
const rows = await dbQuery(`SELECT * FROM stations`);
return rows;
}
export async function getStations() {
const rows = await dbQuery(`SELECT * FROM stations`);
return rows.map(transformationStationRow);
}
export async function getStopsByRoute(routeId) {
if (routeId == null) return [];
const rows = await dbQuery(
`SELECT * FROM stations WHERE lines @> ARRAY[$1]::text[]`,
[String(routeId)]
);
return rows.map(transformationStationRow);
}
export async function getStationById(id) {
if (id == null) return null;
const rows = await dbQuery(
`SELECT * FROM stations WHERE stop_id = $1`,
[String(id)]
);
if (!rows.length) return null;
return transformationStationRow(rows[0]);
}