diff --git a/README.md b/README.md
index 6267532..136d5de 100644
--- a/README.md
+++ b/README.md
@@ -2,3 +2,6 @@
Schmeckt wie Daheim Backend
geschrieben in Node.js
+
+
+zum Starten node app.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+""+i+">";
+ }
+ 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+""+i+">";
+ }
+ 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;