diff --git a/app.js b/app.js index 2fca503..8ea1cb1 100644 --- a/app.js +++ b/app.js @@ -5,6 +5,9 @@ var logger = require('morgan'); var cors = require('cors'); var sassMiddleware = require('node-sass-middleware'); +//var passport = require('passport'); +//var LocalStrategy = require('passport-local').Strategy; + const db = require('./db') const PORT = process.env.PORT || 4000; @@ -26,6 +29,19 @@ var corsOptions = { methods: ['GET', 'PUT', 'POST', 'DELETE', 'COPY'] } app.use(cors(corsOptions)); + +// Setting up passport + +/*passport.use( + new LocalStrategy( + function(username, password, done) { + + } + ); + +); +*/ + app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); diff --git a/migration.js b/migration.js index b0ae9b2..27944a9 100644 --- a/migration.js +++ b/migration.js @@ -106,7 +106,7 @@ db.run("CREATE TABLE" +" IF NOT EXISTS rezept_schritt" + " rezept bigint NOT NULL REFERENCES rezept(id)," + " sort INT NOT NULL DEFAULT 0," + " name text NOT NULL," + -" beschreibung text NOT NULL" + +" beschreibung text" + " );" + ); @@ -116,7 +116,7 @@ db.run("CREATE TABLE" +" IF NOT EXISTS rezept_kategorie" + " rezept bigint NOT NULL REFERENCES rezept(id)," + " kategorie bigint NOT NULL REFERENCES kategorie(id)," + " modifikator NUMERIC NOT NULL DEFAULT 1," + -" beschreibung text NOT NULL" + +" beschreibung text" + " );" + ); @@ -126,7 +126,7 @@ db.run("CREATE TABLE" +" IF NOT EXISTS nutzer" + " name text NOT NULL," + " email text NOT NULL," + " kennwort text NOT NULL," + -" beschreibung text NOT NULL" + +" beschreibung text" + " );" + ); @@ -144,7 +144,7 @@ db.run("CREATE TABLE" +" IF NOT EXISTS nutzer_rolle" + " id bigserial PRIMARY KEY," + " nutzer bigint NOT NULL REFERENCES nutzer(id)," + " rolle bigint NOT NULL REFERENCES rolle(id)," + -" beschreibung text NOT NULL" + +" beschreibung text" + " );" + ); @@ -153,7 +153,7 @@ db.run("CREATE TABLE" +" IF NOT EXISTS nutzer_favorit" + " id bigserial PRIMARY KEY," + " nutzer bigint NOT NULL REFERENCES nutzer(id)," + " rezept bigint NOT NULL REFERENCES rezept(id)," + -" beschreibung text NOT NULL" + +" beschreibung text" + " );" + ); @@ -164,7 +164,7 @@ db.run("CREATE TABLE" +" IF NOT EXISTS rezept_wertung" + " rezept bigint NOT NULL REFERENCES rezept(id)," + " wertungkategorie bigint NOT NULL REFERENCES wertungkategorie(id)," + " wert INTEGER NOT NULL DEFAULT 5," + -" beschreibung text NOT NULL" + +" beschreibung text" + " );" + ); @@ -174,7 +174,7 @@ db.run("CREATE TABLE" +" IF NOT EXISTS nutzer_kommentar" + " nutzer bigint NOT NULL REFERENCES nutzer(id)," + " relation text NOT NULL," + " relation_id bigint NOT NULL," + -" beschreibung text NOT NULL" + +" beschreibung text" + ); db.run("CREATE UNIQUE INDEX idx_geraet_schluessel ON geraet (schluessel);"); diff --git a/routes/recepie.js b/routes/recepie.js index 7dba2e6..10a5366 100644 --- a/routes/recepie.js +++ b/routes/recepie.js @@ -10,6 +10,7 @@ const ingredientsRouter = require('./recepieIngredients'); const toolsRouter = require('./recepieTools'); const durationsRouter = require('./recepieDurations'); const stepsRouter = require('./recepieSteps'); +const categoriesRouter = require('./recepieCategories'); const DEBUG = false; @@ -18,15 +19,22 @@ const DEBUG = false; router.param('recepieId', function(req, res, next, id) { req.recepieId = id; - let query = " Select rezept.id, rezept.schluessel, schwierigkeit, schwierigkeit.name as schwierigkeitName, rezept.name, portionen, nutzer, rezept.beschreibung, "+ + let query = " Select rezept.id, rezept.schluessel, schwierigkeit, schwierigkeit.name as schwierigkeitName, rezept.name, portionen, nutzer, nutzer.name as nutzername, rezept.beschreibung, "+ " (SELECT sum(dauer) FROM rezept_dauer WHERE rezept = rezept.id) as overall_duration, "+ - " (SELECT round(avg(wert),1) FROM rezept_wertung WHERE rezept = rezept.id) as rating "+ - " FROM rezept JOIN schwierigkeit on schwierigkeit = schwierigkeit.id "; + " (SELECT round(avg(wert),1) FROM rezept_wertung WHERE rezept = rezept.id) as rating, "+ + " array_agg(kategorie.name) as categories, " + + " array_agg(kategorie.id) as categorieids" + + + " FROM rezept JOIN schwierigkeit on schwierigkeit = schwierigkeit.id "+ + " JOIN nutzer on nutzer = nutzer.id" + + " LEFT JOIN rezept_kategorie ON rezept.id = rezept" + + " LEFT JOIN kategorie on kategorie.id = kategorie "; if(isNaN(req.recepieId)) { query += " WHERE rezept.schluessel ilike '$1'"; } else { query += " WHERE rezept.id = $1"; } + query += " GROUP BY 1,2,3,4,5,6,7,8" if(DEBUG) console.log(query); req.db.query(query, [req.recepieId], (err, rs) => { @@ -42,14 +50,23 @@ router.use('/:recepieId/ingredients/', ingredientsRouter); router.use('/:recepieId/tools/', toolsRouter); router.use('/:recepieId/durations/', durationsRouter); router.use('/:recepieId/steps/', stepsRouter); +router.use('/:recepieId/categories/', categoriesRouter); + /* GET recepies listing. */ router.get('/', function(req, res, next) { let query = " Select rezept.id, rezept.schluessel, schwierigkeit, schwierigkeit.name as schwierigkeitName, rezept.name, portionen, nutzer, rezept.beschreibung, "+ " (SELECT sum(dauer) FROM rezept_dauer WHERE rezept = rezept.id) as overall_duration, "+ - " (SELECT round(avg(wert),1) FROM rezept_wertung WHERE rezept = rezept.id) as rating "+ - " FROM rezept JOIN schwierigkeit on schwierigkeit = schwierigkeit.id "; + " (SELECT round(avg(wert),1) FROM rezept_wertung WHERE rezept = rezept.id) as rating, "+ + " array_agg(kategorie.name) as categories," + + " array_agg(kategorie.id) as categorieids" + + + " FROM rezept JOIN schwierigkeit on schwierigkeit = schwierigkeit.id "+ + " LEFT JOIN rezept_kategorie ON rezept.id = rezept" + + " LEFT JOIN kategorie on kategorie.id = kategorie "; if(req.query.term) query += " WHERE rezept.name ilike '%"+req.query.term+"%' " + query += " GROUP BY 1,2,3,4,5,6,7" + if(req.query['sort_by']) { if(req.query['sort_by'] === 'creation') query += " ORDER BY rezept.id desc"; if(req.query['sort_by'] === 'best_match') query += " ORDER BY rezept.name "; @@ -171,6 +188,7 @@ router.put('/:recepieId', function(req, res, next) { let query = "UPDATE rezept set name = '"+recepie.name+ "', schluessel='"+recepie.schluessel+ "', portionen='"+recepie.portionen+ + "', nutzer='"+recepie.nutzer+ "', schwierigkeit='"+recepie.schwierigkeit+ "', beschreibung = '"+recepie.beschreibung+"' "+ " WHERE id = "+req.recepieId + diff --git a/routes/recepieCategories.js b/routes/recepieCategories.js new file mode 100644 index 0000000..a8cac0a --- /dev/null +++ b/routes/recepieCategories.js @@ -0,0 +1,102 @@ +const express = require('express'); +const router = express.Router({mergeParams:true}); + +const bcrypt = require('bcrypt'); +const randToken = require('rand-token'); + +const DEBUG = false; + +router.param('categorieId', function(req, res, next, id) { + req.categorieId = id; + let query = " Select rezept_kategorie.id, kategorie, kategorie.name as kategoriename, modifikator, rezept_kategorie.beschreibung "+ + " FROM rezept_kategorie "+ + " JOIN kategorie on kategorie = kategorie.id"+ + " WHERE rezept =$1 AND rezept_kategorie.id = $2"; + if(DEBUG) console.log(query); + req.db.query(query, [req.recepieId, req.categorieId], (err, rs) => { + if (err) { + return next(err) + } + req.recepieCategorie = rs.rows[0]; + next(); + }) +}); + +/* GET recepieCategories listing. */ +router.get('/', function(req, res, next) { + let query = " Select rezept_kategorie.id, kategorie, kategorie.name as kategoriename, modifikator, rezept_kategorie.beschreibung "+ + " FROM rezept_kategorie "+ + " JOIN kategorie on kategorie = kategorie.id"+ + " WHERE rezept =$1"+ + " ORDER BY modifikator"; + if(DEBUG) console.log(query); + req.db.query(query,[req.recepieId], (err, rs) => { + if (err){ + next(err); + } else { + let result = {}; + result['recepieCategories'] = rs.rows; + console.log(result); + res.status(200).json(result); + } + }); +}); + +router.post('/', function(req, res, next) { + let recepieCategorie = req.body.recepieCategories[0]; + if(!recepieCategorie.kategorie) { + return res.status(400).send("Wrong Params") + } + + if (!recepieCategorie.modifikator) recepieCategorie.modifikator = 1; + let query = "INSERT INTO rezept_kategorie (rezept, kategorie, modifikator, beschreibung) "+ + " VALUES ($1, $2, $3, $4)" + + " returning *"; + let values = [req.recepieId, recepieCategorie.kategorie, recepieCategorie.modifikator, recepieCategorie.beschreibung]; + + if(DEBUG) console.log(query); + + req.db.query(query, values, (err, rs) => { + if (err){ + next(err); + } else { + let result = {}; + result['recepieCategories'] = rs.rows[0]; + res.status(200).json(result); + } + }); +}); + +/* Methods with id */ +router.get('/:categorieId', function(req, res, next) { + res.status(200).json(req.recepieCategorie); +}); + +router.put('/:categorieId', function(req, res, next) { + let recepieCategorie = req.body.recepieCategories[0]; + let query = "UPDATE rezept_kategorie set kategorie = $1, modifikator =$2, beschreibung =$3"+ + " WHERE id = "+req.categorieId + + " returning *"; + let values = [recepieCategorie.kategorie, recepieCategorie.modifikator, recepieCategorie.beschreibung]; + + if(DEBUG) console.log(query); + req.db.query(query, values, (err, rs) => { + if (err){ + next(err); + } else { + let result = {}; + result['recepieCategories'] = rs.rows[0]; + res.status(200).json(result); + } + }); +}); + +router.delete('/:categorieId', function(req, res, next) { + let query = "DELETE FROM rezept_kategorie where id = $1;"; + req.db.query(query, [req.categorieId], (err, rs) => { + if (err) next(err) + }); + res.status(204).send(); +}); + +module.exports = router;