File size: 5,395 Bytes
fcf8749
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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)' });
    }
};