130 lines
2.8 KiB
JavaScript
130 lines
2.8 KiB
JavaScript
const express = require('express');
|
|
const cors = require('cors');
|
|
const { PrismaClient } = require('@prisma/client');
|
|
const http = require('http');
|
|
const { Server } = require('socket.io');
|
|
|
|
const app = express();
|
|
const prisma = new PrismaClient();
|
|
|
|
app.use(cors());
|
|
app.use(express.json());
|
|
|
|
const server = http.createServer(app);
|
|
const io = new Server(server, {
|
|
cors: {
|
|
origin: "*",
|
|
methods: ["GET", "POST"]
|
|
}
|
|
});
|
|
|
|
// Hello World
|
|
app.get('/', (req, res) => {
|
|
res.send('ALPR Backend Running');
|
|
});
|
|
|
|
// Plates CRUD
|
|
app.get('/api/plates', async (req, res) => {
|
|
try {
|
|
const plates = await prisma.plate.findMany();
|
|
res.json(plates);
|
|
} catch (err) {
|
|
res.status(500).json({ error: err.message });
|
|
}
|
|
});
|
|
|
|
app.post('/api/plates', async (req, res) => {
|
|
const { number, owner, status } = req.body;
|
|
try {
|
|
const plate = await prisma.plate.create({
|
|
data: { number, owner, status: status || 'ALLOWED' }
|
|
});
|
|
res.json(plate);
|
|
} catch (err) {
|
|
res.status(500).json({ error: err.message });
|
|
}
|
|
});
|
|
|
|
// History Endpoint
|
|
app.get('/api/history', async (req, res) => {
|
|
const { date } = req.query; // Format: YYYY-MM-DD
|
|
if (!date) {
|
|
return res.status(400).json({ error: 'Date is required' });
|
|
}
|
|
|
|
const startDate = new Date(date);
|
|
startDate.setHours(0, 0, 0, 0);
|
|
|
|
const endDate = new Date(date);
|
|
endDate.setHours(23, 59, 59, 999);
|
|
|
|
try {
|
|
const logs = await prisma.accessLog.findMany({
|
|
where: {
|
|
timestamp: {
|
|
gte: startDate,
|
|
lte: endDate
|
|
}
|
|
},
|
|
orderBy: {
|
|
timestamp: 'desc'
|
|
}
|
|
});
|
|
res.json(logs);
|
|
} catch (err) {
|
|
res.status(500).json({ error: err.message });
|
|
}
|
|
});
|
|
|
|
// Detection Endpoint (from Python)
|
|
app.post('/api/detect', async (req, res) => {
|
|
const { plate_number } = req.body;
|
|
console.log(`Detected: ${plate_number}`);
|
|
|
|
try {
|
|
// Check if plate exists
|
|
let plate = await prisma.plate.findUnique({
|
|
where: { number: plate_number }
|
|
});
|
|
|
|
let accessStatus = 'DENIED';
|
|
|
|
if (plate && plate.status === 'ALLOWED') {
|
|
accessStatus = 'GRANTED';
|
|
}
|
|
|
|
if (!plate) {
|
|
// Optional: Auto-create unknown plates?
|
|
// For now, treat as UNKNOWN (Denied)
|
|
accessStatus = 'UNKNOWN';
|
|
}
|
|
|
|
// Log the access attempt
|
|
const log = await prisma.accessLog.create({
|
|
data: {
|
|
plateNumber: plate_number,
|
|
accessStatus,
|
|
timestamp: new Date()
|
|
}
|
|
});
|
|
|
|
// Notify Frontend via WebSocket
|
|
io.emit('new_detection', {
|
|
plate: plate_number,
|
|
status: accessStatus,
|
|
timestamp: log.timestamp
|
|
});
|
|
|
|
res.json({ message: 'Processed', accessStatus });
|
|
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: err.message });
|
|
}
|
|
});
|
|
|
|
const PORT = process.env.PORT || 3000;
|
|
server.listen(PORT, () => {
|
|
console.log(`Server running on port ${PORT}`);
|
|
});
|