'use strict'; const util = require('util'); var mysql = require('mysql'); var fs = require('fs'); const config = { host: "localhost", user: "root", password: "", database: "intops" }; function makeDb(config) { const connection = mysql.createConnection(config); return { query(sql, args) { return util.promisify(connection.query) .call(connection, sql, args); }, close() { return util.promisify(connection.end).call(connection); } }; } function levenshtein(a, b) { if (a.length === 0) return b.length; if (b.length === 0) return a.length; var matrix = []; // increment along the first column of each row var i; for (i = 0; i <= b.length; i++) { matrix[i] = [i]; } // increment each column in the first row var j; for (j = 0; j <= a.length; j++) { matrix[0][j] = j; } // Fill in the rest of the matrix for (i = 1; i <= b.length; i++) { for (j = 1; j <= a.length; j++) { if (b.charAt(i - 1) == a.charAt(j - 1)) { matrix[i][j] = matrix[i - 1][j - 1]; } else { matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution Math.min(matrix[i][j - 1] + 1, // insertion matrix[i - 1][j] + 1)); // deletion } } } return matrix[b.length][a.length]; } const db = makeDb(config); var currentIn = []; var currentOut = []; exports.SaveLogs = async function (req, res) { var today = new Date(); var currentDate = today.getDate(); var currentMonth = today.getMonth() + 1; var currentYear = today.getFullYear(); var rootDir = "/mnt/d/xampp/htdocs/AIParking_Intops_Server/web/data/uploads/"; if (!fs.existsSync(rootDir + currentYear)) fs.mkdirSync(rootDir + currentYear); if (!fs.existsSync(rootDir + currentYear + "/" + currentMonth)) fs.mkdirSync(rootDir + currentYear + "/" + currentMonth); if (!fs.existsSync(rootDir + currentYear + "/" + currentMonth + "/" + currentDate)) fs.mkdirSync(rootDir + currentYear + "/" + currentMonth + "/" + currentDate); if (!fs.existsSync(rootDir + currentYear + "/" + currentMonth + "/" + currentDate + "/" + req.body.type)) fs.mkdirSync(rootDir + currentYear + "/" + currentMonth + "/" + currentDate + "/" + req.body.type); if (!fs.existsSync(rootDir + currentYear + "/" + currentMonth + "/" + currentDate + "/" + req.body.type + "/plate")) fs.mkdirSync(rootDir + currentYear + "/" + currentMonth + "/" + currentDate + "/" + req.body.type + "/plate"); if (!fs.existsSync(rootDir + currentYear + "/" + currentMonth + "/" + currentDate + "/" + req.body.type + "/frame")) 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) < 3) { canSaveLogs = false; } } } } 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) < 3) { canSaveLogs = false; } } } } 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, " ", req.body.type, " ", lists, " ", canSaveLogs); } 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, " ", req.body.type, " ", lists, " ", canSaveLogs); } if (canSaveLogs) { if (req.body.type === "in") { if (currentIn.length >= 10) { currentIn.shift(); } currentIn.push({"plate": req.body.plate, "time": currentTimestamp}); } if (req.body.type === "out") { if (currentOut.length >= 10) { currentOut.shift(); } currentOut.push({"plate": req.body.plate, "time": currentTimestamp}); } var query_plate_raw = await db.query("SELECT * FROM vehicle WHERE plate='" + req.body.plate + "'"); if (query_plate_raw.length == 0 && req.body.plate.length <= 7) { res.send(vehicleInfo); return; } 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'); if (query_plate_raw.length > 0) { vehicleInfo = {"status": true, "data": query_plate_raw[0]}; if (req.body.type == "in") { 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") { 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); } else { 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 + ")"); } } } else { var query_plate_levenshtein = await db.query("SELECT * FROM `vehicle` WHERE 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]}; if (req.body.type == "in") { 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 + ")"); } 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); } else { 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 + ")"); } } } else { if (req.body.type == "in") { 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_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 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 + ")"); } } } } } } res.send(vehicleInfo); };