Files
ControlPatente/backend/src/index.js
2025-12-26 14:16:25 -03:00

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}`);
});