Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 137 additions & 12 deletions server/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,30 +71,155 @@ app.post('/api/cabs', async (req, res) => {

// Delete a cab
app.delete('/api/cabs/:id', async (req, res) => {
const { id } = req.params;
await pool.query('DELETE FROM cabs WHERE id = $1', [id]);
res.json({ success: true });
const client = await pool.connect();

try {
const { id } = req.params;
console.log('Attempting to delete cab with ID:', id);

// Start transaction
await client.query('BEGIN');

// Check if the cab exists first
const checkResult = await client.query('SELECT * FROM cabs WHERE id = $1', [id]);
if (checkResult.rows.length === 0) {
await client.query('ROLLBACK');
return res.status(404).json({ error: 'Cab not found' });
}

// Delete related schedules first
const deletedSchedules = await client.query('DELETE FROM schedules WHERE cab_id = $1 RETURNING *', [id]);
console.log('Deleted schedules:', deletedSchedules.rows);

// Delete related routes where this cab is referenced (if any)
const deletedRoutes = await client.query('DELETE FROM routes WHERE cab_operator_id = $1 RETURNING *', [id]);
console.log('Deleted routes:', deletedRoutes.rows);

// Delete any other related data (bookings, etc.) if they exist
// Add more cascade deletes here as needed for other tables

// Finally, delete the cab
const result = await client.query('DELETE FROM cabs WHERE id = $1 RETURNING *', [id]);
console.log('Deleted cab:', result.rows[0]);

// Commit transaction
await client.query('COMMIT');

res.json({
success: true,
deletedCab: result.rows[0],
deletedSchedules: deletedSchedules.rows,
deletedRoutes: deletedRoutes.rows
});

} catch (error) {
// Rollback transaction on error
await client.query('ROLLBACK');
console.error('Error deleting cab:', error);
res.status(500).json({ error: 'Failed to delete cab: ' + error.message });
} finally {
client.release();
}
});

// Add a route
app.post('/api/routes', async (req, res) => {
const { origin, destination, distance_km, eta_min, base_fare, active, cab_operator_id } = req.body;
const result = await pool.query('INSERT INTO routes (origin, destination, distance_km, eta_min, base_fare, active, cab_operator_id) VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING *', [origin, destination, distance_km, eta_min, base_fare, active, cab_operator_id]);
res.json(result.rows[0]);
try {
console.log('Received route data:', req.body); // Debug log

const { origin, destination, distance_km, eta_min, base_fare, active, cab_operator_id } = req.body;

// Validate required fields
if (!origin || !destination || !distance_km) {
return res.status(400).json({ error: 'Missing required fields: origin, destination, distance_km' });
}

const result = await pool.query(
'INSERT INTO routes (origin, destination, distance_km, eta_min, base_fare, active, cab_operator_id) VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING *',
[origin, destination, distance_km, eta_min, base_fare, active, cab_operator_id]
);

console.log('Route created:', result.rows[0]); // Debug log

// Format the response to match what the frontend expects
const createdRoute = result.rows[0];
const formattedRoute = {
id: createdRoute.id,
from: createdRoute.origin,
to: createdRoute.destination,
distance: `${createdRoute.distance_km} km`
};

res.json(formattedRoute);

} catch (error) {
console.error('Error creating route:', error);
res.status(500).json({ error: 'Failed to create route: ' + error.message });
}
});

// Delete a route
app.delete('/api/routes/:id', async (req, res) => {
const { id } = req.params;
await pool.query('DELETE FROM routes WHERE id = $1', [id]);
res.json({ success: true });
const client = await pool.connect();

try {
const { id } = req.params;
console.log('Attempting to delete route with ID:', id);

// Start transaction
await client.query('BEGIN');

// Delete related schedules first
const deletedSchedules = await client.query('DELETE FROM schedules WHERE route_id = $1 RETURNING *', [id]);
console.log('Deleted schedules:', deletedSchedules.rows);

// Delete the route
const result = await client.query('DELETE FROM routes WHERE id = $1 RETURNING *', [id]);
console.log('Deleted route:', result.rows[0]);

// Commit transaction
await client.query('COMMIT');

res.json({
success: true,
deletedRoute: result.rows[0],
deletedSchedules: deletedSchedules.rows
});

} catch (error) {
// Rollback transaction on error
await client.query('ROLLBACK');
console.error('Error deleting route:', error);
res.status(500).json({ error: 'Failed to delete route: ' + error.message });
} finally {
client.release();
}
});

// Add a schedule
app.post('/api/schedules', async (req, res) => {
const { cab_id, route_id, frequency, time, price } = req.body;
const result = await pool.query('INSERT INTO schedules (cab_id, route_id, frequency, time, price) VALUES ($1, $2, $3, $4, $5) RETURNING *', [cab_id, route_id, frequency, time, price]);
res.json(result.rows[0]);
try {
console.log('Received schedule data:', req.body); // Debug log

const { cab_id, route_id, frequency, time, price } = req.body;

// Validate required fields
if (!cab_id || !route_id || !frequency || !time || !price) {
return res.status(400).json({ error: 'Missing required fields' });
}

const result = await pool.query(
'INSERT INTO schedules (cab_id, route_id, frequency, time, price) VALUES ($1, $2, $3, $4, $5) RETURNING *',
[cab_id, route_id, frequency, time, price]
);

console.log('Schedule created:', result.rows[0]); // Debug log
res.json(result.rows[0]);

} catch (error) {
console.error('Error creating schedule:', error);
res.status(500).json({ error: 'Failed to create schedule: ' + error.message });
}
});

// Delete a schedule
Expand Down
Loading