recipe_app/backend/backendServer.js
2025-07-25 18:07:20 +00:00

154 lines
3.9 KiB
JavaScript

const express = require("express");
const db = require("./db");
const port = 3000;
const cors = require("cors");
const app = express();
app.use(
cors({
origin: "https://ec683cee72d30c5030.fredzernia.com/",
credentials: true,
}),
);
app.use(express.json());
// ####### ROUTES #######
app.get("/backend/test", async (req, res) => {
console.log("test");
res.json({ test: "test" });
});
// ### GET ALL RECIPES ###
app.get("/backend/recipes", async (req, res) => {
try {
const recipes = await db("recipes").select("id", "name", "cuisine");
res.json(recipes);
} catch (err) {
console.log(err);
res.status(500).json({ error: err.message });
}
});
// ### GET ALL RECIPE_INGREDIENTS ###
app.get("/backend/recipe-ingredients", async (req, res) => {
try {
const recipe_ingredients = await db("recipe_ingredients").select("*");
res.json(recipe_ingredients);
} catch (err) {
console.log(err);
res.status(500).json({ error: err.message });
}
});
// ### GET ALL RECIPE_STEPS ###
app.get("/backend/recipe-steps", async (req, res) => {
try {
const recipe_steps = await db("recipe_steps").select("*");
res.json(recipe_steps);
} catch (err) {
console.log(err);
res.status(500).json({ error: err.message });
}
});
// ### GET RECIPE ###
app.get("/backend/recipe/:id", async (req, res) => {
const id = req.params.id;
try {
const recipeQuery = db("recipes")
.where("id", "=", id)
.select("id", "name", "author", "cuisine", "stars");
const ingredientsQuery = db
.from("recipe_ingredients")
.where("recipe_id", "=", id)
.select("raw");
const stepsQuery = db("recipe_steps")
.where("recipe_id", id)
.select("step_number", "instruction");
const [recipe, ingredients, steps] = await Promise.all([
recipeQuery,
ingredientsQuery,
stepsQuery,
]);
const result = {
details: recipe[0],
ingredients: ingredients,
steps: steps,
};
res.json(result);
} catch (err) {
console.log(err);
res.status(500).json({ error: err.message });
}
});
// ### ADD RECIPE ###
app.post("/backend/add-recipe", async (req, res) => {
const { name, author, cuisine, stars, ingredients, steps } = req.body;
try {
const [id] = await db("recipes").insert(
{
name: name,
author: author,
cuisine: cuisine,
stars: stars,
},
["id"],
);
const ingredientInserts = ingredients.map((ing) => ({
recipe_id: id.id,
raw: ing,
}));
//
await db("recipe_ingredients").insert(ingredientInserts);
const stepInserts = Object.keys(steps).map((stepNumber) => ({
recipe_id: id.id,
step_number: parseInt(stepNumber),
instruction: steps[stepNumber],
}));
await db("recipe_steps").insert(stepInserts);
res.status(200).send({ message: "Recipe added", id: id.id });
} catch (err) {
console.log(err);
res.status(500).json({ error: err.message });
}
});
// ### SET STARS ###
app.post("/backend/set-stars", async (req, res) => {
const { id, stars } = req.body;
try {
await db("recipes").where({ id: id }).update({ stars: stars });
res.status(200).send({ message: "stars updated" });
} catch (err) {
console.log(err);
res.status(500).json({ error: err.message });
}
});
// ### DELETE RECIPE ###
app.delete("/backend/delete-recipe", async (req, res) => {
const { id } = req.body;
try {
await db("recipe_steps").where({ recipe_id: id }).del();
await db("recipe_ingredients").where({ recipe_id: id }).del();
await db("recipes").where({ id: id }).del();
res.status(200).send({ message: "Recipe deleted" });
} catch (err) {
console.log(err);
res.status(500).json({ error: err.message });
}
});
app.listen(port, () => console.log(`Server has started on port: ${port}`));
process.on("SIGINT", async () => {
console.log("Closing database connection...");
await db.destroy();
process.exit(0);
});