swd-be/routes/recepie.js

235 lines
9.1 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 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, 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);
/* 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+")"
if(req.query.usr) query += " AND nutzer IN ("+req.query.usr+")"
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 {
query += " ORDER BY rezept.name "
}
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];
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.')"
];
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"
];
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;