FairRelay / ops /backend-dm /controllers /driverController.js
MouleeswaranM's picture
Upload folder using huggingface_hub
fcf8749 verified
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();
const MOCK_DRIVERS = [
{ id: 'drv-001', name: 'Rajesh Kumar', vehicle: 'Tata Ace', plate: 'MH-12-AB-1234', rating: 4.8, trips: 142, status: 'On Duty', avatar: 'RK', color: 'bg-orange-500', phone: '+91-9876543210', type: 'DIESEL', loc: 'Mumbai' },
{ id: 'drv-002', name: 'Priya Sharma', vehicle: 'Mahindra Treo EV', plate: 'KA-05-CD-4567', rating: 4.9, trips: 98, status: 'On Duty', avatar: 'PS', color: 'bg-emerald-500', phone: '+91-9876543211', type: 'ELECTRIC', loc: 'Bangalore' },
{ id: 'drv-003', name: 'Amit Patel', vehicle: 'Ashok Leyland', plate: 'DL-01-XY-9876', rating: 4.5, trips: 201, status: 'In Transit', avatar: 'AP', color: 'bg-blue-500', phone: '+91-9876543212', type: 'DIESEL', loc: 'Delhi' },
{ id: 'drv-004', name: 'Sunita Devi', vehicle: 'Tata Magic CNG', plate: 'TN-07-EF-3210', rating: 4.7, trips: 67, status: 'On Duty', avatar: 'SD', color: 'bg-purple-500', phone: '+91-9876543213', type: 'CNG', loc: 'Chennai' },
{ id: 'drv-005', name: 'Vikram Singh', vehicle: 'Eicher Pro', plate: 'GJ-18-PQ-5678', rating: 4.3, trips: 315, status: 'Off Duty', avatar: 'VS', color: 'bg-red-500', phone: '+91-9876543214', type: 'DIESEL', loc: 'Ahmedabad' },
];
exports.getAllDrivers = async (req, res) => {
try {
const { search, status } = req.query;
const drivers = await prisma.user.findMany({
where: {
role: 'DRIVER',
AND: [
search ? { OR: [
{ name: { contains: search, mode: 'insensitive' } },
{ currentVehicleNo: { contains: search, mode: 'insensitive' } },
{ homeBaseCity: { contains: search, mode: 'insensitive' } }
]} : {},
status ? { status: status.toUpperCase().replace(' ', '_') } : {},
{ registrationStatus: { not: 'REJECTED' } }
]
},
include: { trucks: true }
});
const formattedDrivers = drivers.map(d => ({
id: d.id,
name: d.name,
vehicle: d.trucks?.[0]?.model || d.vehicleType || 'Unknown Vehicle',
plate: d.currentVehicleNo || d.trucks?.[0]?.licensePlate || 'N/A',
rating: d.rating,
trips: d.deliveriesCount,
status: d.status.split('_').map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(' '),
avatar: d.initials || d.name.split(' ').map(n => n[0]).join(''),
color: d.avatarColor || 'bg-orange-500',
phone: d.phone,
type: d.vehicleType || d.trucks?.[0]?.type || 'Standard',
loc: d.homeBaseCity || 'Unknown'
}));
res.json(formattedDrivers);
} catch (error) {
console.warn('[Demo Mode] getAllDrivers using mock data');
res.json(MOCK_DRIVERS);
}
};
exports.getDriverById = async (req, res) => {
try {
const driver = await prisma.user.findUnique({ where: { id: req.params.id } });
if (!driver) return res.status(404).json({ message: 'Driver not found' });
res.json(driver);
} catch (error) {
const mock = MOCK_DRIVERS.find(d => d.id === req.params.id) || MOCK_DRIVERS[0];
res.json(mock);
}
};
exports.createDriver = async (req, res) => {
try {
const driver = await prisma.user.create({ data: { ...req.body, role: 'DRIVER' } });
res.status(201).json(driver);
} catch (error) {
console.warn('[Demo Mode] createDriver - DB unavailable, returning mock success');
res.status(201).json({ id: `drv-${Date.now()}`, ...req.body, role: 'DRIVER', message: 'Demo mode: driver created locally' });
}
};
exports.updateDriver = async (req, res) => {
try {
const driver = await prisma.user.update({ where: { id: req.params.id }, data: req.body });
res.json(driver);
} catch (error) {
console.warn('[Demo Mode] updateDriver - DB unavailable');
res.json({ id: req.params.id, ...req.body, message: 'Demo mode: update acknowledged' });
}
};
exports.deleteDriver = async (req, res) => {
try {
const timestamp = Date.now();
await prisma.user.update({
where: { id: req.params.id },
data: { registrationStatus: 'REJECTED', status: 'OFF_DUTY', name: 'Deleted Driver', phone: `deleted_${timestamp}_${req.params.id.substring(0, 5)}`, qrCode: `deleted_${timestamp}_${req.params.id.substring(0, 5)}`, currentVehicleNo: null }
});
res.status(204).send();
} catch (error) {
console.warn('[Demo Mode] deleteDriver - DB unavailable');
res.status(204).send();
}
};
exports.getActiveRoute = async (req, res) => {
try {
const { truckId } = req.params;
const activeRoute = await prisma.optimizedRoute.findFirst({
where: { truckId, status: { in: ['Allocated', 'Active'] } },
orderBy: { createdAt: 'desc' }
});
if (!activeRoute) return res.status(404).json({ message: 'No active route found' });
res.json({ truckId, routeId: activeRoute.id, polyline: activeRoute.routePolyline, checkpoints: activeRoute.waypoints || [] });
} catch (error) {
res.status(404).json({ message: 'No active route found (demo mode)' });
}
};