From 7df3c6aea0acd4e6072c34af4d47785d0863a4a4 Mon Sep 17 00:00:00 2001 From: kry008 Date: Wed, 8 Jan 2025 07:48:06 +0100 Subject: [PATCH] Przygotowanie pod API --- serwer/app/apiLiczacy.js | 43 ++++++++++ serwer/app/apiPanel.js | 68 ++++++++++++++++ serwer/app/apiRoutes.js | 167 ++++++--------------------------------- serwer/app/index.js | 4 +- 4 files changed, 137 insertions(+), 145 deletions(-) create mode 100644 serwer/app/apiLiczacy.js create mode 100644 serwer/app/apiPanel.js diff --git a/serwer/app/apiLiczacy.js b/serwer/app/apiLiczacy.js new file mode 100644 index 0000000..53d2644 --- /dev/null +++ b/serwer/app/apiLiczacy.js @@ -0,0 +1,43 @@ +const express = require('express'); +const apiLiczacy = express.Router(); +const fs = require('fs'); + +require('dotenv').config(); +//mysql +var mysql = require('mysql2'); +var con = mysql.createConnection({ + host: process.env.MYSQLHOST, + user: process.env.MYSQLUSER, + password: process.env.MYSQLPASS, + port : process.env.MYSQLPORT, + database: process.env.MYSQLDB, + insecureAuth : true +}); +con.connect(function(err) { + if (err) throw err; + console.log('Connected!'); +}); +var bodyParser = require('body-parser'); +apiLiczacy.use(bodyParser.json()); +const {loger, sendToDiscord, sendEmail, makeid, checkSendEmail, baza} = require('./func.js'); + +apiLiczacy.use(function(req, res, next) { + var token = req.headers.token || req.body.token; + con.query("SELECT * FROM tokenyLiczacy WHERE token = ? AND aktywny = 1", [token], function(err, result) { + if(result.length > 0) { + var czas = new Date(result[0].czasAktywacji); + var now = new Date(); + if(now.getTime() - czas.getTime() > 86400000) { + res.send(403, {response: "Zaloguj się ponownie"}); + } else { + next(); + } + } + else { + res.send(403, {response: "Nie jesteś zalogowany"}); + } + }); +}); + + +module.exports = apiLiczacy; \ No newline at end of file diff --git a/serwer/app/apiPanel.js b/serwer/app/apiPanel.js new file mode 100644 index 0000000..d9c0ecb --- /dev/null +++ b/serwer/app/apiPanel.js @@ -0,0 +1,68 @@ +const express = require('express'); +const apiPanel = express.Router(); +const fs = require('fs'); + +require('dotenv').config(); +//mysql +var mysql = require('mysql2'); +var con = mysql.createConnection({ + host: process.env.MYSQLHOST, + user: process.env.MYSQLUSER, + password: process.env.MYSQLPASS, + port : process.env.MYSQLPORT, + database: process.env.MYSQLDB, + insecureAuth : true +}); +con.connect(function(err) { + if (err) throw err; + console.log('Connected!'); +}); +var bodyParser = require('body-parser'); +apiPanel.use(bodyParser.json()); +const {checkPesel, loger, sendToDiscord, sendEmail, makeid, checkSendEmail, baza, massEmail} = require('./func.js'); + + +//sprawdź czy token jest w bazie i jest 24h od generacji, jeżeli starszy zwróć że trzeba się zalogować ponownie +apiPanel.use(function(req, res, next) { + var token = req.headers.token || req.body.token; + con.query("SELECT * FROM tokeny WHERE token = ? AND aktywny = 1", [token], function(err, result) { + if(result.length > 0) { + var czas = new Date(result[0].czasAktywacji); + var now = new Date(); + if(now.getTime() - czas.getTime() > 86400000) { + res.send(403, {response: "Zaloguj się ponownie"}); + } else { + next(); + } + } + else { + res.send(403, {response: "Nie jesteś zalogowany"}); + } + }); +}); + + + +apiPanel.post("/liczacy", function(req, res) { + var imie = req.body.imie; + var nazwisko = req.body.nazwisko; + var qr = makeid(24); + con.query("SELECT * FROM liczacy WHERE qr = ?", [qr], function(err, result) { + if(result.length > 0) { + res.send(400, {response: "Błąd, spróbuj ponownie"}); + } else { + con.query("SELECT * FROM liczacy WHERE imie = ? AND nazwisko = ? AND aktywne = 1", [imie, nazwisko], function(err, result) { + if(result.length > 0) { + res.send(403, {response: "Błąd, spróbuj ponownie, taka osoba istnieje"}); + } else { + con.query("INSERT INTO liczacy (imie, nazwisko, qr) VALUES (?, ?, ?)", [imie, nazwisko, qr], function(err, result) { + res.send({response: "Dodano", qr: qr}); + }); + } + }); + } + }); +}); + + +module.exports = apiPanel; \ No newline at end of file diff --git a/serwer/app/apiRoutes.js b/serwer/app/apiRoutes.js index 74ca410..60544d1 100644 --- a/serwer/app/apiRoutes.js +++ b/serwer/app/apiRoutes.js @@ -1,5 +1,5 @@ const express = require('express'); -const route = express.Router(); +const api = express.Router(); const fs = require('fs'); require('dotenv').config(); @@ -12,171 +12,52 @@ var con = mysql.createConnection({ port : process.env.MYSQLPORT, database: process.env.MYSQLDB, insecureAuth : true - }); con.connect(function(err) { if (err) throw err; console.log('Connected!'); - }); -var cookie = require('cookie'); -var app = express(); var bodyParser = require('body-parser'); -app.use(bodyParser.urlencoded({ - extended: true -})); -//import functions from func.js -const {makeid, loger} = require('./func.js'); +const {makeid} = require('./func.js'); -//login via api -route.post('/', function(req, res) { - //in post there is login and password (already hashed) - console.log(req.body); +api.use(bodyParser.json()); + +api.post("/loginPanel", function(req, res) { var login = req.body.login; var password = req.body.password; - con.query('SELECT * FROM login WHERE login = ? AND haslo = ? AND aktywne = 1', [login, password], function(err, result) { - if (err) throw err; + con.query("SELECT * FROM login WHERE login = ? AND haslo = ?", [login, password], function(err, result) { + //jeżeli znajdziesz wygeneruj token i zapamiętaj go w bazie if (result.length > 0) { - var token = makeid(32); - con.query('INSERT INTO tokeny (token, typ, userId) VALUES (?, 1, ?)', [token, result[0].id], function(err, result) { - if (err) throw err; - res.cookie('token', token); - res.json({status: 'ok', token: token}); - loger(fs, 'Użytkownik zalogował się do panelu, token: ' + token, 'info'); + var token = makeid(64); + con.query("INSERT INTO tokeny (token, userId) VALUES (?, ?)", [token, result[0].id], function(err, result) { + res.send({response: "Zalogowano", token: token}); }); - } - else { - //send code 401 - res.status(401).json({status: 'error'}); - loger(fs, 'Użytkownik nie zalogował się do panelu, login: ' + login, 'error'); - } - }); -}); -route.use(function(req, res, next) { - var cookies = cookie.parse(req.headers.cookie || '') || req.body.token || req.query.token || req.headers['x-access-token']; - var token = cookies.token; - con.query('SELECT * FROM tokeny, login WHERE token = ? AND tokeny.userId = login.id AND aktywny = 1', [token], function(err, result) { - if (err) throw err; - if (result.length > 0) { - req.user = result[0]; - next(); } else { - res.json({status: 'not logged', goTo: '/api'}); - loger(fs, 'Użytkownik nie zalogował się do panelu, token: ' + token, 'error'); + res.send(403, {response: "Błędne dane logowania"}); } }); }); -route.all("/test", function(req, res) { - res.json({status: 'ok'}); - loger(fs, 'Użytkownik wykonał test', 'info'); -}); - -route.get("/osobyLiczace", function(req, res) { - con.query('SELECT * FROM liczacy WHERE aktywne = 1', function(err, result) { - if (err) throw err; - res.json(result); - loger(fs, 'Użytkownik wyświetlił listę osób liczących', 'info'); - }); -}); - -route.post("/osobyLiczace", function(req, res) { - //sprawdzenie czy nie ma już takiej osoby - con.query('SELECT * FROM liczacy WHERE imie = ? AND nazwisko = ? AND aktywne = 1', [req.body.imie, req.body.nazwisko], function(err, result) { - if (err) throw err; - if (result.length > 0) { - res.json({status: 'error', message: 'Taka osoba już istnieje.'}); - loger(fs, 'Użytkownik próbował dodać osobę liczącą, która już istnieje', 'error'); - } else { - con.query('INSERT INTO liczacy (imie, nazwisko) VALUES (?, ?)', [req.body.imie, req.body.nazwisko], function(err, result) { - if (err) throw err; - res.json({status: 'ok'}); - loger(fs, 'Użytkownik dodał osobę liczącą', 'info'); +api.post("/loginLiczacy", function(req, res) { + var qr = req.body.qr; + con.query("SELECT * FROM liczacy WHERE qr = ? AND aktywne = 1", [qr], function(err, result) { + if(result.length > 0) { + var token = makeid(64); + con.query("INSERT INTO tokenyLiczacy (token, userId) VALUES (?, ?)", [token, result[0].id], function(err, result) { + res.send({response: "Zalogowano", token: token}); }); - } - }); -}); - -route.get("/listaWolontariuszy", function(req, res) { - con.query('SELECT * FROM wolontariusz WHERE aktywny = 1', function(err, result) { - if (err) throw err; - res.json(result); - loger(fs, 'Użytkownik wyświetlił listę wolontariuszy', 'info'); - }); -}); -//edycja wolontariusza -route.put("/listaWolontariuszy", function(req, res) { - con.query('UPDATE wolontariusz SET imie = ?, nazwisko = ?, discord = ?, email = ?, telefon = ?, pesel = ?, terminal = ?, aktywny = ? WHERE id = ?', [req.body.imie, req.body.nazwisko, req.body.discord, req.body.email, req.body.telefon, req.body.pesel, req.body.terminal, req.body.aktywny, req.body.id], function(err, result) { - if (err) throw err; - res.json({status: 'ok'}); - loger(fs, 'Użytkownik edytował wolontariusza', 'info'); - }); -}); -//dodanie rozliczenia -route.post("/rozlicz", function(req, res) { - //sprawdzenie czy nie ma już takiego wolontariusza - con.query('SELECT * FROM rozliczenie WHERE wolontariuszID = ? AND aktywne = 1', [req.body.wolontariuszID], function(err, result) { - if (err) throw err; - if (result.length > 0) { - res.json({status: 'error', message: 'Taki wolontariusz już rozliczony.'}); - loger(fs, 'Użytkownik próbował dodać rozliczenie, które już istnieje ID: ' + req.body.wolontariuszID, 'error'); } else { - $sql = "INSERT INTO `rozliczenie` (`id`, `wolontariuszID`, `czasRozliczenia`, `terminal`, `sumaZTerminala`, `1gr`, `2gr`, `5gr`, `10gr`, `20gr`, `50gr`, `1zl`, `2zl`, `5zl`, `10zl`, `20zl`, `50zl`, `100zl`, `200zl`, `500zl`, `walutaObca`, `daryInne`, `uwagi`, `liczacy1`, `liczacy2`, `liczacy3`, `sala`, `weryfikowal`, `wpisaneDoBSS`, `ostatniaZmiana`, `aktywne`) "; - $sql += 'VALUES (NULL, ?, CURRENT_TIME(), ?, ?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,CURRENT_TIME(),1)'; - con.query($sql, [req.body.wolontariuszID, req.body.terminal, req.body.sumaZTerminala, req.body['1gr'], req.body['2gr'], req.body['5gr'], req.body['10gr'], req.body['20gr'], req.body['50gr'], req.body['1zl'], req.body['2zl'], req.body['5zl'], req.body['10zl'], req.body['20zl'], req.body['50zl'], req.body['100zl'], req.body['200zl'], req.body['500zl'], req.body.walutaObca, req.body.daryInne, req.body.uwagi, req.body.liczacy1, req.body.liczacy2, req.body.liczacy3, req.body.sala, req.body.weryfikowal], function(err, result) { - if (err) throw err; - res.json({status: 'ok'}); - loger(fs, 'Użytkownik dodał rozliczenie dla wolontariusza ID: ' + req.body.wolontariuszID, 'info'); - }); + res.send(403, {response: "Błędny kod QR"}); } }); }); -//lista rozliczeń -route.get("/rozliczenia", function(req, res) { - con.query('SELECT * FROM rozliczenie WHERE aktywne = 1', function(err, result) { - if (err) throw err; - res.json(result); - loger(fs, 'Użytkownik wyświetlił listę rozliczeń', 'info'); - }); -}); -//edycja rozliczenia -route.put("/rozliczenia", function(req, res) { - con.query('UPDATE rozliczenie SET wolontariuszID = ?, czasRozliczenia = ?, terminal = ?, sumaZTerminala = ?, `1gr` = ?, `2gr` = ?, `5gr` = ?, `10gr` = ?, `20gr` = ?, `50gr` = ?, `1zl` = ?, `2zl` = ?, `5zl` = ?, `10zl` = ?, `20zl` = ?, `50zl` = ?, `100zl` = ?, `200zl` = ?, `500zl` = ?, walutaObca = ?, daryInne = ?, uwagi = ?, liczacy1 = ?, liczacy2 = ?, liczacy3 = ?, sala = ?, weryfikowal = ?, wpisaneDoBSS = ?, ostatniaZmiana = ? WHERE id = ?', [req.body.wolontariuszID, req.body.czasRozliczenia, req.body.terminal, req.body.sumaZTerminala, req.body['1gr'], req.body['2gr'], req.body['5gr'], req.body['10gr'], req.body['20gr'], req.body['50gr'], req.body['1zl'], req.body['2zl'], req.body['5zl'], req.body['10zl'], req.body['20zl'], req.body['50zl'], req.body['100zl'], req.body['200zl'], req.body['500zl'], req.body.walutaObca, req.body.daryInne, req.body.uwagi, req.body.liczacy1, req.body.liczacy2, req.body.liczacy3, req.body.sala, req.body.weryfikowal, req.body.wpisaneDoBSS, req.body.ostatniaZmiana, req.body.id], function(err, result) { - if (err) throw err; - res.json({status: 'ok'}); - loger(fs, 'Użytkownik edytował rozliczenie ID: ' + req.body.id, 'info'); - }); -}); -//statystyki -route.get("/statystyki/zebranePrzezWolontariuszy", function(req, res) { - con.query('SELECT * FROM SumaZebranaPrzezWolontariuszy ORDER BY suma ASC', function(err, result) { - if (err) throw err; - res.json(result); - }); -}); +const apiPanel = require('./apiPanel.js'); +api.use('/panel', apiPanel); -route.get("/statystyki/liczacy", function(req, res) { - con.query('SELECT * FROM sumaPrzeliczona ORDER BY sumaPrzeliczona DESC', function(err, result) { - if (err) throw err; - res.json(result); - }); -}); - -route.get("/statystyki/rozliczenia", function(req, res) { - con.query('SELECT COUNT(*) AS liczba FROM rozliczenie WHERE aktywne = 1', function(err, result) { - if (err) throw err; - res.json(result); - }); -}); - -route.get("/statystyki/rozliczenia/ostatnie", function(req, res) { - con.query('SELECT * FROM rozliczenie WHERE aktywne = 1 ORDER BY czasRozliczenia DESC LIMIT 10', function(err, result) { - if (err) throw err; - res.json(result); - }); -}); +const apiLiczacy = require('./apiLiczacy.js'); +api.use('/liczacy', apiLiczacy); -module.exports = route; \ No newline at end of file +module.exports = api; \ No newline at end of file diff --git a/serwer/app/index.js b/serwer/app/index.js index f8c10dd..3dd41d1 100644 --- a/serwer/app/index.js +++ b/serwer/app/index.js @@ -64,7 +64,7 @@ function tryConnect() { const panelRoutes = require('./panelRoutes.js'); const liczacy = require('./liczacy.js'); - //const apiRoutes = require('./apiRoutes'); + const apiRoutes = require('./apiRoutes.js'); app.get('/', function(req, res) { res.redirect('/panel'); @@ -187,7 +187,7 @@ function tryConnect() { app.use('/panel', panelRoutes); app.use('/liczacy', liczacy); - //app.use('/api', apiRoutes); + app.use('/api', apiRoutes); app.all('/statystyki2', function(req, res) { var toReturn = headerHtml("Statystyki");