From 3ec5ebd5920074a9217edb8e1abc5d94da64c6c0 Mon Sep 17 00:00:00 2001 From: Thomas Mack Date: Sat, 28 Sep 2019 13:03:23 +0200 Subject: [PATCH 1/2] =?UTF-8?q?hoginfo=20erg=C3=A4nzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.js | 21 +++++ dbhog/index.js | 194 +++++++++++++++++++++++++++++++++++++++++ package-lock.json | 13 +++ package.json | 4 +- routes/users.js | 39 ++++++++- routes/v1/haus.js | 76 ++++++++++++++++ routes/v1/person.js | 49 +++++++++++ routes/v1/punkte.js | 35 ++++++++ routes/v1/schueler.js | 49 +++++++++++ routes/v1/schuljahr.js | 51 +++++++++++ 10 files changed, 529 insertions(+), 2 deletions(-) create mode 100644 dbhog/index.js create mode 100644 routes/v1/haus.js create mode 100644 routes/v1/person.js create mode 100644 routes/v1/punkte.js create mode 100644 routes/v1/schueler.js create mode 100644 routes/v1/schuljahr.js diff --git a/app.js b/app.js index 8ea1cb1..b9c5bf4 100644 --- a/app.js +++ b/app.js @@ -5,10 +5,15 @@ var logger = require('morgan'); var cors = require('cors'); var sassMiddleware = require('node-sass-middleware'); +var xml = require('xml'); + + + //var passport = require('passport'); //var LocalStrategy = require('passport-local').Strategy; const db = require('./db') +const dbhog = require('./dbhog') const PORT = process.env.PORT || 4000; @@ -16,6 +21,11 @@ var indexRouter = require('./routes/index'); var usersRouter = require('./routes/users'); var valuelistRouter = require('./routes/valuelist'); var recepieRouter = require('./routes/recepie'); +var personRouter = require('./routes/v1/person'); +var schuelerRouter = require('./routes/v1/schueler'); +var schuljahrRouter = require('./routes/v1/schuljahr'); +var punkteRouter = require('./routes/v1/punkte'); +var hausRouter = require('./routes/v1/haus'); var app = express(); @@ -58,11 +68,22 @@ app.use('/', (req, res, next ) => { next(); }) +app.use('/api/v1', (req, res, next ) => { + req.db = dbhog; + next(); +}) + app.use('/', indexRouter); app.use('/users', usersRouter); app.use('/wl', valuelistRouter); app.use('/recepies', recepieRouter); +app.use('/api/v1/person', personRouter); +app.use('/api/v1/schueler', schuelerRouter); +app.use('/api/v1/schuljahr', schuljahrRouter); +app.use('/api/v1/punkte', punkteRouter); +app.use('/api/v1/haus', hausRouter); + // catch 404 and forward to error handler app.use(function(req, res, next) { diff --git a/dbhog/index.js b/dbhog/index.js new file mode 100644 index 0000000..2167a83 --- /dev/null +++ b/dbhog/index.js @@ -0,0 +1,194 @@ +// SQL-Class +// Author: Thomas Mack + +const DEBUG = true; + +const { Pool } = require('pg'); +const pool = new Pool({ + user: 'postgres', + host: 'localhost', + database: 'hogwarts', + password: 'postgres', + port: 5432 +}); + + +const query = function (text, params, callback) { + const start = Date.now() + return pool.query(text, params, (err, res) => { + const duration = Date.now() - start; + //if(res) + console.log('executed query', { text, duration}) + callback(err, res) + }) +} +const getClient = function (callback) { + pool.connect((err, client, done) => { + callback(err, client, done) + }) +} + +const dataStructure = { + + categories: { + tableName: "kategorie", + jsonName: "categories" + }, + + units: { + tableName: "einheit", + jsonName: "units" + }, + + tools: { + tableName: "geraet", + jsonName: "tools" + }, + + difficulties: { + tableName: "schwierigkeit", + jsonName: "difficulties" + }, + + ingredients: { + tableName: "zutat", + jsonName: "ingredients" + }, + + ratingcategories: { + tableName: "wertungkategorie", + jsonName: "ratingcategories" + } + +} + +const selectAllFromTable = (table) => { + return "SELECT * FROM "+table+" order by name;"; +} + +const selectAllFromTableByFieldValue = (table, field, value) => { + return "SELECT * FROM "+table+" WHERE "+field+"="+value+";"; +} + +const selectItemFromTable = function (table, id) { + return "SELECT * FROM "+table+" WHERE id = "+id+";"; +} + +const deleteItemFromTable = function (table, id) { + return "DELETE FROM "+table+" WHERE id = "+id+";"; +} + +const deleteNameKeyObject = function(req, res, next) { + if(DEBUG) console.log("Delte Valuelist"); + let structure = getStructure(req); + let obj = req.body[structure.jsonName][0]; + let query = "DELETE FROM "+structure.tableName+ + " WHERE id = "+req.itemId; + pool.query(query, (err, rs) => { + if(err) { + console.log(query); + next(err) + } else { + res.status(204).send(); + } + }); + +} + +const updateNameKeyObject = function(req, res, next) { + if(DEBUG) console.log("Update Valuelist"); + let structure = getStructure(req); + if(DEBUG) console.log(req.body[structure.jsonName]); + let obj = req.body[structure.jsonName][0]; + let query = "UPDATE "+structure.tableName+ + " set schluessel = '"+obj.schluessel+ + "', name = '"+obj.name+ + "', beschreibung = '"+obj.beschreibung+ + "' WHERE id = "+req.itemId+" returning *"; + pool.query(query, (err, rs) => { + if(err) { + console.log(query); + next(err) + } else { + let result = {}; + result[structure['jsonName']] = rs.rows; + res.status(200).json(result); + } + }); +} + +const insertNameKeyObject = function(req, res, next) { + if(DEBUG) console.log("Insert Valuelist"); + let structure = getStructure(req); + if(DEBUG) console.log(req.body[structure.jsonName]); + let obj = req.body[structure.jsonName][0]; + + let query = "INSERT INTO "+structure.tableName+" (schluessel, name, beschreibung) "+ + " VALUES ('"+obj.schluessel+"','"+obj.name+"','"+obj.beschreibung+"')" + + " returning *"; + if(DEBUG) console.log(query); + pool.query(query, (err, rs) => { + if(err) { + console.log(query); + next(err) + } else { + let result = {}; + result[structure['jsonName']] = rs.rows; + console.log(result); + res.status(200).json(result); + } + }); +} + + +const getStructure = function(req) { + let path = req.pathCall; + let structure = dataStructure[path]; + return structure; + +} + +const getAllFromTable = function(req, res, next) { + + let structure = getStructure(req); + if(DEBUG) { + console.log("Found Structure-Object: "); + console.log(structure); + } + if(structure === undefined) return res.status(404).send(); + pool.query(selectAllFromTable(structure.tableName), (err, rs) => { + if(err) next(err) + else { + if(DEBUG) console.log(res); + let result = {}; + result[structure['jsonName']] = rs.rows; + console.log(result); + res.status(200).json(result); + } + }) +} + +const getUserByEmail = function(username) { + let query = "Select id, name, email, kennwort, beschreibung FROM nutzer WHERE email ilike '"+username+"'"; + if(DEBUG) console.log(query); + req.db.query(query, (err, rs) => { + if (err) { + return err + } + return rs.rows[0]; + }) +} + + +module.exports = { + query, + selectAllFromTable, + selectAllFromTableByFieldValue, + deleteItemFromTable, + updateNameKeyObject, + insertNameKeyObject, + deleteNameKeyObject, + getAllFromTable, + getUserByEmail, + getStructure +}; diff --git a/package-lock.json b/package-lock.json index 5580644..70edf2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2035,6 +2035,14 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "connect-pg-simple": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/connect-pg-simple/-/connect-pg-simple-5.0.0.tgz", + "integrity": "sha512-WZ7xkN+qe5bbDLgZ1L9GxnSbr155cJHmfNRzVR5hBvqio7Pg/vuH7Cf8lPUSFClQjtybYSejUqyO54sYt4cg+w==", + "requires": { + "pg": "^7.4.3" + } + }, "console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", @@ -6802,6 +6810,11 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/package.json b/package.json index 85352ca..54abec8 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "dependencies": { "bcrypt": "^3.0.3", "body-parser": "^1.18.3", + "connect-pg-simple": "^5.0.0", "cors": "^2.8.5", "debug": "~2.6.9", "express": "~4.16.0", @@ -24,7 +25,8 @@ "react": "^16.7.0", "react-dom": "^15.6.1", "react-router-dom": "^4.2.2", - "whatwg-fetch": "^3.0.0" + "whatwg-fetch": "^3.0.0", + "xml": "^1.0.1" }, "devDependencies": { "babel": "^6.23.0", diff --git a/routes/users.js b/routes/users.js index 666d1e9..82e8fcb 100644 --- a/routes/users.js +++ b/routes/users.js @@ -64,6 +64,42 @@ router.post('/', function(req, res, next) { }); }); + +router.put('/login', function(req, res, next) { + let username = req.body.username; + let password = req.body.password; + + console.log(username); + + let query = "Select id, name, email, kennwort, beschreibung FROM nutzer WHERE email ilike $1"; + if(DEBUG) console.log(query); + req.db.query(query, [username], (err, rs) => { + if (err) { + return next(err) + } + req.user = rs.rows[0]; + console.log(req.user); + if(!req.user) return next(new Error); + + console.log(req.user.kennwort); + + bcrypt.compare(password, req.user.kennwort, function(err, checkResult) { + console.log(checkResult); + if(checkResult) { + console.log("Login erfolgreich") + req.login = true; + } else { + req.login = false; + console.log(err); + res.status(409).send("Passwd didn't match"); + } + }); + next(); + + + }) +}); + /* Methods with id */ router.get('/:userId', function(req, res, next) { let user = {}; @@ -114,7 +150,7 @@ router.put('/:userId/changepasswd', function(req, res, next) { console.log("Compare: "+oldPasswd+" WITH "+req.user.kennwort+" Result:"); console.log(checkResult); if(checkResult) { - bcrypt.hash('myPassword', 10, function(err, hash) { + bcrypt.hash(newPasswd, 10, function(err, hash) { let query = "UPDATE nutzer set kennwort = '"+hash+"'"+ " WHERE id = "+req.userId + " returning *"; @@ -143,6 +179,7 @@ router.put('/:userId/changepasswd', function(req, res, next) { }); + router.delete('/:userId', function(req, res, next) { let query = [ "DELETE FROM nutzer_favorit where nutzer = $1;", diff --git a/routes/v1/haus.js b/routes/v1/haus.js new file mode 100644 index 0000000..914a298 --- /dev/null +++ b/routes/v1/haus.js @@ -0,0 +1,76 @@ +const express = require('express'); +const router = express.Router(); +const cors = require('cors'); +const xml = require('xml'); + + +const bcrypt = require('bcrypt'); +const randToken = require('rand-token'); + +const DEBUG = true; + +router.param('hausId', function(req, res, next, id) { + req.hausId = id; + let query = " Select * from haus "; + query += " WHERE id = $1"; + + if(DEBUG) console.log(query); + if(DEBUG) console.log(req.hausId); + req.db.query(query, [req.hausId], (err, rs) => { + if (err) { + return next(err) + } + let result = ""; + for (var i in rs.rows[0]) { + var val = rs.rows[0][i]; + result += "<"+i+">"+val+""; + } + result += ""; + if(DEBUG) console.log(result); + + res.set('Content-Type', 'text/xml'); + res.send(result); + //next(); + }) +}); + +/* GET recepies listing. */ +router.get('/', function(req, res, next) { + let query = " Select * from haus "; + + if(DEBUG) console.log(query); + req.db.query(query, (err, rs) => { + if (err){ + console.log(query); + next(err); + } else { + let result = ""; + + for (var haus in rs.rows) { + console.log(haus); + + result += ""; + for (var i in rs.rows[haus]) { + var val = rs.rows[haus][i]; + result += "<"+i+">"+val+""; + } + result += ""; + } + result += ""; + + + console.log(result); + res.set('Content-Type', 'text/xml'); + res.send(result); + // res.status(200).json(result); + } + }); +}); + +/* Methods with id */ +router.get('/:hausId', function(req, res, next) { + +// res.status(200).json(req.haus); +}); + +module.exports = router; diff --git a/routes/v1/person.js b/routes/v1/person.js new file mode 100644 index 0000000..78be598 --- /dev/null +++ b/routes/v1/person.js @@ -0,0 +1,49 @@ +const express = require('express'); +const router = express.Router(); +var cors = require('cors'); + +const bcrypt = require('bcrypt'); +const randToken = require('rand-token'); + +const DEBUG = true; + +router.param('personId', function(req, res, next, id) { + req.personId = id; + let query = " Select * from person "; + query += " WHERE id = $1"; + + if(DEBUG) console.log(query); + if(DEBUG) console.log(req.personId); + req.db.query(query, [req.personId], (err, rs) => { + if (err) { + return next(err) + } + req.person = rs.rows[0]; + next(); + }) +}); + +/* GET recepies listing. */ +router.get('/', function(req, res, next) { + let query = " Select * from person "; + + if(DEBUG) console.log(query); + req.db.query(query, (err, rs) => { + if (err){ + console.log(query); + next(err); + } else { + let result = {}; + result['person'] = rs.rows; + console.log(result); + res.status(200).json(result); + } + }); +}); + +/* Methods with id */ +router.get('/:personId', function(req, res, next) { + res.status(200).json(req.person); +}); + +module.exports = router; diff --git a/routes/v1/punkte.js b/routes/v1/punkte.js new file mode 100644 index 0000000..4f2548e --- /dev/null +++ b/routes/v1/punkte.js @@ -0,0 +1,35 @@ +const express = require('express'); +const router = express.Router(); +var cors = require('cors'); + +const bcrypt = require('bcrypt'); +const randToken = require('rand-token'); + +const DEBUG = true; + +router.param('punkteId', function(req, res, next, id) { + req.punkteId = id; + const group = req.query.group; + + + let query = 'SELECT * FROM v_hauspunkte_small WHERE schuljahr = $1;'; + +if(group==1) query = 'SELECT schuljahr, haus, sum(punkte) FROM v_hauspunkte WHERE schuljahr = $1 GROUP BY schuljahr, haus;' + + if(DEBUG) console.log(query); + if(DEBUG) console.log(group); + req.db.query(query, [req.punkteId], (err, rs) => { + if (err) { + return next(err) + } + req.punkte = rs.rows; + next(); + }) +}); + +/* Methods with id */ +router.get('/:punkteId', function(req, res, next) { + res.status(200).json(req.punkte); +}); + +module.exports = router; diff --git a/routes/v1/schueler.js b/routes/v1/schueler.js new file mode 100644 index 0000000..d84cfc5 --- /dev/null +++ b/routes/v1/schueler.js @@ -0,0 +1,49 @@ +const express = require('express'); +const router = express.Router(); +var cors = require('cors'); + +const bcrypt = require('bcrypt'); +const randToken = require('rand-token'); + +const DEBUG = true; + +router.param('schuelerId', function(req, res, next, id) { + req.schuelerId = id; + let query = " Select * from schueler "; + query += " WHERE id = $1"; + + if(DEBUG) console.log(query); + if(DEBUG) console.log(req.schuelerId); + req.db.query(query, [req.schuelerId], (err, rs) => { + if (err) { + return next(err) + } + req.schueler = rs.rows[0]; + next(); + }) +}); + +/* GET recepies listing. */ +router.get('/', function(req, res, next) { + let query = " Select * from schueler "; + + if(DEBUG) console.log(query); + req.db.query(query, (err, rs) => { + if (err){ + console.log(query); + next(err); + } else { + let result = {}; + result['schueler'] = rs.rows; + console.log(result); + res.status(200).json(result); + } + }); +}); + +/* Methods with id */ +router.get('/:schuelerId', function(req, res, next) { + res.status(200).json(req.schueler); +}); + +module.exports = router; diff --git a/routes/v1/schuljahr.js b/routes/v1/schuljahr.js new file mode 100644 index 0000000..c7e1db6 --- /dev/null +++ b/routes/v1/schuljahr.js @@ -0,0 +1,51 @@ +const express = require('express'); +const router = express.Router(); +var cors = require('cors'); + +const bcrypt = require('bcrypt'); +const randToken = require('rand-token'); + +const DEBUG = true; + +router.param('schuljahrId', function(req, res, next, id) { + req.schuljahrId = id; + let query = " select * from schueler where id in (SELECT schuelerid from schueler_schuljahr where schuljahrid in (select id from schuljahr where name = $1)); "; + + if(DEBUG) console.log(query); + if(DEBUG) console.log(req.schuljahrId); + req.db.query(query, [req.schuljahrId], (err, rs) => { + if (err) { + return next(err) + } + req.schuljahr = rs.rows; + next(); + }) +}); + +/* GET recepies listing. */ +router.get('/', function(req, res, next) { + let query = " select schuljahr.id as id, schuljahr.name, count(*) as schueler from schueler"+ + " join schueler_schuljahr on schueler_schuljahr.schuelerid = schueler.id"+ + " join schuljahr on schueler_schuljahr.schuljahrid = schuljahr.id"+ + " group by schuljahr.id , schuljahr.name"; + + if(DEBUG) console.log(query); + req.db.query(query, (err, rs) => { + if (err){ + console.log(query); + next(err); + } else { + let result = {}; + result['schuljahr'] = rs.rows; + console.log(result); + res.status(200).json(result); + } + }); +}); + +/* Methods with id */ +router.get('/:schuljahrId', function(req, res, next) { + res.status(200).json(req.schuljahr); +}); + +module.exports = router; From 1d494f6dfad88457397438c19355b342c3a72a62 Mon Sep 17 00:00:00 2001 From: Thomas Mack Date: Sat, 28 Sep 2019 13:25:16 +0200 Subject: [PATCH 2/2] Personen werden jetzt vom View ausgeliefert --- routes/v1/person.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routes/v1/person.js b/routes/v1/person.js index 78be598..1e92205 100644 --- a/routes/v1/person.js +++ b/routes/v1/person.js @@ -9,7 +9,7 @@ const DEBUG = true; router.param('personId', function(req, res, next, id) { req.personId = id; - let query = " Select * from person "; + let query = " Select * from v_person "; query += " WHERE id = $1"; if(DEBUG) console.log(query); @@ -25,7 +25,7 @@ router.param('personId', function(req, res, next, id) { /* GET recepies listing. */ router.get('/', function(req, res, next) { - let query = " Select * from person "; + let query = " Select * from v_person "; if(DEBUG) console.log(query); req.db.query(query, (err, rs) => {