initial commit
This commit is contained in:
11
server/server/config.js
Normal file
11
server/server/config.js
Normal file
@@ -0,0 +1,11 @@
|
||||
const mysql = require('mysql');
|
||||
|
||||
const db = mysql.createConnection({
|
||||
host: "localhost",
|
||||
user: "root",
|
||||
password: "root",
|
||||
database:"iskalnik_dztps",
|
||||
port: "8889"
|
||||
});
|
||||
|
||||
module.exports = db;
|
||||
13
server/server/config/serviceAccountKey.json
Normal file
13
server/server/config/serviceAccountKey.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"type": "service_account",
|
||||
"project_id": "urejevalnikclanov",
|
||||
"private_key_id": "eeaa4514ce3659a0933a50f6b21875e25057aa26",
|
||||
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCUHnVMaSa4FlOM\nzRbYREDINE1crQM6uiGJWUDXOIV5LcRDUcv7Co02aJYMTlM/iqliK7u+CsQ6MOr2\ngJdHZR4htZf/VCNctlS1QfpKPYbeyE+3usI0Bsc840d264xwWZcEYYTingIJbTUP\nKi0+3l0cX7rTn+T89Wi0ag5Z2nBxF3wImhQ8a9wtdAMOwmLvOgjGo5i/UScbOlWM\nJf1RjH5X5CTsMJbXKB7XSxURJV5GMdvaNycYONc06sSoba3BtDxcZ6JbgW39CPCS\nkHjeQ3ORjHWxl6WNyZdo5yHtSOpn+jm+Wwtt6Z4zA6krTpBlqpiZLR6ahCyb4z5i\ns1x/+xjbAgMBAAECggEAJYzVMuJjeP7b/pGNzZT8EWVFCY4pB+3hC6dva0B+gfqK\ny4BEpKeHpjf8djEzJKQ8DdHFfkfPeGsnXge6klR9v5EAcC/96QamUe9giwqvEvKY\nVx1HF5ZyUyrRVsIfb+oegXNRk3v4Szh+35HTN6F63HMec4ERNdnnSfmrGrdokxq8\nz+G0riVLkAtFfLYhCXjvqoZGxLPdaxOL41ftaZkI2Xy/gj4XIKahvi0X13LH3VD+\n4+PV3IXDtMq50TPHspKi1DipNK+X1JY1aFpAypj4EkE7Vd7OuSd2ZI83O1gZaDkT\noKInkIIrKEPrEaF4M1jErZYeERy3F1ZiWJXHk/yJxQKBgQDEgLk9uyETSwKtATrA\nJfWMXYGvhDr1r/YkhFFJQyGspJi05oTaKrdkS1pcyDyNSA18o6ogLEfO5007GGVc\nPIUAqwN2ZpPKYeMhFrd2TEd3unjCVWe+iUcRVo0QGO3Mu3YBjhRr6qtp/l/PCgwE\nm4ZoCDvB6fLpovjKKQiCCXRMPQKBgQDA92sMe3vNgm3MqmgrH9TT/9Vhr1jwiyd8\njkNGy9LfKLwUWd4Zzg6eUly/JgX4vJzwKPkG8mszZDRzmWwcgrDhKAjo7u4MEjDp\nhdJxpIwWK1r0X6Dvi/IAY7qNLd1rX2QOnyQ0rV2QmCke0a0E/lpFr3ZDbKTD6k8o\ny3VGxWJS9wKBgCip4quNn+iYKzOV/4xnzop/hyjFGlZhVXR1FUUt6TgKz7cPxQpI\nsK7GkSqGHVG3SWMzky8ZOrrsTqUeBUuzEmry+MJ1s7u7yf687rZCTr/ODNNaTR+2\n1MgXuxVLs1ocqOzldABpDZPfmgAEOjxx2ryIh6U3PpdurEFZgHM4daKZAoGAIWIs\niOpMDs/DwyawAtXs8ghOmCnHz0WjvS63gOX+Q1E+yJ6LiBdX/Bfvp7oiSlgHJp1Q\nB92koi1xzZX7WCtcAnf0oqfDUx9Kivv13mdDPQqfH6vzob2qTlryiT4oEk1ceBMc\nJmjfyQYqBwTrU/PVFj02zo9bKfG9ZCde0LGRQx0CgYEAn8/nzdXPov1x8gw/QNxl\nIIbXRo/d7viBl2L/9BB7E3vAjX+AsORHBObc1V1jQLuSwVyvNL/Q6sfQYjZwxqZl\n9EluyZkZjxRdrQF8IAMpjlJu0ah5HFj50Y7GZR3M8Sh2qLdR9pCV3U96hkEnbh7l\n3b39kGxAv3scZwW7LqckUxk=\n-----END PRIVATE KEY-----\n",
|
||||
"client_email": "firebase-adminsdk-ks6ly@urejevalnikclanov.iam.gserviceaccount.com",
|
||||
"client_id": "114527686247519116266",
|
||||
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
||||
"token_uri": "https://oauth2.googleapis.com/token",
|
||||
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
||||
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-ks6ly%40urejevalnikclanov.iam.gserviceaccount.com",
|
||||
"universe_domain": "googleapis.com"
|
||||
}
|
||||
936
server/server/index.js
Normal file
936
server/server/index.js
Normal file
@@ -0,0 +1,936 @@
|
||||
// Import necessary modules
|
||||
const express = require('express');
|
||||
const cors = require('cors');
|
||||
const admin = require('firebase-admin');
|
||||
const mysql = require('mysql');
|
||||
const dotenv = require('dotenv');
|
||||
const assert = require('assert');
|
||||
// const db = require('./config');
|
||||
|
||||
// Load environment variables from .env file
|
||||
dotenv.config();
|
||||
|
||||
// Firebase Admin SDK configuration
|
||||
const serviceAccount = require('./config/serviceAccountKey.json'); // Update with your serviceAccountKey.json file
|
||||
admin.initializeApp({
|
||||
credential: admin.credential.cert(serviceAccount)
|
||||
});
|
||||
|
||||
// MySQL database connection setup
|
||||
const db = mysql.createConnection({
|
||||
host: process.env.MYSQL_HOST,
|
||||
user: process.env.MYSQL_USER,
|
||||
password: process.env.MYSQL_PASSWORD,
|
||||
database: process.env.MYSQL_DATABASE,
|
||||
port: process.env.MYSQL_PORT,
|
||||
});
|
||||
|
||||
// const db = mysql.createConnection({
|
||||
// host: "localhost",
|
||||
// user: "root",
|
||||
// password: "",
|
||||
// database:"iskalnik_dztps"
|
||||
// });
|
||||
|
||||
db.connect((err) => {
|
||||
if (err) {
|
||||
console.error('MySQL connection failed:', err);
|
||||
} else {
|
||||
console.log('Connected to MySQL database');
|
||||
}
|
||||
});
|
||||
|
||||
// Helper function to promisify database queries
|
||||
const query = (sql, params) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
db.query(sql, params, (err, result) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
resolve(result);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
// Express application
|
||||
const app = express();
|
||||
|
||||
// Middleware
|
||||
app.use(cors());
|
||||
app.use(express.json());
|
||||
|
||||
// Firebase authentication middleware
|
||||
const authenticateFirebaseToken = async (req, res, next) => {
|
||||
try {
|
||||
const { authorization } = req.headers;
|
||||
if (!authorization || !authorization.startsWith('Bearer ')) {
|
||||
return res.status(401).json({ message: 'Unauthorized' });
|
||||
}
|
||||
|
||||
const idToken = authorization.split('Bearer ')[1];
|
||||
const decodedToken = await admin.auth().verifyIdToken(idToken);
|
||||
req.uid = decodedToken.uid;
|
||||
next();
|
||||
} catch (error) {
|
||||
console.error('Error authenticating Firebase token:', error);
|
||||
return res.status(401).json({ message: 'Unauthorized' });
|
||||
}
|
||||
};
|
||||
|
||||
// Protected route example
|
||||
app.get('/express', authenticateFirebaseToken, (req, res) => {
|
||||
// Access user ID from req.uid
|
||||
// Fetch data from MySQL using the user ID or perform other operations
|
||||
res.json({ message: 'Protected route accessed successfully' });
|
||||
});
|
||||
|
||||
// Start the Express server
|
||||
const PORT = process.env.PORT || 3000;
|
||||
app.listen(PORT, () => {
|
||||
console.log(`Server is running on port ${PORT}`);
|
||||
});
|
||||
|
||||
|
||||
/**********************************
|
||||
* clan
|
||||
*********************************/
|
||||
|
||||
function formClanStruct(from, id=null) {
|
||||
if (!id) id = from.id;
|
||||
return {
|
||||
'id': id,
|
||||
'id_izkaznica': from.id_izkaznica || "",
|
||||
'ime': from.ime || "",
|
||||
'priimek': from.priimek || "",
|
||||
'spol': from.spol || "",
|
||||
'datum_rojstva': from.datum_rojstva || "",
|
||||
'kraj_rojstva': from.kraj_rojstva || "",
|
||||
'drzavljanstvo': from.drzavljanstvo || "",
|
||||
'solska_izobrazba': from.solska_izobrazba || "",
|
||||
'telefondoma': from.telefondoma || "",
|
||||
'telefonsluzba': from.telefonsluzba || "",
|
||||
'telefonmobi': from.telefonmobi || "",
|
||||
'email': from.email || "",
|
||||
'spletnastran': from.spletnastran || "",
|
||||
'naslovbivalisca': from.naslovbivalisca || "",
|
||||
'ulica': from.ulica || "",
|
||||
'postna_stevilka': from.postna_stevilka || "",
|
||||
'posta': from.posta || "",
|
||||
'osnovni_poklic': from.osnovni_poklic || "",
|
||||
'sedanja_zaposlitev': from.sedanja_zaposlitev || "",
|
||||
'prevajalska_praksa': from.prevajalska_praksa || "",
|
||||
'nacin_pridobivanja_znanja_tujih_jezikov': from.nacin_pridobivanja_znanja_tujih_jezikov || "",
|
||||
'datum_vclanitve': from.datum_vclanitve || "",
|
||||
'materni_jezik': from.materni_jezik || "",
|
||||
'objava_v_iskalniku': from.objava_v_iskalniku || 0
|
||||
}
|
||||
}
|
||||
|
||||
function formClanValueArray(res) {
|
||||
const body = res.body;
|
||||
return [body.id_izkaznica, body.ime, body.priimek, body.spol, body.datum_rojstva ? new Date(body.datum_rojstva) : null,
|
||||
body.kraj_rojstva, body.drzavljanstvo, body.solska_izobrazba, body.telefondoma,
|
||||
body.telefonsluzba, body.telefonmobi, body.email, body.spletnastran, body.naslovbivalisca,
|
||||
body.ulica, body.postna_stevilka, body.posta, body.osnovni_poklic, body.sedanja_zaposlitev, body.prevajalska_praksa, body.nacin_pridobivanja_znanja_tujih_jezikov, body.datum_vclanitve ? new Date(body.datum_vclanitve) : null,
|
||||
body.materni_jezik, body.objava_v_iskalniku
|
||||
];
|
||||
}
|
||||
|
||||
app.get("/express/api/v1/clan/", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`SELECT *
|
||||
FROM clan`, (err, result, fields) => {
|
||||
if (err) {
|
||||
res.sendStatus(500);
|
||||
return;
|
||||
}
|
||||
const out = result.map(row => formClanStruct(row));
|
||||
res.status(200).json(out);
|
||||
});
|
||||
});
|
||||
|
||||
app.get("/express/api/v1/clan/:id", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`SELECT *
|
||||
FROM clan
|
||||
WHERE id = ?`, [req.params.id], (err, result, fields) => {
|
||||
if (result.length === 0 || err) {
|
||||
res.sendStatus(404);
|
||||
return;
|
||||
}
|
||||
const first = result[0];
|
||||
const out = formClanStruct(first);
|
||||
res.status(200).json(out);
|
||||
});
|
||||
});
|
||||
|
||||
app.post("/express/api/v1/clan/", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`INSERT INTO clan (
|
||||
id_izkaznica, ime, priimek, spol, datum_rojstva, kraj_rojstva,
|
||||
drzavljanstvo, solska_izobrazba, telefondoma, telefonsluzba,
|
||||
telefonmobi, email, spletnastran, naslovbivalisca, ulica,
|
||||
postna_stevilka, posta, osnovni_poklic, sedanja_zaposlitev, prevajalska_praksa, nacin_pridobivanja_znanja_tujih_jezikov, datum_vclanitve,
|
||||
materni_jezik, objava_v_iskalniku
|
||||
)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
`, formClanValueArray(req), (err, result) => {
|
||||
if (!err && result.affectedRows === 1) {
|
||||
res.status(200).json(formClanStruct(req.body, result.insertId));
|
||||
} else {
|
||||
res.status(200).json(err);
|
||||
// res.sendStatus(400);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
app.put("/express/api/v1/clan/:id", authenticateFirebaseToken, (req, res) => {
|
||||
const valueArr = formClanValueArray(req);
|
||||
valueArr.push(req.params.id);
|
||||
db.query(`UPDATE clan
|
||||
SET id_izkaznica=?, ime=?, priimek=?, spol=?, datum_rojstva=?, kraj_rojstva=?,
|
||||
drzavljanstvo=?, solska_izobrazba=?, telefondoma=?, telefonsluzba=?,
|
||||
telefonmobi=?, email=?, spletnastran=?, naslovbivalisca=?, ulica=?,
|
||||
postna_stevilka=?, posta=?, osnovni_poklic=?, sedanja_zaposlitev=?, prevajalska_praksa=?, nacin_pridobivanja_znanja_tujih_jezikov=?, datum_vclanitve=?,
|
||||
materni_jezik=?, objava_v_iskalniku=?
|
||||
WHERE id=?
|
||||
`, valueArr, (err, result, fields) => {
|
||||
if (!err && result.affectedRows === 1) {
|
||||
res.status(200).json(formClanStruct(req.body, req.params.id));
|
||||
} else {
|
||||
res.sendStatus(400);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
app.delete("/express/api/v1/clan/:id", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`DELETE FROM clan
|
||||
WHERE id = ?`, [req.params.id], (err, result, fields) => {
|
||||
if (!err && result.affectedRows === 1) {
|
||||
res.sendStatus(200);
|
||||
} else {
|
||||
res.sendStatus(400);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
/**********************************
|
||||
* prevod
|
||||
*********************************/
|
||||
|
||||
function getVloge(prevodID) {
|
||||
return new Promise((resolve) => {
|
||||
db.query(`SELECT v.id as 'id', vloga, izpis_zenska, izpis_moski
|
||||
FROM prevod_vloga as pv
|
||||
JOIN vloga as v
|
||||
ON pv.vloga_id = v.id
|
||||
WHERE pv.prevod_id = ?
|
||||
`, [prevodID], (err, result, fields) => {
|
||||
if (err) throw err;
|
||||
function formVloga(row) {
|
||||
return {
|
||||
'id': row.id,
|
||||
'vloga': row.vloga,
|
||||
'izpis_zenska': row.izpis_zenska,
|
||||
'izpis_moski': row.izpis_moski
|
||||
}
|
||||
}
|
||||
resolve(result.map(row => formVloga(row)));
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
function getPodrocja(prevodID) {
|
||||
return new Promise((resolve) => {
|
||||
db.query(`SELECT p.id as 'id', podrocje
|
||||
FROM prevod_podrocje as pp
|
||||
JOIN podrocje as p
|
||||
ON pp.podrocje_id = p.id
|
||||
WHERE pp.prevod_id = ?
|
||||
`, [prevodID], (err, result, fields) => {
|
||||
if (err) throw err;
|
||||
function formPodrocje(row) {
|
||||
return {
|
||||
'id': row.id,
|
||||
'podrocje': row.podrocje,
|
||||
}
|
||||
}
|
||||
|
||||
resolve(result.map(row => formPodrocje(row)));
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
async function formPrevodStruct(from, id=null) {
|
||||
if (!id) id = from.id;
|
||||
const out = {
|
||||
'id': id,
|
||||
'id_clan': from.id_clan,
|
||||
'rang': from.rang,
|
||||
'iz': from.iz,
|
||||
'v': from.v,
|
||||
'licenca_DZTPS': from.licenca_DZTPS,
|
||||
};
|
||||
const podrocja = await getPodrocja(id);
|
||||
const vloge = await getVloge(id);
|
||||
out.podrocja = podrocja;
|
||||
out.vloge = vloge;
|
||||
return out;
|
||||
}
|
||||
app.get("/express/api/v1/clan/:id/prevod/", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`SELECT p.id as 'id', id_clan, rang, iz.jezik as 'iz', v.jezik as 'v', licenca_DZTPS
|
||||
FROM prevod as p
|
||||
JOIN jezik as iz
|
||||
ON p.iz_id = iz.id
|
||||
JOIN jezik as v
|
||||
ON p.v_id = v.id
|
||||
WHERE id_clan = ?
|
||||
`, [req.params.id], async (err, result, fields) => {
|
||||
if (err) {
|
||||
res.sendStatus(500);
|
||||
return;
|
||||
}
|
||||
const out = await Promise.all(result.map(row => formPrevodStruct(row)));
|
||||
res.status(200).json(out);
|
||||
});
|
||||
});
|
||||
|
||||
app.get("/express/api/v1/clan/:id/prevod/:pid", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`SELECT p.id as 'id', id_clan, rang, iz.jezik as 'iz', v.jezik as 'v', licenca_DZTPS
|
||||
FROM prevod as p
|
||||
JOIN jezik as iz
|
||||
ON p.iz_id = iz.id
|
||||
JOIN jezik as v
|
||||
ON p.v_id = v.id
|
||||
WHERE p.id_clan = ? AND p.id = ?
|
||||
`, [req.params.id, req.params.pid], async (err, result, fields) => {
|
||||
if (err || result.length === 0) {
|
||||
res.sendStatus(404);
|
||||
return;
|
||||
}
|
||||
const first = result[0];
|
||||
const out = await formPrevodStruct(first);
|
||||
res.status(200).json(out);
|
||||
});
|
||||
});
|
||||
|
||||
async function addPrevodVloga(prevodID, vloga) {
|
||||
await query(`INSERT INTO prevod_vloga
|
||||
(prevod_id, vloga_id)
|
||||
VALUES
|
||||
(?, (
|
||||
SELECT v.id
|
||||
FROM vloga as v
|
||||
WHERE v.vloga = ?
|
||||
))
|
||||
`, [prevodID, vloga]);
|
||||
}
|
||||
async function removePrevodVloga(prevodID, vloga) {
|
||||
await query(`DELETE FROM prevod_vloga
|
||||
WHERE prevod_id=? AND vloga_id=(
|
||||
SELECT v.id
|
||||
FROM vloga as v
|
||||
WHERE v.vloga = ?
|
||||
)
|
||||
`, [prevodID, vloga]);
|
||||
}
|
||||
|
||||
async function addPrevodPodrocje(prevodID, podrocje) {
|
||||
await query(`INSERT INTO prevod_podrocje
|
||||
(prevod_id, podrocje_id)
|
||||
VALUES
|
||||
(?, (
|
||||
SELECT p.id
|
||||
FROM podrocje as p
|
||||
WHERE p.podrocje=?
|
||||
))
|
||||
`, [prevodID, podrocje]);
|
||||
}
|
||||
|
||||
async function removePrevodPodrocje(prevodID, podrocje) {
|
||||
await query(`DELETE FROM prevod_podrocje
|
||||
WHERE prevod_id=? AND podrocje_id=(
|
||||
SELECT p.id
|
||||
FROM podrocje as p
|
||||
WHERE p.podrocje = ?
|
||||
)
|
||||
`, [prevodID, podrocje]);
|
||||
}
|
||||
|
||||
app.post("/express/api/v1/clan/:id/prevod/", async (req, res) => {
|
||||
await db.beginTransaction();
|
||||
try {
|
||||
assert(req.body.id_clan == req.params.id);
|
||||
const prevod = await query(`INSERT INTO prevod
|
||||
(id_clan, rang, iz_id, v_id, licenca_DZTPS)
|
||||
VALUES
|
||||
(?, ?, (
|
||||
SELECT iz.id
|
||||
FROM jezik as iz
|
||||
WHERE iz.jezik=?
|
||||
), (
|
||||
SELECT v.id
|
||||
FROM jezik as v
|
||||
WHERE v.jezik=?
|
||||
), ?)
|
||||
`, [req.body.id_clan, req.body.rang, req.body.iz, req.body.v, req.body.licenca_DZTPS]);
|
||||
|
||||
const prevodID = prevod.insertId;
|
||||
for (let podrocje of req.body.podrocja) {
|
||||
await addPrevodPodrocje(prevodID, podrocje.podrocje);
|
||||
}
|
||||
for (let vloga of req.body.vloge) {
|
||||
await addPrevodVloga(prevodID, vloga.vloga);
|
||||
}
|
||||
|
||||
await db.commit();
|
||||
res.status(200).json(await formPrevodStruct(req.body, prevodID));
|
||||
} catch (e) {
|
||||
db.rollback();
|
||||
res.sendStatus(400);
|
||||
}
|
||||
});
|
||||
|
||||
app.put("/express/api/v1/clan/:id/prevod/:pid", async (req, res) => {
|
||||
await db.beginTransaction();
|
||||
try {
|
||||
await query(`UPDATE prevod
|
||||
SET id_clan=?,
|
||||
rang=?,
|
||||
iz_id=(SELECT iz.id
|
||||
FROM jezik as iz
|
||||
WHERE iz.jezik = ?),
|
||||
v_id=(SELECT v.id
|
||||
FROM jezik as v
|
||||
WHERE v.jezik = ?),
|
||||
licenca_DZTPS=?
|
||||
WHERE id_clan=? AND id=?
|
||||
`, [req.body.id_clan, req.body.rang, req.body.iz, req.body.v, req.body.licenca_DZTPS, req.params.id, req.params.pid]);
|
||||
|
||||
const prevod = await formPrevodStruct(req.body);
|
||||
|
||||
// Synchronize podrocja
|
||||
const oldPodrocja = prevod.podrocja;
|
||||
const newPodrocja = req.body.podrocja;
|
||||
for (let podrocje of oldPodrocja) {
|
||||
// Podrocje not present in new -> delete
|
||||
if (!newPodrocja.some(p => p.id === podrocje.id))
|
||||
await removePrevodPodrocje(prevod.id, podrocje.podrocje);
|
||||
}
|
||||
for (let podrocje of newPodrocja) {
|
||||
// Podrocje present in new but not in old -> add
|
||||
if (!oldPodrocja.some(p => p.id === podrocje.id))
|
||||
await addPrevodPodrocje(prevod.id, podrocje.podrocje);
|
||||
}
|
||||
// Synchronize vloge
|
||||
const oldVloge = prevod.vloge;
|
||||
const newVloge = req.body.vloge;
|
||||
for (let vloga of oldVloge) {
|
||||
// Vloga not present in new -> delete
|
||||
if (!newVloge.some(v => v.id === vloga.id))
|
||||
await removePrevodVloga(prevod.id, vloga.vloga);
|
||||
}
|
||||
for (let vloga of newVloge) {
|
||||
// Vloga present in new but not in old -> add
|
||||
if (!oldVloge.some(v => v.id === vloga.id))
|
||||
await addPrevodVloga(prevod.id, vloga.vloga);
|
||||
}
|
||||
|
||||
await db.commit();
|
||||
res.status(200).json(await formPrevodStruct(req.body));
|
||||
} catch (e) {
|
||||
db.rollback();
|
||||
res.sendStatus(400);
|
||||
}
|
||||
});
|
||||
|
||||
app.delete("/express/api/v1/clan/:id/prevod/:pid", async (req, res) => {
|
||||
await db.beginTransaction();
|
||||
try {
|
||||
await query(`DELETE FROM prevod_podrocje WHERE prevod_id=?`, [req.params.pid]);
|
||||
await query(`DELETE FROM prevod_vloga WHERE prevod_id=?`, [req.params.pid]);
|
||||
await query(`DELETE FROM prevod WHERE id_clan=? AND id=?`, [req.params.id, req.params.pid]);
|
||||
await db.commit();
|
||||
res.sendStatus(200);
|
||||
} catch (e) {
|
||||
db.rollback();
|
||||
res.sendStatus(400);
|
||||
}
|
||||
});
|
||||
|
||||
/**********************************
|
||||
* jezik
|
||||
*********************************/
|
||||
|
||||
function formJezikStruct(from, id=null) {
|
||||
if (!id) id = from.id;
|
||||
return {
|
||||
'id': id,
|
||||
'jezik': from.jezik
|
||||
};
|
||||
}
|
||||
|
||||
app.get("/express/api/v1/jezik/", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`SELECT id, jezik
|
||||
FROM jezik`, (err, result, fields) => {
|
||||
if (err) {
|
||||
res.sendStatus(500);
|
||||
return;
|
||||
}
|
||||
const out = result.map(row => formJezikStruct(row));
|
||||
res.status(200).json(out);
|
||||
});
|
||||
});
|
||||
|
||||
app.get("/express/api/v1/jezik/:id", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`SELECT id, jezik
|
||||
FROM jezik
|
||||
WHERE id = ?`, [req.params.id], (err, result, fields) => {
|
||||
if (result.length === 0 || err) {
|
||||
res.sendStatus(404);
|
||||
return;
|
||||
}
|
||||
const first = result[0];
|
||||
const out = formJezikStruct(first);
|
||||
res.status(200).json(out);
|
||||
});
|
||||
});
|
||||
|
||||
app.post("/express/api/v1/jezik/", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`INSERT INTO jezik
|
||||
(jezik)
|
||||
VALUES (?)`, [req.body.jezik], (err, result) => {
|
||||
if (!err && result.affectedRows === 1) {
|
||||
res.status(200).json(formJezikStruct(req.body, result.insertId));
|
||||
} else {
|
||||
res.sendStatus(400);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
app.put("/express/api/v1/jezik/:id", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`UPDATE jezik
|
||||
SET jezik = ?
|
||||
WHERE id = ?`, [req.body.jezik, req.params.id], (err, result) => {
|
||||
if (!err && result.affectedRows === 1) {
|
||||
res.status(200).json(formJezikStruct(req.body, req.params.id));
|
||||
} else {
|
||||
res.sendStatus(400);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
app.delete("/express/api/v1/jezik/:id", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`DELETE FROM jezik
|
||||
WHERE id = ?`, [req.params.id], (err, result, fields) => {
|
||||
if (!err && result.affectedRows === 1) {
|
||||
res.sendStatus(200);
|
||||
} else {
|
||||
res.sendStatus(400);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
/**********************************
|
||||
* vloga
|
||||
*********************************/
|
||||
|
||||
function formVlogaStruct(from, id=null) {
|
||||
if (!id) id = from.id;
|
||||
return {
|
||||
'id': id,
|
||||
'vloga': from.vloga,
|
||||
'izpis_zenska': from.izpis_zenska,
|
||||
'izpis_moski': from.izpis_moski
|
||||
};
|
||||
}
|
||||
|
||||
app.get("/express/api/v1/vloga/", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`SELECT id, vloga, izpis_zenska, izpis_moski
|
||||
FROM vloga`, (err, result, fields) => {
|
||||
if (err) {
|
||||
res.sendStatus(500);
|
||||
return;
|
||||
}
|
||||
const out = result.map(row => formVlogaStruct(row));
|
||||
res.status(200).json(out);
|
||||
});
|
||||
});
|
||||
|
||||
app.get("/express/api/v1/vloga/:id", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`SELECT id, vloga, izpis_zenska, izpis_moski
|
||||
FROM vloga
|
||||
WHERE id = ?`, [req.params.id], (err, result, fields) => {
|
||||
if (result.length === 0 || err) {
|
||||
res.sendStatus(404);
|
||||
return;
|
||||
}
|
||||
const first = result[0];
|
||||
const out = formVlogaStruct(first);
|
||||
res.status(200).json(out);
|
||||
});
|
||||
});
|
||||
|
||||
app.post("/express/api/v1/vloga/", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`INSERT INTO vloga
|
||||
(vloga, izpis_zenska, izpis_moski)
|
||||
VALUES (?, ?, ?)`, [req.body.vloga, req.body.izpis_zenska, req.body.izpis_moski], (err, result) => {
|
||||
if (!err && result.affectedRows === 1) {
|
||||
res.status(200).json(formVlogaStruct(req.body, result.insertId));
|
||||
} else {
|
||||
res.sendStatus(400);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
app.put("/express/api/v1/vloga/:id", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`UPDATE vloga
|
||||
SET vloga = ?, izpis_zenska = ?, izpis_moski = ?
|
||||
WHERE id = ?`, [req.body.vloga, req.body.izpis_zenska, req.body.izpis_moski, req.params.id], (err, result) => {
|
||||
if (!err && result.affectedRows === 1) {
|
||||
res.status(200).json(formVlogaStruct(req.body, req.params.id));
|
||||
} else {
|
||||
res.sendStatus(400);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
app.delete("/express/api/v1/vloga/:id", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`DELETE FROM vloga
|
||||
WHERE id = ?`, [req.params.id], (err, result, fields) => {
|
||||
if (!err && result.affectedRows === 1) {
|
||||
res.sendStatus(200);
|
||||
} else {
|
||||
res.sendStatus(400);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
/**********************************
|
||||
* podrocje
|
||||
*********************************/
|
||||
|
||||
function formPodrocjeStruct(from, id=null) {
|
||||
if (!id) id = from.id;
|
||||
return {
|
||||
'id': id,
|
||||
'podrocje': from.podrocje,
|
||||
};
|
||||
}
|
||||
|
||||
app.get("/express/api/v1/podrocje", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`SELECT id, podrocje
|
||||
FROM podrocje`, (err, result, fields) => {
|
||||
if (err) {
|
||||
res.sendStatus(500);
|
||||
return;
|
||||
}
|
||||
const out = result.map(row => formPodrocjeStruct(row));
|
||||
res.status(200).json(out);
|
||||
});
|
||||
});
|
||||
|
||||
app.get("/express/api/v1/podrocje/:id", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`SELECT id, podrocje
|
||||
FROM podrocje
|
||||
WHERE id = ?`, [req.params.id], (err, result, fields) => {
|
||||
if (result.length === 0 || err) {
|
||||
res.sendStatus(404);
|
||||
return;
|
||||
}
|
||||
const first = result[0];
|
||||
const out = formPodrocjeStruct(first);
|
||||
res.status(200).json(out);
|
||||
});
|
||||
});
|
||||
|
||||
app.post("/express/api/v1/podrocje/", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`INSERT INTO podrocje
|
||||
(podrocje)
|
||||
VALUES (?)`, [req.body.podrocje], (err, result) => {
|
||||
if (!err && result.affectedRows === 1) {
|
||||
res.status(200).json(formPodrocjeStruct(req.body, result.insertId));
|
||||
} else {
|
||||
res.sendStatus(400);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
app.put("/express/api/v1/podrocje/:id", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`UPDATE podrocje
|
||||
SET podrocje = ?
|
||||
WHERE id = ?`, [req.body.podrocje, req.params.id], (err, result, fields) => {
|
||||
if (!err && result.affectedRows === 1) {
|
||||
res.status(200).json(formPodrocjeStruct(req.body, req.params.id));
|
||||
} else {
|
||||
res.sendStatus(400);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
app.delete("/express/api/v1/podrocje/:id", authenticateFirebaseToken, (req, res) => {
|
||||
db.query(`DELETE FROM podrocje
|
||||
WHERE id = ?`, [req.params.id], (err, result, fields) => {
|
||||
if (!err && result.affectedRows === 1) {
|
||||
res.sendStatus(200);
|
||||
} else {
|
||||
res.sendStatus(400);
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
// ISKALNIK
|
||||
|
||||
app.get('/express_backend', (req, res) => {
|
||||
res.send({ express: `YOUR BACKEND IS CONNECTED` });
|
||||
});
|
||||
|
||||
app.post('/express_backend/api/v1/iskanje', (req,res) => {
|
||||
const iskanjeIme = req.body.iskanjeNiz;
|
||||
const iskanjeCrka = req.body.iskanjeCrkaPriimek;
|
||||
const iskanjeIz = req.body.iskanjeIzvirniJezik;
|
||||
const iskanjeV = req.body.iskanjeCiljniJezik;
|
||||
const iskanjeRangi = req.body.iskanjeRang;
|
||||
const iskanjePodrocja = new Set(req.body.iskanjeStrokovnoPodrocje);
|
||||
const iskanjeVloge = new Set(req.body.iskanjeVloga);
|
||||
const iskanjeLicenca = req.body.iskanjeLicenca;
|
||||
|
||||
// Build query
|
||||
const params = [];
|
||||
const queryConditions = [];
|
||||
if (iskanjeIme) {
|
||||
queryConditions.push("(LOWER(CONCAT(c.ime, ' ', c.priimek)) LIKE LOWER(?))");
|
||||
params.push(`%${iskanjeIme}%`);
|
||||
}
|
||||
if (iskanjeCrka) {
|
||||
queryConditions.push("(c.priimek LIKE (?))");
|
||||
params.push(`${iskanjeCrka}%`);
|
||||
}
|
||||
if (iskanjeIz) {
|
||||
queryConditions.push("(iz.jezik = (?))");
|
||||
params.push(iskanjeIz);
|
||||
}
|
||||
if (iskanjeV) {
|
||||
queryConditions.push("(v.jezik = (?))");
|
||||
params.push(iskanjeV);
|
||||
}
|
||||
const generateQuestionMarks = (n) => Array.from({ length: n }, () => '?').join(',');
|
||||
if (iskanjeRangi) {
|
||||
queryConditions.push(`(p.rang IN (${generateQuestionMarks(iskanjeRangi.length)}))`);
|
||||
params.push(...iskanjeRangi);
|
||||
}
|
||||
|
||||
if (iskanjeLicenca) {
|
||||
queryConditions.push("(p.licenca_DZTPS = ?)")
|
||||
params.push(iskanjeLicenca)
|
||||
}
|
||||
|
||||
|
||||
db.query(`SELECT c.id as 'id' , c.ime as 'ime', c.priimek as 'priimek', c.spol as 'spol', c.telefondoma as 'telefondoma', c.telefonsluzba as 'telefonsluzba',
|
||||
c.telefonmobi as 'telefonmobi', c.email as 'email', c.spletnastran as 'spletnastran',
|
||||
p.rang as 'rang', iz.jezik as iz, v.jezik as v, p.licenca_DZTPS as 'licenca',
|
||||
(
|
||||
SELECT GROUP_CONCAT(po.podrocje SEPARATOR ';')
|
||||
FROM prevod_podrocje as pp
|
||||
JOIN podrocje as po
|
||||
ON pp.podrocje_id = po.id
|
||||
WHERE pp.prevod_id = p.id
|
||||
GROUP BY pp.prevod_id
|
||||
) as 'podrocja',
|
||||
(
|
||||
SELECT GROUP_CONCAT(vl.vloga SEPARATOR ';')
|
||||
FROM prevod_vloga as pv
|
||||
JOIN vloga as vl
|
||||
ON pv.vloga_id = vl.id
|
||||
WHERE pv.prevod_id = p.id
|
||||
GROUP BY pv.prevod_id
|
||||
) as 'vloge'
|
||||
FROM clan as c
|
||||
JOIN prevod as p
|
||||
ON c.id = p.id_clan
|
||||
JOIN jezik as iz
|
||||
ON p.iz_id = iz.id
|
||||
JOIN jezik as v
|
||||
ON p.v_id = v.id
|
||||
WHERE c.objava_v_iskalniku = 1
|
||||
WHERE ${queryConditions.length ? queryConditions.join("AND") : "1=1"}`,
|
||||
params, (err, rows, fields)=> {
|
||||
if (err) throw err;
|
||||
if (rows.length == 0) {
|
||||
res.send({});
|
||||
return;
|
||||
}
|
||||
|
||||
let out = [];
|
||||
for (let row of rows) {
|
||||
if (out.length <= 0 || out[out.length - 1].id !== row.id) {
|
||||
out.push({
|
||||
"id": row.id,
|
||||
"ime": row.ime,
|
||||
"priimek": row.priimek,
|
||||
"spol": row.spol,
|
||||
"telefondoma": row.telefondoma,
|
||||
"telefonmobi": row.telefonmobi,
|
||||
"telefonsluzba": row.telefonsluzba,
|
||||
"email": row.email,
|
||||
"spletnastran": row.spletnastran,
|
||||
"prevodi": [],
|
||||
});
|
||||
}
|
||||
let podrocja = row.podrocja?.split(';') || [];
|
||||
let vloge = row.vloge?.split(';') || [];
|
||||
if (iskanjePodrocja.size) {
|
||||
podrocja = podrocja.filter((el) => iskanjePodrocja.has(el));
|
||||
if (podrocja.length === 0) continue;
|
||||
}
|
||||
if (iskanjeVloge.size) {
|
||||
vloge = vloge.filter((el) => iskanjeVloge.has(el));
|
||||
if (vloge.length === 0) continue;
|
||||
}
|
||||
|
||||
|
||||
out[out.length - 1].prevodi.push({
|
||||
"rang": row.rang,
|
||||
"iz": row.iz,
|
||||
"v": row.v,
|
||||
"strokovnopodrocje": row.podrocja?.split(';'),
|
||||
"vloga": row.vloge?.split(';'),
|
||||
});
|
||||
}
|
||||
out = out.filter((row) => row.prevodi.length > 0);
|
||||
res.send(JSON.stringify(out, null, 4));
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
app.get("/express_backend/api/get/user/:user_id", (req, res) => {
|
||||
db.query(`SELECT c.id as 'id' , c.ime as 'ime', c.priimek as 'priimek', c.spol as 'spol', c.telefondoma as 'telefondoma', c.telefonsluzba as 'telefonsluzba',
|
||||
c.telefonmobi as 'telefonmobi', c.email as 'email', c.spletnastran as 'spletnastran',
|
||||
p.rang as 'rang', iz.jezik as iz, v.jezik as v,
|
||||
(
|
||||
SELECT GROUP_CONCAT(po.podrocje SEPARATOR ';')
|
||||
FROM prevod_podrocje as pp
|
||||
JOIN podrocje as po
|
||||
ON pp.podrocje_id = po.id
|
||||
WHERE pp.prevod_id = p.id
|
||||
GROUP BY pp.prevod_id
|
||||
) as 'podrocja',
|
||||
(
|
||||
SELECT GROUP_CONCAT(vl.vloga SEPARATOR ';')
|
||||
FROM prevod_vloga as pv
|
||||
JOIN vloga as vl
|
||||
ON pv.vloga_id = vl.id
|
||||
WHERE pv.prevod_id = p.id
|
||||
GROUP BY pv.prevod_id
|
||||
) as 'vloge'
|
||||
FROM clan as c
|
||||
JOIN prevod as p
|
||||
ON c.id = p.id_clan
|
||||
JOIN jezik as iz
|
||||
ON p.iz_id = iz.id
|
||||
JOIN jezik as v
|
||||
ON p.v_id = v.id
|
||||
WHERE c.id = ?
|
||||
WHERE c.objava_v_iskalniku = 1
|
||||
ORDER BY rang;`, [req.params.user_id], (err, rows, fields)=> {
|
||||
if (err) throw err;
|
||||
if (rows.length === 0) {
|
||||
res.send({});
|
||||
return;
|
||||
}
|
||||
|
||||
const first = rows[0];
|
||||
|
||||
let out = {
|
||||
"id": first.id,
|
||||
"ime": first.ime,
|
||||
"priimek": first.priimek,
|
||||
"telefondoma": first.telefondoma,
|
||||
"telefonmobi": first.telefonmobi,
|
||||
"telefonsluzba": first.telefonsluzba,
|
||||
"email": first.email,
|
||||
"spletnastran": first.spletnastran,
|
||||
"prevodi": [],
|
||||
};
|
||||
for (let row of rows) {
|
||||
out.prevodi.push({
|
||||
"id": row.id_prevod,
|
||||
"rang": row.rang,
|
||||
"iz": row.iz,
|
||||
"v": row.v,
|
||||
"strokovnopodrocje": row.podrocja?.split(';'),
|
||||
"vloga": row.vloge?.split(';'),
|
||||
});
|
||||
}
|
||||
res.send(JSON.stringify(out, null, 4));
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
app.get("/express_backend/api/getAll", (req, res) => {
|
||||
db.query(`SELECT c.id as 'id' , c.ime as 'ime', c.priimek as 'priimek', c.spol as 'spol', c.telefondoma as 'telefondoma', c.telefonsluzba as 'telefonsluzba',
|
||||
c.telefonmobi as 'telefonmobi', c.email as 'email', c.spletnastran as 'spletnastran',
|
||||
p.rang as 'rang', iz.jezik as iz, v.jezik as v,
|
||||
(
|
||||
SELECT GROUP_CONCAT(po.podrocje SEPARATOR ';')
|
||||
FROM prevod_podrocje as pp
|
||||
JOIN podrocje as po
|
||||
ON pp.podrocje_id = po.id
|
||||
WHERE pp.prevod_id = p.id
|
||||
GROUP BY pp.prevod_id
|
||||
) as 'podrocja',
|
||||
(
|
||||
SELECT GROUP_CONCAT(vl.vloga SEPARATOR ';')
|
||||
FROM prevod_vloga as pv
|
||||
JOIN vloga as vl
|
||||
ON pv.vloga_id = vl.id
|
||||
WHERE pv.prevod_id = p.id
|
||||
GROUP BY pv.prevod_id
|
||||
) as 'vloge'
|
||||
FROM clan as c
|
||||
JOIN prevod as p
|
||||
ON c.id = p.id_clan
|
||||
JOIN jezik as iz
|
||||
ON p.iz_id = iz.id
|
||||
JOIN jezik as v
|
||||
ON p.v_id = v.id
|
||||
WHERE c.objava_v_iskalniku = 1
|
||||
;`, (err, rows, fields)=> {
|
||||
if (err) throw err;
|
||||
|
||||
// Group prevodi per user
|
||||
let out = [];
|
||||
for (let row of rows) {
|
||||
if (out.length <= 0 || out[out.length - 1].id !== row.id) {
|
||||
out.push({
|
||||
"id": row.id,
|
||||
"ime": row.ime,
|
||||
"priimek": row.priimek,
|
||||
"spol": row.spol,
|
||||
"telefondoma": row.telefondoma,
|
||||
"telefonmobi": row.telefonmobi,
|
||||
"telefonsluzba": row.telefonsluzba,
|
||||
"email": row.email,
|
||||
"spletnastran": row.spletnastran,
|
||||
"prevodi": [],
|
||||
});
|
||||
}
|
||||
out[out.length - 1].prevodi.push({
|
||||
"rang": row.rang,
|
||||
"iz": row.iz,
|
||||
"v": row.v,
|
||||
"strokovnopodrocje": row.podrocja?.split(';'),
|
||||
"vloga": row.vloge?.split(';'),
|
||||
});
|
||||
}
|
||||
res.send(JSON.stringify(out, null, 4));
|
||||
});
|
||||
})
|
||||
|
||||
|
||||
// app.listen(PORT, () => {
|
||||
// console.log(`Server listening on port ${PORT}`);
|
||||
// });
|
||||
Reference in New Issue
Block a user