const express = require('express'); const router = express.Router(); const bcrypt = require('bcrypt'); const randToken = require('rand-token'); const ingredientsRouter = require('./recepieIngredients'); const toolsRouter = require('./recepieTools'); const durationsRouter = require('./recepieDurations'); const stepsRouter = require('./recepieSteps'); 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, "+ " (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 "; if(isNaN(req.recepieId)) { query += " WHERE rezept.schluessel ilike '$1'"; } else { query += " WHERE rezept.id = $1"; } if(DEBUG) console.log(query); req.db.query(query, [req.recepieId], (err, rs) => { if (err) { return next(err) } req.recepie = rs.rows[0]; next(); }) }); router.use('/:recepieId/ingredients/', ingredientsRouter); router.use('/:recepieId/tools/', toolsRouter); router.use('/:recepieId/durations/', durationsRouter); router.use('/:recepieId/steps/', stepsRouter); /* 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 "; if(req.query.term) query += " WHERE rezept.name ilike '%"+req.query.term+"%' " 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 "; if(req.query['sort_by'] === 'rating') query += " ORDER BY rating "; } if(DEBUG) console.log(query); req.db.query(query, (err, rs) => { if (err){ console.log(query); next(err); } else { let result = {}; result['recepies'] = rs.rows; console.log(result); res.status(200).json(result); } }); }); router.post('/', function(req, res, next) { let recepie = req.body.recepies; if(!recepie.schluessel) recepie.schluessel = randToken.uid(8); if(!recepie.schwierigkeit || !recepie.name || !recepie.nutzer) { return res.status(400).send("Wrong Params") } let query = "INSERT INTO rezept (nutzer, name, schluessel, schwierigkeit, portionen, beschreibung) "+ " VALUES ($1, $2, $3, $4, $5, $6)" + " returning *"; let values = [recepie.nutzer, recepie.name, recepie.schluessel, recepie.schwierigkeit, recepie.portionen, recepie.beschreibung]; if(DEBUG) console.log(query); req.db.query(query, values, (err, rs) => { if(err && err.constraint && err.constraint ==='idx_rezept_email') { return res.status(409).send("Recipie Key already in use"); } else if (err){ next(err); } else { let result = {}; result['recepies'] = rs.rows[0]; req.db.query("INSERT into rezept_dauer (rezept, sort, name, dauer) VALUES ($1, 1, 'Zubereitung', '30m')", [rs.rows[0].id], (err, rs) => {}); req.db.query("INSERT into rezept_wertung (nutzer, rezept, wert, wertungskategorie) VALUES ($1, $2, 5, (SELECT id FROM wertungskategorie WHERE schluessel = 'sum'))", [rs.rows[0].nutzer, rs.rows[0].id], (err, rs) => {}); req.db.query("INSERT into rezept_schitt (rezept, sort, name, beschreibung) VALUES ($1, 1, 'Zubreitung', 'Mit Sherry ablöschen, Sahne hinzugeben und Parmesan reiben.')", [rs.rows[0].id], (err, rs) => {}); res.status(200).json(result); } }); }); /* Methods with id */ router.get('/:recepieId', function(req, res, next) { res.status(200).json(req.recepie); }); router.put('/:recepieId', function(req, res, next) { let recepie = req.body.recepies; let query = "UPDATE rezept set name = '"+recepie.name+ "', schluessel='"+recepie.schluessel+ "', portionen='"+recepie.portionen+ "', schwierigkeit='"+recepie.schwierigkeit+ "', beschreibung = '"+recepie.beschreibung+"' "+ " WHERE id = "+req.recepieId + " returning *"; if(DEBUG) console.log(query); req.db.query(query, (err, rs) => { if (err){ next(err); } else { let result = {}; result['recepies'] = rs.rows[0]; res.status(200).json(result); } }); }); router.delete('/:recepieId', function(req, res, next) { let query = [ "DELETE FROM rezept_dauer where rezept = $1;", "DELETE FROM rezept_zutat where rezept = $1;", "DELETE FROM rezept_geraet where rezept = $1;", "DELETE FROM rezept where id = $1;" ]; for(let i = 0; i< query.length; i++) { req.db.query(query[i], [req.recepieId], (err, rs) => { if (err) next(err) }); } res.status(204).send(); }); module.exports = router;