diff --git a/api/controllers/ApiController.js b/api/controllers/ApiController.js index f2a7268..6236b85 100644 --- a/api/controllers/ApiController.js +++ b/api/controllers/ApiController.js @@ -9,6 +9,15 @@ const config = { database: "intops" }; +var currentIn = []; +var currentInOther = []; +var currentOut = []; +var currentOutOther = []; +var maxCompare = 5; +var maxFalse = 0; +var falseIn = 0; +var falseOut = 0; + function makeDb(config) { const connection = mysql.createConnection(config); return { @@ -57,14 +66,112 @@ function levenshtein(a, b) { return matrix[b.length][a.length]; } -const db = makeDb(config); -var currentIn = []; -var currentOut = []; -var maxCompare = 5; -var maxFalse = 0; -var falseIn = 0; -var falseOut = 0; +function isSavePlate(type, timestamp, plate) { + if (type === "in") { + for (var i = 0; i < currentIn.length; i++) { + if ((timestamp - currentIn[i].time) < 600) { + if (plate === currentIn[i].plate) { + return false; + } /*else if (levenshtein(plate, currentIn[i].plate) < 2) { + return false; + }*/ + } + } + } + if (type === "out") { + for (var i = 0; i < currentOut.length; i++) { + if ((timestamp - currentOut[i].time) < 600) { + if (plate === currentOut[i].plate) { + return false; + } /*else if (levenshtein(plate, currentOut[i].plate) < 2) { + return false; + }*/ + } + } + } + return true; +} + +function isSavePlateOther(type, timestamp, plate) { + if (type === "in") { + for (var i = 0; i < currentInOther.length; i++) { + if ((timestamp - currentInOther[i].time) < 600) { + if (plate === currentInOther[i].plate) { + return false; + } else if (levenshtein(plate, currentInOther[i].plate) < 2) { + return false; + } + } + } + } + if (type === "out") { + for (var i = 0; i < currentOutOther.length; i++) { + if ((timestamp - currentOutOther[i].time) < 600) { + if (plate === currentOutOther[i].plate) { + return false; + } else if (levenshtein(plate, currentOutOther[i].plate) < 2) { + return false; + } + } + } + } + return true; +} + +function consoleLogPlate(type, reqPlate, currentPlate, currentTimestamp, saveType) { + if (type === "in") { + var listsIn = []; + for (var i = 0; i < currentIn.length; i++) { + listsIn.push(currentIn[i].plate); + } + console.log("req: ", reqPlate, " ", currentPlate, " ", type, " ", saveType, " ", listsIn); + + if (currentIn.length >= maxCompare) { + currentIn.shift(); + } + currentIn.push({"plate": currentPlate, "time": currentTimestamp}); + } + if (type === "out") { + var listsOut = []; + for (var i = 0; i < currentOut.length; i++) { + listsOut.push(currentOut[i].plate); + } + console.log("req: ", reqPlate, " ", currentPlate, " ", type, " ", saveType, " ", listsOut); + if (currentOut.length >= maxCompare) { + currentOut.shift(); + } + currentOut.push({"plate": currentPlate, "time": currentTimestamp}); + } +} + +function consoleLogPlateOther(type, reqPlate, currentPlate, currentTimestamp, saveType) { + if (type === "in") { + var listsIn = []; + for (var i = 0; i < currentInOther.length; i++) { + listsIn.push(currentInOther[i].plate); + } + console.log("req: ", reqPlate, " ", currentPlate, " ", type, " ", saveType, " ", listsIn); + + if (currentInOther.length >= maxCompare) { + currentInOther.shift(); + } + currentInOther.push({"plate": currentPlate, "time": currentTimestamp}); + } + if (type === "out") { + var listsOut = []; + for (var i = 0; i < currentOutOther.length; i++) { + listsOut.push(currentOutOther[i].plate); + } + console.log("req: ", reqPlate, " ", currentPlate, " ", type, " ", saveType, " ", listsOut); + if (currentOutOther.length >= maxCompare) { + currentOutOther.shift(); + } + currentOutOther.push({"plate": currentPlate, "time": currentTimestamp}); + } +} + +const db = makeDb(config); exports.SaveLogs = async function (req, res) { @@ -90,72 +197,87 @@ exports.SaveLogs = async function (req, res) { fs.mkdirSync(rootDir + currentYear + "/" + currentMonth + "/" + currentDate + "/" + req.body.type + "/frame"); var currentTimestamp = Math.round(today.getTime() / 1000); - var canSaveLogs = true; var vehicleInfo = {"status": false}; - if (req.body.type === "in") { - for (var i = 0; i < currentIn.length; i++) { - if ((currentTimestamp - currentIn[i].time) < 600) { - if (req.body.plate === currentIn[i].plate) { - canSaveLogs = false; - } else if (levenshtein(req.body.plate, currentIn[i].plate) < 2) { - canSaveLogs = false; - } - } + var currentPlate = ""; + var fileName = req.body.plate + "_" + currentTimestamp + ".png"; + var plateSaved = currentYear + "/" + currentMonth + "/" + currentDate + "/" + req.body.type + "/plate/" + fileName; + var frameSaved = currentYear + "/" + currentMonth + "/" + currentDate + "/" + req.body.type + "/frame/" + fileName; + + await fs.writeFileSync(rootDir + plateSaved, req.body.plate_image, 'base64'); + await fs.writeFileSync(rootDir + frameSaved, req.body.frame_image, 'base64'); + + var query_plate_raw = await db.query("SELECT * FROM vehicle WHERE plate='" + req.body.plate + "'"); + if (query_plate_raw.length > 0) { + vehicleInfo = {"status": true, "data": query_plate_raw[0]}; + currentPlate = query_plate_raw[0].plate; + if (req.body.type == "in" && isSavePlate(req.body.type, currentTimestamp, currentPlate)) { + var newLogs = await db.query("INSERT INTO logs(`vehicle_id`,`plate_image_in`,`frame_image_in`,`time_in`) VALUES ('" + query_plate_raw[0].id + "','" + plateSaved + "','" + frameSaved + "'," + currentTimestamp + ")"); + io.emit('logs', { + id: newLogs.insertId, + vehicleInfo: query_plate_raw[0], + type: "in", + image: plateSaved, + time: currentTimestamp + }); } - } - if (req.body.type === "out") { - for (var i = 0; i < currentOut.length; i++) { - if ((currentTimestamp - currentOut[i].time) < 600) { - if (req.body.plate === currentOut[i].plate) { - canSaveLogs = false; - } else if (levenshtein(req.body.plate, currentOut[i].plate) < 2) { - canSaveLogs = false; - } - } - } - } - - if (canSaveLogs) { - var currentPlate = ""; - var fileName = req.body.plate + "_" + currentTimestamp + ".png"; - var plateSaved = currentYear + "/" + currentMonth + "/" + currentDate + "/" + req.body.type + "/plate/" + fileName; - var frameSaved = currentYear + "/" + currentMonth + "/" + currentDate + "/" + req.body.type + "/frame/" + fileName; - - await fs.writeFileSync(rootDir + plateSaved, req.body.plate_image, 'base64'); - await fs.writeFileSync(rootDir + frameSaved, req.body.frame_image, 'base64'); - - var query_plate_raw = await db.query("SELECT * FROM vehicle WHERE plate='" + req.body.plate + "'"); - if (query_plate_raw.length > 0) { - vehicleInfo = {"status": true, "data": query_plate_raw[0]}; - currentPlate = query_plate_raw[0].plate; - if (req.body.type == "in") { - var newLogs = await db.query("INSERT INTO logs(`vehicle_id`,`plate_image_in`,`frame_image_in`,`time_in`) VALUES ('" + query_plate_raw[0].id + "','" + plateSaved + "','" + frameSaved + "'," + currentTimestamp + ")"); + if (req.body.type == "out" && isSavePlate(req.body.type, currentTimestamp, currentPlate)) { + var checkIn = await db.query("SELECT * FROM logs WHERE vehicle_id=" + query_plate_raw[0].id + " AND time_out=0 ORDER BY time_in DESC LIMIT 0,1"); + if (checkIn.length > 0) { + await db.query("UPDATE logs SET `plate_image_out`='" + plateSaved + "',`frame_image_out`='" + frameSaved + "',`time_out`=" + currentTimestamp + " WHERE id=" + checkIn[0].id); + io.emit('logs', { + id: checkIn[0].id, + vehicleInfo: query_plate_raw[0], + type: "out", + image: plateSaved, + time: currentTimestamp, + logs: checkIn[0] + }); + } else { + var newLogs = await db.query("INSERT INTO logs(`vehicle_id`,`plate_image_out`,`frame_image_out`,`time_out`) VALUES ('" + query_plate_raw[0].id + "','" + plateSaved + "','" + frameSaved + "'," + currentTimestamp + ")"); io.emit('logs', { id: newLogs.insertId, vehicleInfo: query_plate_raw[0], + type: "out", + image: plateSaved, + time: currentTimestamp, + logs: false + }); + } + } + consoleLogPlate(req.body.type, req.body.plate, currentPlate, currentTimestamp, "absolute"); + } else { + var query_plate_levenshtein = await db.query("SELECT * FROM `vehicle` WHERE LENGTH(`plate`)=" + req.body.plate.length + " AND levenshtein('" + req.body.plate + "', `plate`) BETWEEN 0 AND 1 LIMIT 0,1"); + if (query_plate_levenshtein.length > 0) { + vehicleInfo = {"status": true, "data": query_plate_levenshtein[0]}; + currentPlate = query_plate_levenshtein[0].plate; + if (req.body.type == "in" && isSavePlate(req.body.type, currentTimestamp, currentPlate)) { + var newLogs = await db.query("INSERT INTO logs(`vehicle_id`,`plate_image_in`,`frame_image_in`,`time_in`) VALUES ('" + query_plate_levenshtein[0].id + "','" + plateSaved + "','" + frameSaved + "'," + currentTimestamp + ")"); + io.emit('logs', { + id: newLogs.insertId, + vehicleInfo: query_plate_levenshtein[0], type: "in", image: plateSaved, time: currentTimestamp }); } - if (req.body.type == "out") { - var checkIn = await db.query("SELECT * FROM logs WHERE vehicle_id=" + query_plate_raw[0].id + " AND time_out=0 ORDER BY time_in DESC LIMIT 0,1"); + if (req.body.type == "out" && isSavePlate(req.body.type, currentTimestamp, currentPlate)) { + var checkIn = await db.query("SELECT * FROM logs WHERE vehicle_id=" + query_plate_levenshtein[0].id + " AND time_out=0 ORDER BY time_in DESC LIMIT 0,1"); if (checkIn.length > 0) { await db.query("UPDATE logs SET `plate_image_out`='" + plateSaved + "',`frame_image_out`='" + frameSaved + "',`time_out`=" + currentTimestamp + " WHERE id=" + checkIn[0].id); io.emit('logs', { id: checkIn[0].id, - vehicleInfo: query_plate_raw[0], + vehicleInfo: query_plate_levenshtein[0], type: "out", image: plateSaved, time: currentTimestamp, logs: checkIn[0] }); } else { - var newLogs = await db.query("INSERT INTO logs(`vehicle_id`,`plate_image_out`,`frame_image_out`,`time_out`) VALUES ('" + query_plate_raw[0].id + "','" + plateSaved + "','" + frameSaved + "'," + currentTimestamp + ")"); + var newLogs = await db.query("INSERT INTO logs(`vehicle_id`,`plate_image_out`,`frame_image_out`,`time_out`) VALUES ('" + query_plate_levenshtein[0].id + "','" + plateSaved + "','" + frameSaved + "'," + currentTimestamp + ")"); io.emit('logs', { id: newLogs.insertId, - vehicleInfo: query_plate_raw[0], + vehicleInfo: query_plate_levenshtein[0], type: "out", image: plateSaved, time: currentTimestamp, @@ -163,109 +285,43 @@ exports.SaveLogs = async function (req, res) { }); } } + consoleLogPlate(req.body.type, req.body.plate, currentPlate, currentTimestamp, "levenshtein"); } else { - var query_plate_levenshtein = await db.query("SELECT * FROM `vehicle` WHERE LENGTH(`plate`)>=" + req.body.plate.length + " AND levenshtein('" + req.body.plate + "', `plate`) BETWEEN 0 AND 1 LIMIT 0,1"); - if (query_plate_levenshtein.length > 0) { - vehicleInfo = {"status": true, "data": query_plate_levenshtein[0]}; - currentPlate = query_plate_levenshtein[0].plate; - if (req.body.type == "in") { - var newLogs = await db.query("INSERT INTO logs(`vehicle_id`,`plate_image_in`,`frame_image_in`,`time_in`) VALUES ('" + query_plate_levenshtein[0].id + "','" + plateSaved + "','" + frameSaved + "'," + currentTimestamp + ")"); - io.emit('logs', { - id: newLogs.insertId, - vehicleInfo: query_plate_levenshtein[0], - type: "in", - image: plateSaved, - time: currentTimestamp - }); + currentPlate = req.body.plate; + if (req.body.type == "in" && isSavePlateOther(req.body.type, currentTimestamp, currentPlate)) { + if (falseIn < maxFalse) { + vehicleInfo = {"status": false}; + falseIn++; + console.log("status: results in not found"); + } else { + falseIn = 0; + vehicleInfo = {"status": true}; + await db.query("INSERT INTO logs_unknow(`plate`,`plate_image_in`,`frame_image_in`,`time_in`) VALUES ('" + req.body.plate + "','" + plateSaved + "','" + frameSaved + "'," + currentTimestamp + ")"); } - if (req.body.type == "out") { - var checkIn = await db.query("SELECT * FROM logs WHERE vehicle_id=" + query_plate_levenshtein[0].id + " AND time_out=0 ORDER BY time_in DESC LIMIT 0,1"); - if (checkIn.length > 0) { - await db.query("UPDATE logs SET `plate_image_out`='" + plateSaved + "',`frame_image_out`='" + frameSaved + "',`time_out`=" + currentTimestamp + " WHERE id=" + checkIn[0].id); - io.emit('logs', { - id: checkIn[0].id, - vehicleInfo: query_plate_levenshtein[0], - type: "out", - image: plateSaved, - time: currentTimestamp, - logs: checkIn[0] - }); + } + if (req.body.type == "out" && isSavePlateOther(req.body.type, currentTimestamp, currentPlate)) { + if (falseOut < maxFalse) { + vehicleInfo = {"status": false}; + falseOut++; + console.log("status: results out not found"); + } else { + falseIn = 0; + vehicleInfo = {"status": true}; + var checkIn_raw = await db.query("SELECT * FROM logs_unknow WHERE plate='" + req.body.plate + "' AND time_out=0 ORDER BY time_in DESC LIMIT 0,1"); + if (checkIn_raw.length > 0) { + await db.query("UPDATE logs_unknow SET `plate_image_out`='" + plateSaved + "',`frame_image_out`='" + frameSaved + "',`time_out`=" + currentTimestamp + " WHERE id=" + checkIn_raw[0].id); } else { - var newLogs = await db.query("INSERT INTO logs(`vehicle_id`,`plate_image_out`,`frame_image_out`,`time_out`) VALUES ('" + query_plate_levenshtein[0].id + "','" + plateSaved + "','" + frameSaved + "'," + currentTimestamp + ")"); - io.emit('logs', { - id: newLogs.insertId, - vehicleInfo: query_plate_levenshtein[0], - type: "out", - image: plateSaved, - time: currentTimestamp, - logs: false - }); - } - } - } else { - currentPlate = req.body.plate; - if (req.body.type == "in") { - if (falseIn < maxFalse) { - vehicleInfo = {"status": false}; - falseIn++; - console.log("status: results in not found"); - } else { - falseIn = 0; - vehicleInfo = {"status": true}; - await db.query("INSERT INTO logs_unknow(`plate`,`plate_image_in`,`frame_image_in`,`time_in`) VALUES ('" + req.body.plate + "','" + plateSaved + "','" + frameSaved + "'," + currentTimestamp + ")"); - } - } - if (req.body.type == "out") { - if (falseOut < maxFalse) { - vehicleInfo = {"status": false}; - falseOut++; - console.log("status: results out not found"); - } else { - falseIn = 0; - vehicleInfo = {"status": true}; - var checkIn_raw = await db.query("SELECT * FROM logs_unknow WHERE plate='" + req.body.plate + "' AND time_out=0 ORDER BY time_in DESC LIMIT 0,1"); - if (checkIn_raw.length > 0) { - await db.query("UPDATE logs_unknow SET `plate_image_out`='" + plateSaved + "',`frame_image_out`='" + frameSaved + "',`time_out`=" + currentTimestamp + " WHERE id=" + checkIn_raw[0].id); + var checkIn_levenshtein = await db.query("SELECT * FROM `logs_unknow` WHERE levenshtein('" + req.body.plate + "', `plate`) BETWEEN 0 AND 1 AND time_out=0 ORDER BY time_in DESC LIMIT 0,1"); + if (checkIn_levenshtein.length > 0) { + await db.query("UPDATE logs_unknow SET `plate_image_out`='" + plateSaved + "',`frame_image_out`='" + frameSaved + "',`time_out`=" + currentTimestamp + " WHERE id=" + checkIn_levenshtein[0].id); } else { - var checkIn_levenshtein = await db.query("SELECT * FROM `logs_unknow` WHERE levenshtein('" + req.body.plate + "', `plate`) BETWEEN 0 AND 1 AND time_out=0 ORDER BY time_in DESC LIMIT 0,1"); - if (checkIn_levenshtein.length > 0) { - await db.query("UPDATE logs_unknow SET `plate_image_out`='" + plateSaved + "',`frame_image_out`='" + frameSaved + "',`time_out`=" + currentTimestamp + " WHERE id=" + checkIn_levenshtein[0].id); - } else { - await db.query("INSERT INTO logs_unknow(`plate`,`plate_image_out`,`frame_image_out`,`time_out`) VALUES ('" + req.body.plate + "','" + plateSaved + "','" + frameSaved + "'," + currentTimestamp + ")"); - } + await db.query("INSERT INTO logs_unknow(`plate`,`plate_image_out`,`frame_image_out`,`time_out`) VALUES ('" + req.body.plate + "','" + plateSaved + "','" + frameSaved + "'," + currentTimestamp + ")"); } } } } + consoleLogPlateOther(req.body.type, req.body.plate, currentPlate, currentTimestamp, "other"); } - if (req.body.type === "in") { - var lists = []; - for (var i = 0; i < currentIn.length; i++) { - lists.push(currentIn[i].plate); - } - console.log("req: ", req.body.plate, " ", currentPlate, " ", req.body.type, " ", lists, " ", vehicleInfo.status); - if (vehicleInfo.status) { - if (currentIn.length >= maxCompare) { - currentIn.shift(); - } - currentIn.push({"plate": currentPlate, "time": currentTimestamp}); - } - } - if (req.body.type === "out") { - var lists = []; - for (var i = 0; i < currentOut.length; i++) { - lists.push(currentOut[i].plate); - } - console.log("req: ", req.body.plate, " ", currentPlate, " ", req.body.type, " ", lists, " ", vehicleInfo.status); - if (vehicleInfo.status) { - if (currentOut.length >= maxCompare) { - currentOut.shift(); - } - currentOut.push({"plate": currentPlate, "time": currentTimestamp}); - } - } - res.send(vehicleInfo); - } else { - res.send({"status": true}); } + res.send(vehicleInfo); }; \ No newline at end of file