From f650e77c0373bb100ca9ce31bb68727e9b6c605d Mon Sep 17 00:00:00 2001 From: flifloo Date: Sat, 15 Aug 2020 20:17:36 +0200 Subject: [PATCH] Make command route working with database to process orders --- models/command.js | 8 ++++-- models/department.js | 3 +- models/sandwich.js | 5 ++-- models/sandwichCommand.js | 26 +++++++++++++++++ public/javascripts/index.js | 4 +-- public/stylesheets/style.css | 2 +- routes/command.js | 54 ++++++++++++++++++++++++++++++++++-- views/index.pug | 14 ++++------ 8 files changed, 95 insertions(+), 21 deletions(-) create mode 100644 models/sandwichCommand.js diff --git a/models/command.js b/models/command.js index 1704123..924a5fa 100644 --- a/models/command.js +++ b/models/command.js @@ -5,7 +5,7 @@ const { module.exports = (sequelize, DataTypes) => { class Command extends Model { static associate(models) { - Command.belongsToMany(models.Sandwich, {through: "SandwichCommand"}); + Command.belongsToMany(models.Sandwich, {through: {model: models.SandwichCommand, unique: false}}); Command.belongsTo(models.Department); } } @@ -19,9 +19,13 @@ module.exports = (sequelize, DataTypes) => { allowNull: false }, date: { - type: DataTypes.DATEONLY, + type: DataTypes.DATE, defaultValue: DataTypes.NOW, allowNull: false + }, + price: { + type: DataTypes.FLOAT, + allowNull: false } }, { sequelize, diff --git a/models/department.js b/models/department.js index 6483b79..4a29790 100644 --- a/models/department.js +++ b/models/department.js @@ -11,8 +11,7 @@ module.exports = (sequelize, DataTypes) => { Department.init({ name: { type: DataTypes.STRING, - unique: true, - allowNull: false + primaryKey: true } }, { sequelize, diff --git a/models/sandwich.js b/models/sandwich.js index 57d5a7d..8d1f1a7 100644 --- a/models/sandwich.js +++ b/models/sandwich.js @@ -5,14 +5,13 @@ const { module.exports = (sequelize, DataTypes) => { class Sandwich extends Model { static associate(models) { - Sandwich.belongsToMany(models.Command, {through: "SandwichCommand"}); + Sandwich.belongsToMany(models.Command, {through: {model: models.SandwichCommand, unique: false}}); } } Sandwich.init({ name: { type: DataTypes.STRING, - allowNull: false, - unique: true + primaryKey: true }, price: { type: DataTypes.FLOAT, diff --git a/models/sandwichCommand.js b/models/sandwichCommand.js new file mode 100644 index 0000000..3e5ac9a --- /dev/null +++ b/models/sandwichCommand.js @@ -0,0 +1,26 @@ +"use strict"; +const { + Model +} = require("sequelize"); +module.exports = (sequelize, DataTypes) => { + class SandwichCommand extends Model { + static associate(models) { + } + } + SandwichCommand.init({ + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true + }, + date: { + type: DataTypes.DATEONLY, + defaultValue: DataTypes.NOW, + allowNull: false + } + }, { + sequelize, + modelName: "SandwichCommand", + }); + return SandwichCommand; +}; diff --git a/public/javascripts/index.js b/public/javascripts/index.js index 197670e..d79dd83 100644 --- a/public/javascripts/index.js +++ b/public/javascripts/index.js @@ -16,11 +16,11 @@ document.getElementById("add-command").addEventListener("click", () => {

Command ${id}

- +
- +
`); document.getElementById("command"+lastCommandId()).scrollIntoView({behavior: "smooth"}); diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index 7e02997..3a2305c 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -62,7 +62,7 @@ a { font-size: 100%; } -.field input[type="text"], .field input[type="list"] { +.field input[type="text"], .field input[type="list"], .field input[type="date"] { height: 2.5vh; border-top: none; border-left: none; diff --git a/routes/command.js b/routes/command.js index ae7b5dd..5a8aff0 100644 --- a/routes/command.js +++ b/routes/command.js @@ -1,9 +1,57 @@ let express = require("express"); let router = express.Router(); +let models = require("../models"); -/* GET home page. */ -router.post("/", (req, res) => { - console.log(req.body); + +router.post("/", async (req, res) => { + if (!req.body.department || !req.body.firstName || !req.body.lastName || !req.body.sandwich1 || !req.body.date1) { + res.render("error", {message: "Invalid command !", "error": {status: "Missing arguments"}}); + return; + } + + let department = await models.Department.findByPk(req.body.department); + if (!department) { + res.render("error", {message: "Invalid command !", error: {status: "Invalid department"}}); + return; + } + + let sandwichs = []; + let price = 0; + for (let i = 1; req.body["sandwich" + i] !== undefined; i++) { + if (req.body["date" + i] === undefined) { + res.render("error", {message: "Invalid command !", error: {status: "Sandwich without date"}}); + return; + } + + let sandwich = await models.Sandwich.findByPk(req.body["sandwich" + i]); + if (!sandwich) { + res.render("error", { + message: "Invalid command !", + error: {status: "Invalid sandwich: "+req.body["sandwich" + i]} + }); + return; + } + sandwichs.push([sandwich.name, req.body["date" + i]]); + price += sandwich.price; + } + + let command = await models.Command.create({ + firstName: req.body.firstName, + lastName: req.body.lastName, + price: price + }); + await command.setDepartment(department); + for (let data of sandwichs) + try { + console.log(command.id); + console.log(data); + await models.SandwichCommand.create({CommandId: command.id, SandwichName: data[0], date: data[1]}); + } catch (e) { + await command.destroy(); + res.render("error", {message: "Invalid command !", error: {status: "Invalid date"}}); + throw e; + } + res.send("Ok"); }); module.exports = router; diff --git a/views/index.pug b/views/index.pug index f215b47..9c8aa07 100644 --- a/views/index.pug +++ b/views/index.pug @@ -6,27 +6,27 @@ block content p Welcome to Sandwiches Order Doua form#command(action="/command" method="POST") div.field - label(for="sandwich") Department: - input#department(type="list" list="department-list" name="department" required) + label(for="department") Department: + input#department(type="list" list="department-list" name="department" autocomplete="off" required) datalist#department-list each department in departments option(value=department.name) div.field label(for="firstname") First name: - input#firstname(type="text" name="firstname" required) + input#firstname(type="text" name="firstName" required) div.field label(for="lastname") Last name: - input#lastname(type="text" name="lastname" required) + input#lastname(type="text" name="lastName" required) div#command1.command h2 Command 1 div.field label(for="sandwich") Sandwich: - input#sandwich(type="list" list="sandwich-list" name="sandwich1" required) + input#sandwich(type="list" list="sandwich-list" name="sandwich1" autocomplete="off" required) div.field label(for="day") Day: - input#day(type="list" list="date-list" name="date1" required) + input#day(type="date" name="date1" required) div#command-action a#add-command + @@ -38,8 +38,6 @@ block content datalist#sandwich-list each sandwich in sandwichs option(value=sandwich.name) - datalist#date-list - option(value="14/08/2020") div#more a About