248 lines
9.5 KiB
JavaScript
248 lines
9.5 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
var cors = require('cors');
|
|
|
|
|
|
|
|
const randToken = require('rand-token');
|
|
|
|
const ingredientsRouter = require('./recepieIngredients');
|
|
const toolsRouter = require('./recepieTools');
|
|
const durationsRouter = require('./recepieDurations');
|
|
const stepsRouter = require('./recepieSteps');
|
|
const categoriesRouter = require('./recepieCategories');
|
|
const voteRouter = require('./recepieVote');
|
|
|
|
|
|
const DEBUG = true;
|
|
|
|
|
|
|
|
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, 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, "+
|
|
" 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) => {
|
|
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);
|
|
router.use('/:recepieId/categories/', categoriesRouter);
|
|
router.use('/:recepieId/votes/', voteRouter);
|
|
|
|
|
|
/* GET recepies listing. */
|
|
/* Gesucht wird in Rezept, Zutaten und Beschreibung */
|
|
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, "+
|
|
" 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 "+
|
|
" WHERE 1 = 1 ";
|
|
if(req.query.term) query += " AND rezept.name ilike '%"+req.query.term+
|
|
"%' OR rezept.beschreibung ilike '%"+req.query.term+"%' "+
|
|
" OR rezept.id in (select rezept from rezept_zutat where zutat in (select id from zutat where name ilike '%"+req.query.term+"%'))";
|
|
if(req.query.hashtag) query += " AND rezept.schluessel ilike '"+req.query.hashtag+"' "
|
|
if(req.query.cat) query += " AND kategorie.id IN ("+req.query.cat+")"
|
|
|
|
|
|
|
|
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 ";
|
|
if(req.query['sort_by'] === 'rating') query += " ORDER BY rating ";
|
|
} else if (req.query.limit) {
|
|
query += " ORDER BY random() LIMIT "+req.query.limit+" "
|
|
|
|
} else {
|
|
query += " ORDER BY rezept.name "
|
|
}
|
|
|
|
|
|
if(DEBUG) console.log(query);
|
|
if(DEBUG) console.log("DB", req.db);
|
|
req.db.query(query, (err, rs) => {
|
|
console.log("Returned from DB Query");
|
|
console.log(rs);
|
|
if (err){
|
|
console.log(query);
|
|
next(err);
|
|
} else {
|
|
let result = {};
|
|
if (DEBUG) console.log("RESULT", rs.rows);
|
|
result['recepies'] = rs.rows;
|
|
if (DEBUG) 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];
|
|
|
|
let querys = [
|
|
"INSERT into rezept_dauer (rezept, sort, name, dauer) VALUES ($1, 1, 'Zubereitung', '30m')",
|
|
"INSERT into rezept_wertung (nutzer, rezept, wert, wertungkategorie) VALUES ($1, $2, 5, (SELECT id FROM wertungkategorie WHERE schluessel = 'sum'))",
|
|
"INSERT into rezept_schritt (rezept, sort, name, beschreibung) VALUES ($1, 1, 'Zubereitung', 'Mit Sherry ablöschen, Sahne hinzugeben und Parmesan reiben.')"
|
|
];
|
|
|
|
if (DEBUG) {
|
|
console.log(querys[0],rs.rows[0].id);
|
|
console.log(querys[1],[rs.rows[0].nutzer, rs.rows[0].id]);
|
|
console.log(querys[2],rs.rows[0].id);
|
|
}
|
|
|
|
req.db.query(querys[0], [rs.rows[0].id], (err, rs) => {});
|
|
req.db.query(querys[1], [rs.rows[0].nutzer, rs.rows[0].id], (err, rs) => {});
|
|
req.db.query(querys[2], [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.options('/:recepieId', cors())
|
|
|
|
router.copy('/:recepieId', cors(), function(req, res, next) {
|
|
let recepie = req.recepie;
|
|
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+"Kopie", recepie.schluessel+"-kopie", 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];
|
|
|
|
let querys = [
|
|
"INSERT into rezept_dauer (rezept, sort, name, dauer, beschreibung) SELECT $2, sort, name, dauer, beschreibung FROM rezept_dauer where rezept = $1",
|
|
"INSERT into rezept_zutat (rezept, zutat, einheit, menge, beschreibung) SELECT $2, zutat, einheit, menge, beschreibung FROM rezept_zutat WHERE rezept = $1",
|
|
"INSERT into rezept_geraet (rezept, geraet, einheit, menge, beschreibung) SELECT $2, geraet, einheit, menge, beschreibung FROM rezept_geraet WHERE rezept = $1",
|
|
"INSERT into rezept_schritt (rezept, sort, name, beschreibung) SELECT $2, sort, name, beschreibung FROM rezept_schritt where rezept = $1"
|
|
];
|
|
if (DEBUG) {
|
|
console.log(querys[0],recepie.id);
|
|
console.log(querys[1],recepie.id);
|
|
console.log(querys[2],recepie.id);
|
|
console.log(querys[3],recepie.id);
|
|
}
|
|
req.db.query(querys[0], [recepie.id, rs.rows[0].id], (err, rs) => {});
|
|
req.db.query(querys[1], [recepie.id, rs.rows[0].id], (err, rs) => {});
|
|
req.db.query(querys[2], [recepie.id, rs.rows[0].id], (err, rs) => {});
|
|
req.db.query(querys[3], [recepie.id, rs.rows[0].id], (err, rs) => {});
|
|
|
|
|
|
res.status(200).json(result);
|
|
}
|
|
});
|
|
});
|
|
|
|
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+
|
|
"', nutzer='"+recepie.nutzer+
|
|
"', 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;
|