init commit
This commit is contained in:
@@ -0,0 +1,336 @@
|
||||
"use strict";
|
||||
const axios = require("axios");
|
||||
|
||||
const app = require("express").Router();
|
||||
const Sequelize = require("sequelize");
|
||||
const logger = require("../../services/LoggingService");
|
||||
let pagination = require("../../services/PaginationService");
|
||||
let SessionService = require("../../services/SessionService");
|
||||
let JwtService = require("../../services/JwtService");
|
||||
const ValidationService = require("../../services/ValidationService");
|
||||
const PermissionService = require("../../services/PermissionService");
|
||||
const UploadService = require("../../services/UploadService");
|
||||
const AuthService = require("../../services/AuthService");
|
||||
const db = require("../../models");
|
||||
const helpers = require("../../core/helpers");
|
||||
|
||||
const role = 1;
|
||||
|
||||
app.get("/admin/actives/:num", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
try {
|
||||
let session = req.session;
|
||||
let paginateListViewModel = require("../../view_models/actives_admin_list_paginate_view_model");
|
||||
|
||||
var viewModel = new paginateListViewModel(db.active, "Actives", session.success, session.error, "/admin/actives");
|
||||
|
||||
viewModel._column = ["ID", "Name", "Handle", "Description", "Variables scores", "Action"];
|
||||
viewModel._readable_column = ["ID", "Name", "Handle", "Description", "Variables scores"];
|
||||
|
||||
const format = req.query.format ? req.query.format : "view";
|
||||
const direction = req.query.direction ? req.query.direction : "ASC";
|
||||
const per_page = req.query.per_page ? req.query.per_page : 10;
|
||||
let order_by = req.query.order_by ? req.query.order_by : viewModel.get_field_column()[0];
|
||||
let orderAssociations = [];
|
||||
viewModel.set_order_by(order_by);
|
||||
let joins = order_by.includes(".") ? order_by.split(".") : [];
|
||||
order_by = order_by.includes(".") ? joins[joins.length - 1] : order_by;
|
||||
if (joins.length > 0) {
|
||||
for (let i = joins.length - 1; i > 0; i--) {
|
||||
orderAssociations.push(`${joins[i - 1]}`);
|
||||
}
|
||||
}
|
||||
// Check for flash messages
|
||||
const flashMessageSuccess = req.flash("success");
|
||||
if (flashMessageSuccess && flashMessageSuccess.length > 0) {
|
||||
viewModel.success = flashMessageSuccess[0];
|
||||
}
|
||||
const flashMessageError = req.flash("error");
|
||||
if (flashMessageError && flashMessageError.length > 0) {
|
||||
viewModel.error = flashMessageError[0];
|
||||
}
|
||||
|
||||
viewModel.set_id(req.query.id ? req.query.id : "");
|
||||
viewModel.set_name(req.query.name ? req.query.name : "");
|
||||
|
||||
let where = helpers.filterEmptyFields({
|
||||
id: viewModel.get_id(),
|
||||
name: viewModel.get_name(),
|
||||
});
|
||||
|
||||
const count = await db.active._count(where, []);
|
||||
|
||||
viewModel.set_total_rows(count);
|
||||
viewModel.set_per_page(+per_page);
|
||||
viewModel.set_page(+req.params.num);
|
||||
viewModel.set_query(req.query);
|
||||
viewModel.set_sort_base_url(`/admin/actives/${+req.params.num}`);
|
||||
viewModel.set_sort(direction);
|
||||
|
||||
const list = await db.active.getPaginated(viewModel.get_page() - 1 < 0 ? 0 : viewModel.get_page(), viewModel.get_per_page(), where, order_by, direction, orderAssociations);
|
||||
|
||||
viewModel.set_list(list);
|
||||
|
||||
if (format == "csv") {
|
||||
const csv = viewModel.to_csv();
|
||||
return res
|
||||
.set({
|
||||
"Content-Type": "text/csv",
|
||||
"Content-Disposition": 'attachment; filename="export.csv"',
|
||||
})
|
||||
.send(csv);
|
||||
}
|
||||
|
||||
return res.render("admin/Actives", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Actives", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/admin/actives-add", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
|
||||
const activesAdminAddViewModel = require("../../view_models/actives_admin_add_view_model");
|
||||
|
||||
const viewModel = new activesAdminAddViewModel(db.active, "Add active", "", "", "/admin/actives");
|
||||
viewModel.output_variables = await db.output_variable.getAll();
|
||||
res.render("admin/Add_Actives", viewModel);
|
||||
});
|
||||
|
||||
app.post("/admin/actives-add", SessionService.verifySessionMiddleware(role, "admin"), ValidationService.validateInput({ name: "required", handle: "required" }), async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const activesAdminAddViewModel = require("../../view_models/actives_admin_add_view_model");
|
||||
|
||||
const viewModel = new activesAdminAddViewModel(db.active, "Add active", "", "", "/admin/actives");
|
||||
viewModel.output_variables = await db.output_variable.getAll();
|
||||
|
||||
// TODO use separate controller for image upload
|
||||
// {{{upload_field_setter}}}
|
||||
|
||||
const { name, description, handle, ...rest } = req.body;
|
||||
|
||||
viewModel.form_fields = {
|
||||
...viewModel.form_fields,
|
||||
name,
|
||||
handle,
|
||||
description,
|
||||
};
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
viewModel.error = req.validationError;
|
||||
return res.render("admin/Add_Actives", viewModel);
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
const data = await db.active.insert({ name, description, handle, variables_scores: JSON.stringify(rest) });
|
||||
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Add_Actives", viewModel);
|
||||
}
|
||||
|
||||
req.flash("success", "Active created successfully");
|
||||
return res.redirect("/admin/actives/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Add_Actives", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/admin/actives-edit/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const activesAdminEditViewModel = require("../../view_models/actives_admin_edit_view_model");
|
||||
|
||||
const viewModel = new activesAdminEditViewModel(db.active, "Edit active", "", "", "/admin/actives");
|
||||
viewModel.output_variables = await db.output_variable.getAll();
|
||||
|
||||
try {
|
||||
const exists = await db.active.getByPK(id);
|
||||
|
||||
if (!exists) {
|
||||
req.flash("error", "Active not found");
|
||||
return res.redirect("/admin/actives/0");
|
||||
}
|
||||
const values = exists;
|
||||
Object.keys(viewModel.form_fields).forEach((field) => {
|
||||
viewModel.form_fields[field] = values[field] || "";
|
||||
});
|
||||
if (exists.variables_scores) {
|
||||
const currentOutputVariablesScores = JSON.parse(exists.variables_scores);
|
||||
Object.keys(currentOutputVariablesScores).forEach((varScore) => {
|
||||
viewModel.form_fields[varScore] = currentOutputVariablesScores[varScore];
|
||||
});
|
||||
}
|
||||
return res.render("admin/Edit_Actives", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Edit_Actives", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.post("/admin/actives-edit/:id", SessionService.verifySessionMiddleware(role, "admin"), ValidationService.validateInput({ name: "required", handle: "required" }), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
|
||||
const activesAdminEditViewModel = require("../../view_models/actives_admin_edit_view_model");
|
||||
|
||||
const viewModel = new activesAdminEditViewModel(db.active, "Edit active", "", "", "/admin/actives");
|
||||
viewModel.form_fields = { variables_scores: "", name: "", id: "" };
|
||||
viewModel.output_variables = await db.output_variable.getAll();
|
||||
const { name, description, handle, ...rest } = req.body;
|
||||
|
||||
viewModel.form_fields = {
|
||||
...viewModel.form_fields,
|
||||
name,
|
||||
description,
|
||||
handle,
|
||||
};
|
||||
|
||||
delete viewModel.form_fields.id;
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
viewModel.error = req.validationError;
|
||||
return res.render("admin/Edit_Actives", viewModel);
|
||||
}
|
||||
|
||||
const resourceExists = await db.active.getByPK(id);
|
||||
if (!resourceExists) {
|
||||
req.flash("error", "Active not found");
|
||||
return res.redirect("/admin/actives/0");
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
let data = await db.active.edit({ name, description, handle, variables_scores: JSON.stringify(rest) }, id);
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Edit_Actives", viewModel);
|
||||
}
|
||||
|
||||
req.flash("success", "Active edited successfully");
|
||||
|
||||
return res.redirect("/admin/actives/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Edit_Actives", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/admin/resync/actives", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
try {
|
||||
var config = {
|
||||
method: "get",
|
||||
url: `https://${process.env.SHOPIFY_API_KEY}:${process.env.SHOPIFY_API_PASSWORD}@${process.env.SHOPIFY_SITE}/admin/api/2021-10/products.json`,
|
||||
headers: {},
|
||||
};
|
||||
const data = await axios(config).then((response) => response.data);
|
||||
console.log(data.products);
|
||||
for (const product of data.products) {
|
||||
if (product.tags == "Personalized Cream" && product.title !== "Blank") {
|
||||
const activeExists = await db.active.getByFields({ name: product.title });
|
||||
if (activeExists) {
|
||||
await db.active.edit(
|
||||
{
|
||||
handle: `https://localhost:3001/products/${product.handle}`,
|
||||
},
|
||||
activeExists.id
|
||||
);
|
||||
} else {
|
||||
await db.active.insert({
|
||||
name: product.title,
|
||||
handle: `https://localhost:3001/products/${product.handle}`,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
req.flash("success", "Actives resynced successfully");
|
||||
return res.redirect("/admin/actives/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
req.flash("error", error.message);
|
||||
return res.redirect("/admin/actives/0");
|
||||
}
|
||||
});
|
||||
|
||||
app.get(
|
||||
"/admin/actives-view/:id",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
|
||||
async function (req, res, next) {
|
||||
try {
|
||||
let id = req.params.id;
|
||||
|
||||
const activesAdminDetailViewModel = require("../../view_models/actives_admin_detail_view_model");
|
||||
|
||||
var viewModel = new activesAdminDetailViewModel(db.active, "Active details", "", "", "/admin/actives");
|
||||
|
||||
const data = await db.active.getByPK(id);
|
||||
|
||||
if (!data) {
|
||||
viewModel.error = "Active not found";
|
||||
viewModel.detail_fields = { ...viewModel.detail_fields, id: "N/A", name: "N/A", handle: "N/A", description: "N/A" };
|
||||
} else {
|
||||
viewModel.detail_fields = { ...viewModel.detail_fields, id: data["id"] || "N/A", name: data["name"] || "N/A", handle: data["handle"] || "N/A", description: data["description"] || "N/A" };
|
||||
}
|
||||
|
||||
res.render("admin/View_Actives", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
viewModel.detail_fields = { ...viewModel.detail_fields, id: "N/A", name: "N/A", handle: "N/A", description: "N/A" };
|
||||
res.render("admin/View_Actives", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get("/admin/actives-delete/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
|
||||
const activesAdminDeleteViewModel = require("../../view_models/actives_admin_delete_view_model");
|
||||
|
||||
const viewModel = new activesAdminDeleteViewModel(db.active);
|
||||
|
||||
try {
|
||||
const exists = await db.active.getByPK(id);
|
||||
|
||||
if (!exists) {
|
||||
req.flash("error", "Active not found");
|
||||
return res.redirect("/admin/actives/0");
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
await db.active.realDelete(id);
|
||||
await db.answer.destroy({
|
||||
where: {
|
||||
answer: exists.name,
|
||||
},
|
||||
});
|
||||
req.flash("success", "Active was deleted successfully");
|
||||
|
||||
return res.redirect("/admin/actives/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
req.flash("error", error.message || "Something went wrong");
|
||||
return res.redirect("/admin/actives/0");
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = app;
|
||||
@@ -0,0 +1,614 @@
|
||||
"use strict";
|
||||
|
||||
const app = require("express").Router();
|
||||
const Sequelize = require("sequelize");
|
||||
const logger = require("../../services/LoggingService");
|
||||
let pagination = require("../../services/PaginationService");
|
||||
let SessionService = require("../../services/SessionService");
|
||||
let JwtService = require("../../services/JwtService");
|
||||
const ValidationService = require("../../services/ValidationService");
|
||||
const PermissionService = require("../../services/PermissionService");
|
||||
const UploadService = require("../../services/UploadService");
|
||||
const AuthService = require("../../services/AuthService");
|
||||
const db = require("../../models");
|
||||
const helpers = require("../../core/helpers");
|
||||
|
||||
const role = 1;
|
||||
|
||||
app.get("/admin/answers/:num", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
try {
|
||||
let session = req.session;
|
||||
let paginateListViewModel = require("../../view_models/answers_admin_list_paginate_view_model");
|
||||
|
||||
var viewModel = new paginateListViewModel(db.answer, "Answers", session.success, session.error, "/admin/answers");
|
||||
|
||||
const format = req.query.format ? req.query.format : "view";
|
||||
const direction = req.query.direction ? req.query.direction : "ASC";
|
||||
const per_page = req.query.per_page ? req.query.per_page : 10;
|
||||
// let order_by = req.query.order_by ? req.query.order_by : viewModel.get_field_column()[0];
|
||||
let order_by = [
|
||||
["question", "quiz_id", direction],
|
||||
["question", "order", direction],
|
||||
["question_id", direction],
|
||||
["order", direction],
|
||||
];
|
||||
// Check for flash messages
|
||||
const flashMessageSuccess = req.flash("success");
|
||||
if (flashMessageSuccess && flashMessageSuccess.length > 0) {
|
||||
viewModel.success = flashMessageSuccess[0];
|
||||
}
|
||||
const flashMessageError = req.flash("error");
|
||||
if (flashMessageError && flashMessageError.length > 0) {
|
||||
viewModel.error = flashMessageError[0];
|
||||
}
|
||||
|
||||
viewModel.set_id(req.query.id ? req.query.id : "");
|
||||
viewModel.set_question_id(req.query.question_id ? req.query.question_id : "");
|
||||
|
||||
let where = helpers.filterEmptyFields({
|
||||
id: viewModel.get_id(),
|
||||
question_id: viewModel.get_question_id(),
|
||||
});
|
||||
|
||||
const count = await db.answer._count(where, [{ all: true, nested: true }]);
|
||||
|
||||
viewModel.set_total_rows(count);
|
||||
viewModel.set_per_page(+per_page);
|
||||
viewModel.set_page(+req.params.num);
|
||||
viewModel.set_query(req.query);
|
||||
viewModel.set_sort_base_url(`/admin/answers/${+req.params.num}`);
|
||||
viewModel.set_sort(direction);
|
||||
|
||||
const list = await db.answer.getPaginatedV2(viewModel.get_page() - 1 < 0 ? 0 : viewModel.get_page(), viewModel.get_per_page(), where, order_by, direction, [{ all: true, nested: true }]);
|
||||
|
||||
viewModel.set_list(list);
|
||||
|
||||
viewModel.question = await db.question;
|
||||
viewModel.image = await db.image;
|
||||
|
||||
if (format == "csv") {
|
||||
const csv = viewModel.to_csv();
|
||||
return res
|
||||
.set({
|
||||
"Content-Type": "text/csv",
|
||||
"Content-Disposition": 'attachment; filename="export.csv"',
|
||||
})
|
||||
.send(csv);
|
||||
}
|
||||
|
||||
return res.render("admin/Answers", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Answers", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/admin/answers-add", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
|
||||
const answersAdminAddViewModel = require("../../view_models/answers_admin_add_view_model");
|
||||
|
||||
const viewModel = new answersAdminAddViewModel(db.answer, "Add answer", "", "", "/admin/answers");
|
||||
viewModel.questions = await db.question.getAll({
|
||||
type: {
|
||||
[Sequelize.Op.notIn]: [1, 2, 3],
|
||||
},
|
||||
});
|
||||
viewModel.actives = await db.active.getAll();
|
||||
res.render("admin/Add_Answers", viewModel);
|
||||
});
|
||||
|
||||
app.post(
|
||||
"/admin/answers-add",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
ValidationService.validateInput({ question_id: "required", order: "required" }, { "question_id.required": "QuestionId is required", "order.required": "Order is required" }),
|
||||
async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const addedFromQuestion = req.query.question;
|
||||
const answersAdminAddViewModel = require("../../view_models/answers_admin_add_view_model");
|
||||
|
||||
const viewModel = new answersAdminAddViewModel(db.answer, "Add answer", "", "", "/admin/answers");
|
||||
viewModel.questions = await db.question.getAll({
|
||||
type: {
|
||||
[Sequelize.Op.notIn]: [1, 2, 3],
|
||||
},
|
||||
});
|
||||
viewModel.actives = await db.active.getAll();
|
||||
|
||||
const {
|
||||
question_id,
|
||||
answer,
|
||||
answer_value,
|
||||
hide_answer,
|
||||
order,
|
||||
explaination,
|
||||
image_id,
|
||||
response_header,
|
||||
response_body,
|
||||
// response_arguments,
|
||||
black_list_actives,
|
||||
} = req.body;
|
||||
|
||||
viewModel.form_fields = {
|
||||
...viewModel.form_fields,
|
||||
question_id,
|
||||
answer,
|
||||
answer_value,
|
||||
hide_answer,
|
||||
order,
|
||||
explaination,
|
||||
image_id,
|
||||
response_header,
|
||||
response_body,
|
||||
// response_arguments,
|
||||
black_list_actives,
|
||||
};
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
viewModel.error = req.validationError;
|
||||
if (addedFromQuestion) {
|
||||
req.flash("error", req.validationError);
|
||||
return res.redirect(`/admin/questions-edit/${addedFromQuestion}`);
|
||||
}
|
||||
return res.render("admin/Add_Answers", viewModel);
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
const data = await db.answer.insert(
|
||||
helpers.filterEmptyFields({
|
||||
question_id,
|
||||
answer,
|
||||
answer_value,
|
||||
hide_answer,
|
||||
order,
|
||||
explaination,
|
||||
image_id,
|
||||
response_header,
|
||||
response_body,
|
||||
// response_arguments,
|
||||
black_list_actives: !Array.isArray(black_list_actives) ? JSON.stringify([black_list_actives]) : JSON.stringify(black_list_actives),
|
||||
})
|
||||
);
|
||||
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Add_Answers", viewModel);
|
||||
}
|
||||
|
||||
await db.activity_log.insert({
|
||||
action: "ADD",
|
||||
name: "Admin_answer_controller.js",
|
||||
portal: "admin",
|
||||
data: JSON.stringify({
|
||||
question_id,
|
||||
answer,
|
||||
answer_value,
|
||||
hide_answer,
|
||||
order,
|
||||
explaination,
|
||||
image_id,
|
||||
response_header,
|
||||
response_body,
|
||||
// response_arguments,
|
||||
black_list_actives: !Array.isArray(black_list_actives) ? JSON.stringify([black_list_actives]) : JSON.stringify(black_list_actives),
|
||||
}),
|
||||
});
|
||||
if (addedFromQuestion) {
|
||||
req.flash("success", "Answer created successfully");
|
||||
return res.redirect(`/admin/questions-edit/${addedFromQuestion}`);
|
||||
}
|
||||
req.flash("success", "Answer created successfully");
|
||||
return res.redirect("/admin/answers/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
if (addedFromQuestion) {
|
||||
req.flash("error", viewModel.error);
|
||||
return res.redirect(`/admin/questions-edit/${addedFromQuestion}`);
|
||||
}
|
||||
return res.render("admin/Add_Answers", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get("/admin/answers-edit/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const answersAdminEditViewModel = require("../../view_models/answers_admin_edit_view_model");
|
||||
|
||||
const viewModel = new answersAdminEditViewModel(db.answer, "Edit answer", "", "", "/admin/answers");
|
||||
|
||||
try {
|
||||
const exists = await db.answer.findOne({
|
||||
where: {
|
||||
id,
|
||||
},
|
||||
include: [{ all: true, nested: true }],
|
||||
});
|
||||
|
||||
if (!exists) {
|
||||
req.flash("error", "Answer not found");
|
||||
return res.redirect("/admin/answers/0");
|
||||
}
|
||||
|
||||
viewModel.answer = exists;
|
||||
viewModel.question = await db.question.getByPK(exists.question_id);
|
||||
viewModel.questions = await db.question.getAll({
|
||||
type: {
|
||||
[Sequelize.Op.notIn]: [1, 2, 3],
|
||||
},
|
||||
});
|
||||
viewModel.actives = await db.active.getAll();
|
||||
return res.render("admin/Edit_Answers", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Edit_Answers", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.post(
|
||||
"/admin/answers-edit/:id",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
ValidationService.validateInput(
|
||||
{ question_id: "required", answer: "required", order: "required" },
|
||||
{ "question_id.required": "QuestionId is required", "answer.required": "Answer is required", "order.required": "Order is required" }
|
||||
),
|
||||
async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
|
||||
const answersAdminEditViewModel = require("../../view_models/answers_admin_edit_view_model");
|
||||
|
||||
const viewModel = new answersAdminEditViewModel(db.answer, "Edit answer", "", "", "/admin/answers");
|
||||
viewModel.questions = await db.question.getAll({
|
||||
type: {
|
||||
[Sequelize.Op.notIn]: [1, 2, 3],
|
||||
},
|
||||
});
|
||||
viewModel.actives = await db.active.getAll();
|
||||
const {
|
||||
question_id,
|
||||
answer,
|
||||
answer_value,
|
||||
hide_answer,
|
||||
order,
|
||||
explaination,
|
||||
image_id,
|
||||
response_header,
|
||||
response_body,
|
||||
// response_arguments,
|
||||
black_list_actives,
|
||||
} = req.body;
|
||||
|
||||
viewModel.form_fields = {
|
||||
...viewModel.form_fields,
|
||||
question_id,
|
||||
answer,
|
||||
answer_value,
|
||||
hide_answer,
|
||||
order,
|
||||
explaination,
|
||||
image_id,
|
||||
response_header,
|
||||
response_body,
|
||||
// response_arguments,
|
||||
black_list_actives,
|
||||
};
|
||||
|
||||
delete viewModel.form_fields.id;
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
viewModel.error = req.validationError;
|
||||
return res.render("admin/Edit_Answers", viewModel);
|
||||
}
|
||||
|
||||
const resourceExists = await db.answer.getByPK(id);
|
||||
if (!resourceExists) {
|
||||
req.flash("error", "Answer not found");
|
||||
return res.redirect("/admin/answers/0");
|
||||
}
|
||||
|
||||
viewModel.question = await db.question.getByPK(resourceExists.question_id);
|
||||
viewModel.session = req.session;
|
||||
|
||||
let data = await db.answer.edit(
|
||||
helpers.filterEmptyFields({
|
||||
question_id,
|
||||
answer,
|
||||
answer_value,
|
||||
hide_answer,
|
||||
order,
|
||||
explaination,
|
||||
image_id,
|
||||
response_header,
|
||||
response_body,
|
||||
// response_arguments,
|
||||
black_list_actives: JSON.stringify(black_list_actives),
|
||||
}),
|
||||
id
|
||||
);
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Edit_Answers", viewModel);
|
||||
}
|
||||
|
||||
if (resourceExists.question) {
|
||||
data = await db.question.edit(helpers.filterEmptyFields({}), resourceExists.question.id);
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Edit_Answers", viewModel);
|
||||
}
|
||||
}
|
||||
|
||||
await db.activity_log.insert({
|
||||
action: "EDIT",
|
||||
name: "Admin_answer_controller.js",
|
||||
portal: "admin",
|
||||
data: JSON.stringify({
|
||||
question_id,
|
||||
answer,
|
||||
answer_value,
|
||||
order,
|
||||
explaination,
|
||||
image_id,
|
||||
response_header,
|
||||
response_body,
|
||||
// response_arguments,
|
||||
black_list_actives: JSON.stringify(black_list_actives),
|
||||
}),
|
||||
});
|
||||
|
||||
req.flash("success", "Answer edited successfully");
|
||||
|
||||
return res.redirect("/admin/answers/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Edit_Answers", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get(
|
||||
"/admin/answers-view/:id",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
|
||||
async function (req, res, next) {
|
||||
try {
|
||||
let id = req.params.id;
|
||||
|
||||
const answersAdminDetailViewModel = require("../../view_models/answers_admin_detail_view_model");
|
||||
|
||||
var viewModel = new answersAdminDetailViewModel(db.answer, "Answer details", "", "", "/admin/answers");
|
||||
|
||||
const data = await db.answer.findOne({
|
||||
where: {
|
||||
id,
|
||||
},
|
||||
include: [{ all: true, nested: true }],
|
||||
});
|
||||
|
||||
data["question.note_type"] = db.question.note_type_mapping()[data.question.note_type];
|
||||
data["question.target"] = db.question.target_mapping()[data.question.target];
|
||||
data["question.type"] = db.question.type_mapping()[data.question.type];
|
||||
|
||||
if (!data) {
|
||||
viewModel.error = "Answer not found";
|
||||
viewModel.detail_fields = {
|
||||
...viewModel.detail_fields,
|
||||
id: "N/A",
|
||||
question_id: "N/A",
|
||||
"question.question": "N/A",
|
||||
answer: "N/A",
|
||||
answer_value: "N/A",
|
||||
order: "N/A",
|
||||
explaination: "N/A",
|
||||
image_id: "N/A",
|
||||
response_header: "N/A",
|
||||
response_body: "N/A",
|
||||
response_arguments: "N/A",
|
||||
black_list_actives: "N/A",
|
||||
};
|
||||
} else {
|
||||
viewModel.answer = data;
|
||||
}
|
||||
|
||||
res.render("admin/View_Answers", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
viewModel.detail_fields = {
|
||||
...viewModel.detail_fields,
|
||||
id: "N/A",
|
||||
question_id: "N/A",
|
||||
"question.question": "N/A",
|
||||
answer: "N/A",
|
||||
answer_value: "N/A",
|
||||
order: "N/A",
|
||||
explaination: "N/A",
|
||||
image_id: "N/A",
|
||||
response_header: "N/A",
|
||||
response_body: "N/A",
|
||||
response_arguments: "N/A",
|
||||
black_list_actives: "N/A",
|
||||
};
|
||||
res.render("admin/View_Answers", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get("/admin/answers-delete/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
|
||||
const answersAdminDeleteViewModel = require("../../view_models/answers_admin_delete_view_model");
|
||||
|
||||
const viewModel = new answersAdminDeleteViewModel(db.answer);
|
||||
|
||||
try {
|
||||
const exists = await db.answer.getByPK(id);
|
||||
|
||||
if (!exists) {
|
||||
req.flash("error", "Answer not found");
|
||||
return res.redirect("/admin/answers/0");
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
await db.answer.realDelete(id);
|
||||
|
||||
await db.activity_log.insert({
|
||||
action: "DELETE",
|
||||
name: "Admin_answer_controller.js",
|
||||
portal: "admin",
|
||||
data: JSON.stringify(exists),
|
||||
});
|
||||
|
||||
req.flash("success", "Answer was deleted successfully");
|
||||
|
||||
return res.redirect("/admin/answers/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
req.flash("error", error.message || "Something went wrong");
|
||||
return res.redirect("/admin/answers/0");
|
||||
}
|
||||
});
|
||||
|
||||
// APIS
|
||||
|
||||
app.get("/admin/api/answers", JwtService.verifyTokenMiddleware(role), async function (req, res, next) {
|
||||
try {
|
||||
const user_id = req.user_id;
|
||||
const session = req.session;
|
||||
let listViewModel = require("../../view_models/answers_admin_list_paginate_view_model");
|
||||
let viewModel = new listViewModel(db.answer, "Answers", session.success, session.error, "/admin/answers");
|
||||
const direction = req.query.direction ? req.query.direction : "ASC";
|
||||
const page = req.query.page ? parseInt(req.query.page) : 1;
|
||||
const limit = req.query.limit ? parseInt(req.query.limit) : 10;
|
||||
const offset = (page - 1) * limit;
|
||||
let order_by = req.query.order_by ? req.query.order_by : viewModel.get_field_column()[0];
|
||||
let orderAssociations = [];
|
||||
viewModel.set_order_by(order_by);
|
||||
let joins = order_by.includes(".") ? order_by.split(".") : [];
|
||||
order_by = order_by.includes(".") ? joins[joins.length - 1] : order_by;
|
||||
if (joins.length > 0) {
|
||||
for (let i = joins.length - 1; i > 0; i--) {
|
||||
orderAssociations.push(`${joins[i - 1]}`);
|
||||
}
|
||||
}
|
||||
|
||||
viewModel.set_id(req.query.id ? req.query.id : "");
|
||||
viewModel.set_question_id(req.query.question_id ? req.query.question_id : "");
|
||||
|
||||
let where = helpers.filterEmptyFields({
|
||||
id: viewModel.get_id(),
|
||||
question_id: viewModel.get_question_id(),
|
||||
});
|
||||
|
||||
let associatedWhere = helpers.filterEmptyFields({});
|
||||
const isAssociationRequired = Object.keys(associatedWhere).length > 0 ? true : false;
|
||||
|
||||
let include = [{ model: db.question, where: associatedWhere, required: isAssociationRequired, as: "question" }];
|
||||
|
||||
const { rows: allItems, count } = await db.answer.findAndCountAll({
|
||||
where: where,
|
||||
limit: limit == 0 ? null : limit,
|
||||
offset: offset,
|
||||
include: include,
|
||||
distinct: true,
|
||||
});
|
||||
|
||||
const response = {
|
||||
items: allItems,
|
||||
page,
|
||||
nextPage: count > offset + limit ? page + 1 : false,
|
||||
retrievedCount: allItems.length,
|
||||
fullCount: count,
|
||||
};
|
||||
|
||||
return res.status(201).json({ success: true, data: response });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
app.post(
|
||||
"/admin/answers-bulk-edit/:id",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
ValidationService.validateInput({ answer: "required", order: "required" }, { "answer.required": "Answer is required", "order.required": "Order is required" }),
|
||||
async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const questionId = req.params.id;
|
||||
const { ids, answer, answer_value, hide_answer, order, explaination, image_id, response_header, response_body } = req.body;
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
req.flash("error", req.validationError);
|
||||
return res.redirect(`/admin/questions-edit/${questionId}`);
|
||||
}
|
||||
for (let i = 0; i < ids.length; i++) {
|
||||
await db.answer.edit(
|
||||
helpers.filterEmptyFields({
|
||||
answer: answer ? answer[i] : null,
|
||||
answer_value: answer_value ? answer_value[i] : null,
|
||||
hide_answer: hide_answer ? hide_answer[i] : null,
|
||||
// order: order ? order[i] : null,
|
||||
order: i + 1,
|
||||
explaination: explaination ? explaination[i] : null,
|
||||
image_id: image_id ? image_id[i] : null,
|
||||
response_header: response_header ? response_header[i] : null,
|
||||
response_body: response_body ? response_body[i] : null,
|
||||
black_list_actives: req.body[`black_list_actives_${ids[i]}`] ? JSON.stringify(req.body[`black_list_actives_${ids[i]}`]) : null,
|
||||
}),
|
||||
ids[i]
|
||||
);
|
||||
}
|
||||
// req.flash("success", "Answers edited successfully");
|
||||
// return res.redirect(`/admin/questions-edit/${questionId}`);
|
||||
return res.json({ success: true, message: "Answers edited successfully" });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
req.flash("error", error.message || "Something went wrong. please contact admin.");
|
||||
return res.redirect(`/admin/questions-edit/${questionId}`);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get("/admin/question/:question/answer-delete/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let { id, question } = req.params;
|
||||
|
||||
try {
|
||||
const exists = await db.answer.getByPK(id);
|
||||
|
||||
if (!exists) {
|
||||
req.flash("error", "Answer not found");
|
||||
return res.redirect("/admin/questions-edit/" + question);
|
||||
}
|
||||
|
||||
await db.answer.realDelete(id);
|
||||
|
||||
req.flash("success", "Answer was deleted successfully");
|
||||
return res.redirect("/admin/questions-edit/" + question);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
req.flash("error", error.message || "Something went wrong");
|
||||
return res.redirect("/admin/questions-edit/" + question);
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = app;
|
||||
@@ -0,0 +1,179 @@
|
||||
"use strict";
|
||||
|
||||
const app = require("express").Router();
|
||||
const Sequelize = require("sequelize");
|
||||
const logger = require("../../services/LoggingService");
|
||||
let pagination = require("../../services/PaginationService");
|
||||
let SessionService = require("../../services/SessionService");
|
||||
let JwtService = require("../../services/JwtService");
|
||||
const ValidationService = require("../../services/ValidationService");
|
||||
const PermissionService = require("../../services/PermissionService");
|
||||
const UploadService = require("../../services/UploadService");
|
||||
const AuthService = require("../../services/AuthService");
|
||||
const db = require("../../models");
|
||||
const helpers = require("../../core/helpers");
|
||||
|
||||
const role = 1;
|
||||
|
||||
app.get("/admin/orders/:num", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
try {
|
||||
let session = req.session;
|
||||
let paginateListViewModel = require("../../view_models/orders_admin_list_paginate_view_model");
|
||||
|
||||
var viewModel = new paginateListViewModel(db.order, "Orders", session.success, session.error, "/admin/orders");
|
||||
|
||||
const format = req.query.format ? req.query.format : "view";
|
||||
const direction = req.query.direction ? req.query.direction : "DESC";
|
||||
const per_page = req.query.per_page ? req.query.per_page : 10;
|
||||
let order_by = req.query.order_by ? req.query.order_by : viewModel.get_field_column()[0];
|
||||
let orderAssociations = [];
|
||||
viewModel.set_order_by(order_by);
|
||||
let joins = order_by.includes(".") ? order_by.split(".") : [];
|
||||
order_by = order_by.includes(".") ? joins[joins.length - 1] : order_by;
|
||||
if (joins.length > 0) {
|
||||
for (let i = joins.length - 1; i > 0; i--) {
|
||||
orderAssociations.push(`${joins[i - 1]}`);
|
||||
}
|
||||
}
|
||||
// Check for flash messages
|
||||
const flashMessageSuccess = req.flash("success");
|
||||
if (flashMessageSuccess && flashMessageSuccess.length > 0) {
|
||||
viewModel.success = flashMessageSuccess[0];
|
||||
}
|
||||
const flashMessageError = req.flash("error");
|
||||
if (flashMessageError && flashMessageError.length > 0) {
|
||||
viewModel.error = flashMessageError[0];
|
||||
}
|
||||
|
||||
viewModel.set_id(req.query.id ? req.query.id : "");
|
||||
viewModel.set_customer_shopify_id(req.query.customer_shopify_id ? req.query.customer_shopify_id : "");
|
||||
viewModel.set_shopify_id(req.query.shopify_id ? req.query.shopify_id : "");
|
||||
viewModel.set_financial_status(req.query.financial_status ? req.query.financial_status : "");
|
||||
viewModel.set_fulfillment_status(req.query.fulfillment_status ? req.query.fulfillment_status : "");
|
||||
|
||||
let where = helpers.filterEmptyFields({
|
||||
id: viewModel.get_id(),
|
||||
customer_shopify_id: viewModel.get_customer_shopify_id(),
|
||||
shopify_id: viewModel.get_shopify_id(),
|
||||
financial_status: viewModel.get_financial_status(),
|
||||
fulfillment_status: viewModel.get_fulfillment_status(),
|
||||
});
|
||||
|
||||
const count = await db.order._count(where, []);
|
||||
|
||||
viewModel.set_total_rows(count);
|
||||
viewModel.set_per_page(+per_page);
|
||||
viewModel.set_page(+req.params.num);
|
||||
viewModel.set_query(req.query);
|
||||
viewModel.set_sort_base_url(`/admin/orders/${+req.params.num}`);
|
||||
viewModel.set_sort(direction);
|
||||
|
||||
const list = await db.order.getPaginated(viewModel.get_page() - 1 < 0 ? 0 : viewModel.get_page(), viewModel.get_per_page(), where, order_by, direction, orderAssociations);
|
||||
|
||||
viewModel.set_list(list);
|
||||
|
||||
if (format == "csv") {
|
||||
const csv = viewModel.to_csv();
|
||||
return res
|
||||
.set({
|
||||
"Content-Type": "text/csv",
|
||||
"Content-Disposition": 'attachment; filename="export.csv"',
|
||||
})
|
||||
.send(csv);
|
||||
}
|
||||
|
||||
// if (format != 'view') {
|
||||
// res.json(viewModel.to_json());
|
||||
// } else {
|
||||
// }
|
||||
|
||||
return res.render("admin/Orders", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Orders", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
// APIS
|
||||
|
||||
app.get("/admin/api/orders", JwtService.verifyTokenMiddleware(role), async function (req, res, next) {
|
||||
try {
|
||||
const user_id = req.user_id;
|
||||
const session = req.session;
|
||||
let listViewModel = require("../../view_models/orders_admin_list_paginate_view_model");
|
||||
let viewModel = new listViewModel(db.order, "Orders", session.success, session.error, "/admin/orders");
|
||||
const direction = req.query.direction ? req.query.direction : "ASC";
|
||||
const page = req.query.page ? parseInt(req.query.page) : 1;
|
||||
const limit = req.query.limit ? parseInt(req.query.limit) : 10;
|
||||
const offset = (page - 1) * limit;
|
||||
let order_by = req.query.order_by ? req.query.order_by : viewModel.get_field_column()[0];
|
||||
let orderAssociations = [];
|
||||
viewModel.set_order_by(order_by);
|
||||
let joins = order_by.includes(".") ? order_by.split(".") : [];
|
||||
order_by = order_by.includes(".") ? joins[joins.length - 1] : order_by;
|
||||
if (joins.length > 0) {
|
||||
for (let i = joins.length - 1; i > 0; i--) {
|
||||
orderAssociations.push(`${joins[i - 1]}`);
|
||||
}
|
||||
}
|
||||
|
||||
viewModel.set_id(req.query.id ? req.query.id : "");
|
||||
viewModel.set_customer_shopify_id(req.query.customer_shopify_id ? req.query.customer_shopify_id : "");
|
||||
viewModel.set_shopify_id(req.query.shopify_id ? req.query.shopify_id : "");
|
||||
viewModel.set_financial_status(req.query.financial_status ? req.query.financial_status : "");
|
||||
viewModel.set_fulfillment_status(req.query.fulfillment_status ? req.query.fulfillment_status : "");
|
||||
|
||||
let where = helpers.filterEmptyFields({
|
||||
id: viewModel.get_id(),
|
||||
customer_shopify_id: viewModel.get_customer_shopify_id(),
|
||||
shopify_id: viewModel.get_shopify_id(),
|
||||
financial_status: viewModel.get_financial_status(),
|
||||
fulfillment_status: viewModel.get_fulfillment_status(),
|
||||
});
|
||||
|
||||
let include = [];
|
||||
|
||||
const { rows: allItems, count } = await db.order.findAndCountAll({
|
||||
where: where,
|
||||
limit: limit == 0 ? null : limit,
|
||||
offset: offset,
|
||||
include: include,
|
||||
distinct: true,
|
||||
});
|
||||
|
||||
const response = {
|
||||
items: allItems,
|
||||
page,
|
||||
nextPage: count > offset + limit ? page + 1 : false,
|
||||
retrievedCount: allItems.length,
|
||||
fullCount: count,
|
||||
};
|
||||
|
||||
return res.status(201).json({ success: true, data: response });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/v1/api/order/customer", async function (req, res, next) {
|
||||
try {
|
||||
const { id } = req.query;
|
||||
console.log(id);
|
||||
if (!id) {
|
||||
return res.status(400).json({ success: false, message: "Id not valid." });
|
||||
}
|
||||
const orders = await db.order.findAll({ where: { customer_shopify_id: id }, order: [["updated_at", "DESC"]] });
|
||||
console.log(orders);
|
||||
if (!orders || !orders.length) return res.status(404).json({ success: false, message: "Customer doesn't have any orders." });
|
||||
const answers = orders[0].answers ? JSON.parse(orders[0].answers) : [];
|
||||
|
||||
return res.status(201).json({ success: true, data: answers });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = app;
|
||||
@@ -0,0 +1,358 @@
|
||||
"use strict";
|
||||
|
||||
const app = require("express").Router();
|
||||
// const Sequelize = require("sequelize");
|
||||
// const logger = require("../../services/LoggingService");
|
||||
// let pagination = require("../../services/PaginationService");
|
||||
// let JwtService = require("../../services/JwtService");
|
||||
let SessionService = require("../../services/SessionService");
|
||||
const ValidationService = require("../../services/ValidationService");
|
||||
// const PermissionService = require("../../services/PermissionService");
|
||||
// const UploadService = require("../../services/UploadService");
|
||||
// const AuthService = require("../../services/AuthService");
|
||||
const db = require("../../models");
|
||||
const helpers = require("../../core/helpers");
|
||||
|
||||
const role = 1;
|
||||
|
||||
app.get("/admin/output-variables/:num", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
try {
|
||||
let session = req.session;
|
||||
let paginateListViewModel = require("../../view_models/output_variables_admin_list_paginate_view_model");
|
||||
|
||||
var viewModel = new paginateListViewModel(db.output_variable, "Output variables", session.success, session.error, "/admin/output-variables");
|
||||
|
||||
const format = req.query.format ? req.query.format : "view";
|
||||
const direction = req.query.direction ? req.query.direction : "ASC";
|
||||
const per_page = req.query.per_page ? req.query.per_page : 10;
|
||||
let order_by = req.query.order_by ? req.query.order_by : viewModel.get_field_column()[0];
|
||||
let orderAssociations = [];
|
||||
viewModel.set_order_by(order_by);
|
||||
let joins = order_by.includes(".") ? order_by.split(".") : [];
|
||||
order_by = order_by.includes(".") ? joins[joins.length - 1] : order_by;
|
||||
if (joins.length > 0) {
|
||||
for (let i = joins.length - 1; i > 0; i--) {
|
||||
orderAssociations.push(`${joins[i - 1]}`);
|
||||
}
|
||||
}
|
||||
// Check for flash messages
|
||||
const flashMessageSuccess = req.flash("success");
|
||||
if (flashMessageSuccess && flashMessageSuccess.length > 0) {
|
||||
viewModel.success = flashMessageSuccess[0];
|
||||
}
|
||||
const flashMessageError = req.flash("error");
|
||||
if (flashMessageError && flashMessageError.length > 0) {
|
||||
viewModel.error = flashMessageError[0];
|
||||
}
|
||||
|
||||
viewModel.set_id(req.query.id ? req.query.id : "");
|
||||
viewModel.set_name(req.query.name ? req.query.name : "");
|
||||
|
||||
let where = helpers.filterEmptyFields({
|
||||
id: viewModel.get_id(),
|
||||
name: viewModel.get_name(),
|
||||
});
|
||||
|
||||
const count = await db.output_variable._count(where, []);
|
||||
|
||||
viewModel.set_total_rows(count);
|
||||
viewModel.set_per_page(+per_page);
|
||||
viewModel.set_page(+req.params.num);
|
||||
viewModel.set_query(req.query);
|
||||
viewModel.set_sort_base_url(`/admin/output-variables/${+req.params.num}`);
|
||||
viewModel.set_sort(direction);
|
||||
|
||||
const list = await db.output_variable.getPaginated(viewModel.get_page() - 1 < 0 ? 0 : viewModel.get_page(), viewModel.get_per_page(), where, order_by, direction, orderAssociations);
|
||||
for (const item of list) {
|
||||
if (item.active_list) {
|
||||
const actives = await db.active.findAll({
|
||||
where: {
|
||||
id: JSON.parse(item.active_list),
|
||||
},
|
||||
});
|
||||
item.active_list = actives.map((active) => {
|
||||
return { name: active.name, id: active.id };
|
||||
});
|
||||
}
|
||||
}
|
||||
viewModel.set_list(list);
|
||||
|
||||
if (format == "csv") {
|
||||
const csv = viewModel.to_csv();
|
||||
return res
|
||||
.set({
|
||||
"Content-Type": "text/csv",
|
||||
"Content-Disposition": 'attachment; filename="export.csv"',
|
||||
})
|
||||
.send(csv);
|
||||
}
|
||||
|
||||
// if (format != 'view') {
|
||||
// res.json(viewModel.to_json());
|
||||
// } else {
|
||||
// }
|
||||
|
||||
return res.render("admin/Output_variables", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Output_variables", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/admin/output-variables-add", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
|
||||
const outputVariablesAdminAddViewModel = require("../../view_models/output_variables_admin_add_view_model");
|
||||
|
||||
const viewModel = new outputVariablesAdminAddViewModel(db.output_variable, "Add output variable", "", "", "/admin/output-variables");
|
||||
viewModel.actives = await db.active.getAll();
|
||||
res.render("admin/Add_Output_variables", viewModel);
|
||||
});
|
||||
|
||||
app.post(
|
||||
"/admin/output-variables-add",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
ValidationService.validateInput({ name: "required", active_list: "required" }, { "name.required": "Name is required", "active_list.required": "ActiveList is required" }),
|
||||
async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const outputVariablesAdminAddViewModel = require("../../view_models/output_variables_admin_add_view_model");
|
||||
|
||||
const viewModel = new outputVariablesAdminAddViewModel(db.output_variable, "Add output variable", "", "", "/admin/output-variables");
|
||||
viewModel.actives = await db.active.getAll();
|
||||
|
||||
const { name, active_list, ranges, responses } = req.body;
|
||||
let ranges_response = [],
|
||||
i = 0;
|
||||
if (Array.isArray(ranges) && Array.isArray(responses)) {
|
||||
for (const range of ranges) {
|
||||
let tempObj = {};
|
||||
tempObj[range] = responses[i];
|
||||
ranges_response.push(tempObj);
|
||||
i++;
|
||||
}
|
||||
} else {
|
||||
ranges_response.push({
|
||||
[ranges]: responses,
|
||||
});
|
||||
}
|
||||
viewModel.form_fields = {
|
||||
...viewModel.form_fields,
|
||||
name,
|
||||
active_list,
|
||||
ranges_response,
|
||||
};
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
viewModel.error = req.validationError;
|
||||
return res.render("admin/Add_Output_variables", viewModel);
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
const data = await db.output_variable.insert({ name, active_list: JSON.stringify(active_list), ranges_response: JSON.stringify(ranges_response) });
|
||||
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Add_Output_variables", viewModel);
|
||||
}
|
||||
|
||||
req.flash("success", "Output variable created successfully");
|
||||
return res.redirect("/admin/output-variables/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Add_Output_variables", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get("/admin/output-variables-edit/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const outputVariablesAdminEditViewModel = require("../../view_models/output_variables_admin_edit_view_model");
|
||||
|
||||
const viewModel = new outputVariablesAdminEditViewModel(db.output_variable, "Edit output variable", "", "", "/admin/output-variables");
|
||||
|
||||
try {
|
||||
const exists = await db.output_variable.getByPK(id);
|
||||
|
||||
if (!exists) {
|
||||
req.flash("error", "Output variable not found");
|
||||
return res.redirect("/admin/output-variables/0");
|
||||
}
|
||||
|
||||
viewModel.outputVariable = exists;
|
||||
viewModel.actives = await db.active.getAll();
|
||||
return res.render("admin/Edit_Output_variables", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Edit_Output_variables", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.post(
|
||||
"/admin/output-variables-edit/:id",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
ValidationService.validateInput({ name: "required" }, { "name.required": "Name is required" }),
|
||||
async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
|
||||
const outputVariablesAdminEditViewModel = require("../../view_models/output_variables_admin_edit_view_model");
|
||||
|
||||
const viewModel = new outputVariablesAdminEditViewModel(db.output_variable, "Edit output variable", "", "", "/admin/output-variables");
|
||||
|
||||
const { name, active_list, ranges, responses } = req.body;
|
||||
let ranges_response = [],
|
||||
i = 0;
|
||||
|
||||
if (Array.isArray(ranges) && Array.isArray(responses)) {
|
||||
for (const range of ranges) {
|
||||
let tempObj = {};
|
||||
tempObj[range] = responses[i];
|
||||
ranges_response.push(tempObj);
|
||||
i++;
|
||||
}
|
||||
} else {
|
||||
ranges_response.push({
|
||||
[ranges]: responses,
|
||||
});
|
||||
}
|
||||
ranges_response = JSON.stringify(ranges_response);
|
||||
viewModel.form_fields = {
|
||||
...viewModel.form_fields,
|
||||
name,
|
||||
active_list,
|
||||
ranges_response,
|
||||
};
|
||||
delete viewModel.form_fields.id;
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
viewModel.error = req.validationError;
|
||||
return res.render("admin/Edit_Output_variables", viewModel);
|
||||
}
|
||||
|
||||
const resourceExists = await db.output_variable.getByPK(id);
|
||||
if (!resourceExists) {
|
||||
req.flash("error", "Output variable not found");
|
||||
return res.redirect("/admin/output-variables/0");
|
||||
}
|
||||
|
||||
viewModel.outputVariable = resourceExists;
|
||||
viewModel.session = req.session;
|
||||
|
||||
let data = await db.output_variable.edit(
|
||||
{
|
||||
name,
|
||||
active_list: active_list ? JSON.stringify(active_list) : null,
|
||||
// active_list,
|
||||
ranges_response,
|
||||
},
|
||||
id
|
||||
);
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Edit_Output_variables", viewModel);
|
||||
}
|
||||
|
||||
req.flash("success", "Output variable edited successfully");
|
||||
|
||||
return res.redirect("/admin/output-variables/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Edit_Output_variables", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get(
|
||||
"/admin/output-variables-view/:id",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
|
||||
async function (req, res, next) {
|
||||
try {
|
||||
let id = req.params.id;
|
||||
|
||||
const outputVariablesAdminDetailViewModel = require("../../view_models/output_variables_admin_detail_view_model");
|
||||
|
||||
var viewModel = new outputVariablesAdminDetailViewModel(db.output_variable, "Output variable details", "", "", "/admin/output-variables");
|
||||
|
||||
const data = await db.output_variable.getByPK(id);
|
||||
|
||||
if (data.active_list) {
|
||||
const actives = await db.active.findAll({
|
||||
where: {
|
||||
id: JSON.parse(data.active_list),
|
||||
},
|
||||
});
|
||||
data.active_list = actives.map((active) => {
|
||||
return { name: active.name, id: active.id };
|
||||
});
|
||||
}
|
||||
|
||||
if (!data) {
|
||||
viewModel.error = "Output variable not found";
|
||||
viewModel.detail_fields = { ...viewModel.detail_fields, id: "N/A", name: "N/A", active_list: "N/A", ranges_response: "N/A" };
|
||||
} else {
|
||||
viewModel.detail_fields = {
|
||||
...viewModel.detail_fields,
|
||||
id: data["id"] || "N/A",
|
||||
name: data["name"] || "N/A",
|
||||
active_list: data["active_list"] || "N/A",
|
||||
ranges_response: data["ranges_response"] || "N/A",
|
||||
};
|
||||
}
|
||||
|
||||
res.render("admin/View_Output_variables", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
viewModel.detail_fields = { ...viewModel.detail_fields, id: "N/A", name: "N/A", active_list: "N/A", ranges_response: "N/A" };
|
||||
res.render("admin/View_Output_variables", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get("/admin/output-variables-delete/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
|
||||
const outputVariablesAdminDeleteViewModel = require("../../view_models/output_variables_admin_delete_view_model");
|
||||
|
||||
const viewModel = new outputVariablesAdminDeleteViewModel(db.output_variable);
|
||||
|
||||
try {
|
||||
const exists = await db.output_variable.getByPK(id);
|
||||
|
||||
if (!exists) {
|
||||
req.flash("error", "Output variable not found");
|
||||
return res.redirect("/admin/output-variables/0");
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
await db.output_variable.realDelete(id);
|
||||
|
||||
req.flash("success", "Output variable was deleted successfully");
|
||||
|
||||
return res.redirect("/admin/output-variables/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
req.flash("error", error.message || "Something went wrong");
|
||||
return res.redirect("/admin/output-variables/0");
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = app;
|
||||
@@ -0,0 +1,624 @@
|
||||
"use strict";
|
||||
|
||||
const app = require("express").Router();
|
||||
const Sequelize = require("sequelize");
|
||||
const logger = require("../../services/LoggingService");
|
||||
let pagination = require("../../services/PaginationService");
|
||||
let SessionService = require("../../services/SessionService");
|
||||
let JwtService = require("../../services/JwtService");
|
||||
const ValidationService = require("../../services/ValidationService");
|
||||
const PermissionService = require("../../services/PermissionService");
|
||||
const UploadService = require("../../services/UploadService");
|
||||
const AuthService = require("../../services/AuthService");
|
||||
const db = require("../../models");
|
||||
const helpers = require("../../core/helpers");
|
||||
|
||||
const role = 1;
|
||||
|
||||
app.get("/admin/questions/:num", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
try {
|
||||
let session = req.session;
|
||||
let paginateListViewModel = require("../../view_models/questions_admin_list_paginate_view_model");
|
||||
|
||||
var viewModel = new paginateListViewModel(db.question, "Questiones", session.success, session.error, "/admin/questions");
|
||||
|
||||
const format = req.query.format ? req.query.format : "view";
|
||||
const direction = req.query.direction ? req.query.direction : "ASC";
|
||||
const per_page = req.query.per_page ? req.query.per_page : 10;
|
||||
// req.query.order_by ? req.query.order_by :
|
||||
let order_by = [
|
||||
["quiz_id", direction],
|
||||
["order", direction],
|
||||
];
|
||||
// Check for flash messages
|
||||
const flashMessageSuccess = req.flash("success");
|
||||
if (flashMessageSuccess && flashMessageSuccess.length > 0) {
|
||||
viewModel.success = flashMessageSuccess[0];
|
||||
}
|
||||
const flashMessageError = req.flash("error");
|
||||
if (flashMessageError && flashMessageError.length > 0) {
|
||||
viewModel.error = flashMessageError[0];
|
||||
}
|
||||
|
||||
viewModel.set_id(req.query.id ? req.query.id : "");
|
||||
viewModel.set_quiz_id(req.query.quiz_id ? req.query.quiz_id : "");
|
||||
viewModel.set_type(req.query.type ? req.query.type : "");
|
||||
|
||||
let where = helpers.filterEmptyFields({
|
||||
id: viewModel.get_id(),
|
||||
quiz_id: viewModel.get_quiz_id(),
|
||||
type: viewModel.get_type(),
|
||||
});
|
||||
|
||||
const count = await db.question._count(where, [
|
||||
{ model: db.quiz, as: "quiz", required: true },
|
||||
{ model: db.answer, as: "answers", required: false },
|
||||
]);
|
||||
|
||||
viewModel.set_total_rows(count);
|
||||
viewModel.set_per_page(+per_page);
|
||||
viewModel.set_page(+req.params.num);
|
||||
viewModel.set_query(req.query);
|
||||
viewModel.set_sort_base_url(`/admin/questions/${+req.params.num}`);
|
||||
viewModel.set_sort(direction);
|
||||
|
||||
const list = await db.question.getPaginatedV2(viewModel.get_page() - 1 < 0 ? 0 : viewModel.get_page(), viewModel.get_per_page(), where, order_by, direction, [
|
||||
{ model: db.quiz, as: "quiz", required: true },
|
||||
{ model: db.answer, as: "answers", required: false },
|
||||
]);
|
||||
|
||||
viewModel.set_list(list);
|
||||
|
||||
viewModel.quiz = await db.quiz;
|
||||
|
||||
if (format == "csv") {
|
||||
const csv = viewModel.to_csv();
|
||||
return res
|
||||
.set({
|
||||
"Content-Type": "text/csv",
|
||||
"Content-Disposition": 'attachment; filename="export.csv"',
|
||||
})
|
||||
.send(csv);
|
||||
}
|
||||
return res.render("admin/Questions", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Questions", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/admin/questions-add", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
|
||||
const questionsAdminAddViewModel = require("../../view_models/questions_admin_add_view_model");
|
||||
|
||||
const viewModel = new questionsAdminAddViewModel(db.question, "Add question", "", "", "/admin/questions");
|
||||
viewModel.quizzes = await db.quiz.getAll();
|
||||
for (const quiz of viewModel.quizzes) {
|
||||
const question = await db.question.findAll({
|
||||
where: {
|
||||
quiz_id: quiz.id,
|
||||
},
|
||||
limit: 1,
|
||||
order: [["order", "DESC"]],
|
||||
});
|
||||
quiz.lastOrder = question[0].order;
|
||||
}
|
||||
viewModel.questions = await db.question.getAll();
|
||||
viewModel.outputVariables = await db.output_variable.getAll();
|
||||
res.render("admin/Add_Questions", viewModel);
|
||||
});
|
||||
|
||||
app.post(
|
||||
"/admin/questions-add",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
ValidationService.validateInput(
|
||||
{ quiz_id: "required", question: "required", type: "required", order: "required" },
|
||||
{
|
||||
"quiz_id.required": "QuizId is required",
|
||||
"question.required": "Question is required",
|
||||
"type.required": "Type is required",
|
||||
"order.required": "Order is required",
|
||||
}
|
||||
),
|
||||
async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const questionsAdminAddViewModel = require("../../view_models/questions_admin_add_view_model");
|
||||
|
||||
const viewModel = new questionsAdminAddViewModel(db.question, "Add question", "", "", "/admin/questions");
|
||||
viewModel.quizzes = await db.quiz.getAll();
|
||||
viewModel.questions = await db.question.getAll();
|
||||
viewModel.outputVariables = await db.output_variable.getAll();
|
||||
|
||||
// TODO use separate controller for image upload
|
||||
// {{{upload_field_setter}}}
|
||||
|
||||
const { quiz_id, question, order, image_width, image_height, note, note_type, depends_on, slider_range, output_variable_name, weight, extra_output_variable, type } = req.body;
|
||||
|
||||
viewModel.form_fields = {
|
||||
...viewModel.form_fields,
|
||||
quiz_id,
|
||||
question,
|
||||
order,
|
||||
note,
|
||||
image_width,
|
||||
image_height,
|
||||
note_type,
|
||||
depends_on,
|
||||
slider_range,
|
||||
output_variable_name,
|
||||
weight,
|
||||
extra_output_variable,
|
||||
type,
|
||||
};
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
viewModel.error = req.validationError;
|
||||
return res.render("admin/Add_Questions", viewModel);
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
const data = await db.question.insert({
|
||||
quiz_id,
|
||||
question,
|
||||
order,
|
||||
image_width: image_width ? image_width : null,
|
||||
image_height: image_height ? image_height : null,
|
||||
note: note ? note : null,
|
||||
note_type: note_type ? note_type : null,
|
||||
depends_on: depends_on ? depends_on : null,
|
||||
slider_range: slider_range ? slider_range : null,
|
||||
output_variable_name: output_variable_name ? output_variable_name : null,
|
||||
weight: weight ? weight : null,
|
||||
extra_output_variable: extra_output_variable ? extra_output_variable : null,
|
||||
type,
|
||||
});
|
||||
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Add_Questions", viewModel);
|
||||
}
|
||||
|
||||
req.flash("success", "Question created successfully");
|
||||
return res.redirect("/admin/questions/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Add_Questions", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get("/admin/questions-edit/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const questionsAdminEditViewModel = require("../../view_models/questions_admin_edit_view_model");
|
||||
|
||||
const viewModel = new questionsAdminEditViewModel(db.question, "Edit question", "", "", "/admin/questions");
|
||||
const flashMessageSuccess = req.flash("success");
|
||||
if (flashMessageSuccess && flashMessageSuccess.length > 0) {
|
||||
viewModel.success = flashMessageSuccess[0];
|
||||
}
|
||||
const flashMessageError = req.flash("error");
|
||||
if (flashMessageError && flashMessageError.length > 0) {
|
||||
viewModel.error = flashMessageError[0];
|
||||
}
|
||||
try {
|
||||
const exists = await db.question.findOne({
|
||||
where: { id },
|
||||
order: [["answers", "order", "ASC"]],
|
||||
include: [{ model: db.answer, as: "answers", include: [{ model: db.image, as: "image" }] }],
|
||||
});
|
||||
|
||||
if (!exists) {
|
||||
req.flash("error", "Question not found");
|
||||
return res.redirect("/admin/questions/0");
|
||||
}
|
||||
const values = exists;
|
||||
Object.keys(viewModel.form_fields).forEach((field) => {
|
||||
viewModel.form_fields[field] = values[field] || "";
|
||||
});
|
||||
viewModel.question = exists;
|
||||
viewModel.quiz = db.quiz;
|
||||
viewModel.quizzes = await db.quiz.getAll();
|
||||
viewModel.questions = await db.question.getAll();
|
||||
viewModel.outputVariables = await db.output_variable.getAll();
|
||||
viewModel.actives = await db.active.getAll();
|
||||
viewModel.nextQuestionId;
|
||||
let lastQuestionId = await db.question.findAll({ order_by: ["id", "DESC"] }).then((data) => data[0].id);
|
||||
let found = false;
|
||||
let nextId = parseInt(exists.id) + 1;
|
||||
while (!found) {
|
||||
const nextQuestion = await db.question.getByPK(nextId);
|
||||
if (nextQuestion) {
|
||||
viewModel.nextQuestionId = nextQuestion.id;
|
||||
found = true;
|
||||
} else {
|
||||
if (nextId >= lastQuestionId) break;
|
||||
}
|
||||
nextId++;
|
||||
}
|
||||
//remaining actives unselected
|
||||
if (exists.answers && exists.answers?.length > 0) {
|
||||
viewModel.lastOrderCount = exists.answers[exists.answers.length - 1].order;
|
||||
}
|
||||
|
||||
return res.render("admin/Edit_Questions", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Edit_Questions", viewModel);
|
||||
}
|
||||
});
|
||||
app.get("/admin/answers/refill/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
try {
|
||||
const actives = await db.active.getAll();
|
||||
await db.answer.destroy({ where: { question_id: id } });
|
||||
|
||||
await db.answer.insert({
|
||||
question_id: id,
|
||||
order: 1,
|
||||
answer: "Banana",
|
||||
});
|
||||
await db.answer.insert({
|
||||
question_id: id,
|
||||
order: 2,
|
||||
answer: "Olive",
|
||||
});
|
||||
await db.answer.insert({
|
||||
question_id: id,
|
||||
order: 3,
|
||||
answer: "Sunflowers",
|
||||
});
|
||||
|
||||
let order = 3;
|
||||
for (const active of actives) {
|
||||
if (active.name !== "Blank") {
|
||||
await db.answer.insert({
|
||||
question_id: id,
|
||||
order: order + 1,
|
||||
answer: active.name,
|
||||
});
|
||||
}
|
||||
order++;
|
||||
}
|
||||
req.flash("success", "Answers refilled successfully");
|
||||
return res.redirect("/admin/questions-edit/" + id);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
req.flash("error", error.message || "Something went wrong");
|
||||
return res.redirect("/admin/questions-edit/" + id);
|
||||
}
|
||||
});
|
||||
|
||||
app.post(
|
||||
"/admin/questions-edit/:id",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
ValidationService.validateInput(
|
||||
{ quiz_id: "required", question: "required", type: "required", question_order: "required" },
|
||||
{
|
||||
"quiz_id.required": "QuizId is required",
|
||||
"question.required": "Question is required",
|
||||
"type.required": "Type is required",
|
||||
"question_order.required": "Order is required",
|
||||
}
|
||||
),
|
||||
async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
|
||||
const questionsAdminEditViewModel = require("../../view_models/questions_admin_edit_view_model");
|
||||
|
||||
const viewModel = new questionsAdminEditViewModel(db.question, "Edit question", "", "", "/admin/questions");
|
||||
viewModel.quizzes = await db.quiz.getAll();
|
||||
viewModel.questions = await db.question.getAll();
|
||||
viewModel.outputVariables = await db.output_variable.getAll();
|
||||
viewModel.nextQuestionId;
|
||||
let lastQuestionId = await db.question.findAll({ order_by: ["id", "DESC"] }).then((data) => data[0].id);
|
||||
let found = false;
|
||||
let nextId = parseInt(id) + 1;
|
||||
while (!found) {
|
||||
const nextQuestion = await db.question.getByPK(nextId);
|
||||
if (nextQuestion) {
|
||||
viewModel.nextQuestionId = nextQuestion.id;
|
||||
found = true;
|
||||
} else {
|
||||
if (nextId >= lastQuestionId) break;
|
||||
}
|
||||
nextId++;
|
||||
}
|
||||
|
||||
const { quiz_id, question, question_order, note, image_width, image_height, note_type, depends_on, slider_range, output_variable_name, weight, extra_output_variable, type } = req.body;
|
||||
const { ids, answer, answer_value, hide_answer, explaination, image_id, response_header, response_body } = req.body;
|
||||
|
||||
viewModel.form_fields = {
|
||||
...viewModel.form_fields,
|
||||
quiz_id,
|
||||
question,
|
||||
order: question_order,
|
||||
note,
|
||||
image_width,
|
||||
image_height,
|
||||
note_type,
|
||||
depends_on,
|
||||
slider_range,
|
||||
output_variable_name,
|
||||
weight,
|
||||
extra_output_variable,
|
||||
type,
|
||||
};
|
||||
|
||||
delete viewModel.form_fields.id;
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
console.error(error);
|
||||
req.flash("error", req.validationError);
|
||||
return res.redirect(`/admin/questions-edit/${id}`);
|
||||
}
|
||||
|
||||
const resourceExists = await db.question.getByPK(id);
|
||||
if (!resourceExists) {
|
||||
req.flash("error", "Question not found");
|
||||
return res.redirect(`/admin/questions-edit/${id}`);
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
await db.question.edit(
|
||||
{
|
||||
quiz_id,
|
||||
question,
|
||||
question_order,
|
||||
type,
|
||||
image_width: image_width ? image_width : null,
|
||||
image_height: image_height ? image_height : null,
|
||||
note: note ? note : null,
|
||||
note_type: note_type ? note_type : null,
|
||||
depends_on: depends_on ? depends_on : null,
|
||||
slider_range: slider_range ? slider_range : null,
|
||||
output_variable_name: output_variable_name ? output_variable_name : null,
|
||||
weight: weight ? weight : null,
|
||||
extra_output_variable: extra_output_variable ? extra_output_variable : null,
|
||||
},
|
||||
id
|
||||
);
|
||||
if (Array.isArray(ids) && ids.length) {
|
||||
for (let i = 0; i < ids.length; i++) {
|
||||
await db.answer.edit(
|
||||
{
|
||||
answer: answer[i] ? answer[i] : null,
|
||||
answer_value: answer_value[i] ? answer_value[i] : null,
|
||||
hide_answer: hide_answer[i] ? hide_answer[i] : null,
|
||||
order: i + 1,
|
||||
explaination: explaination[i] ? explaination[i] : null,
|
||||
image_id: image_id[i] ? image_id[i] : null,
|
||||
response_header: response_header[i] ? response_header[i] : null,
|
||||
response_body: response_body[i] ? response_body[i] : null,
|
||||
black_list_actives: req.body[`black_list_actives_${ids[i]}`]
|
||||
? !Array.isArray(req.body[`black_list_actives_${ids[i]}`])
|
||||
? JSON.stringify([req.body[`black_list_actives_${ids[i]}`]])
|
||||
: JSON.stringify(req.body[`black_list_actives_${ids[i]}`])
|
||||
: null,
|
||||
},
|
||||
ids[i]
|
||||
);
|
||||
}
|
||||
} else if (!Array.isArray(ids) && ids) {
|
||||
await db.answer.edit(
|
||||
{
|
||||
answer: answer ? answer : null,
|
||||
answer_value: answer_value ? answer_value : null,
|
||||
hide_answer: hide_answer ? hide_answer : null,
|
||||
order: 1,
|
||||
explaination: explaination ? explaination : null,
|
||||
image_id: image_id ? image_id : null,
|
||||
response_header: response_header ? response_header : null,
|
||||
response_body: response_body ? response_body : null,
|
||||
black_list_actives: req.body[`black_list_actives_${ids}`]
|
||||
? !Array.isArray(req.body[`black_list_actives_${ids}`])
|
||||
? JSON.stringify([req.body[`black_list_actives_${ids}`]])
|
||||
: JSON.stringify(req.body[`black_list_actives_${ids}`])
|
||||
: null,
|
||||
},
|
||||
ids
|
||||
);
|
||||
}
|
||||
|
||||
req.flash("success", "Question edited successfully");
|
||||
return res.redirect(`/admin/questions-edit/${id}`);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
req.flash("error", error.message || "Something went wrong");
|
||||
return res.redirect(`/admin/questions-edit/${id}`);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get(
|
||||
"/admin/questions-view/:id",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
|
||||
async function (req, res, next) {
|
||||
try {
|
||||
let id = req.params.id;
|
||||
|
||||
const questionsAdminDetailViewModel = require("../../view_models/questions_admin_detail_view_model");
|
||||
|
||||
var viewModel = new questionsAdminDetailViewModel(db.question, "Question details", "", "", "/admin/questions");
|
||||
|
||||
const data = await db.question.get_question_quiz(id, db);
|
||||
data.type = db.question.type_mapping()[data.type];
|
||||
data.target = db.question.target_mapping()[data.target];
|
||||
data.note_type = db.question.note_type_mapping()[data.note_type];
|
||||
|
||||
if (!data) {
|
||||
viewModel.error = "Question not found";
|
||||
viewModel.detail_fields = {
|
||||
...viewModel.detail_fields,
|
||||
id: "N/A",
|
||||
"quiz.name": "N/A",
|
||||
question: "N/A",
|
||||
question_arguments: "N/A",
|
||||
order: "N/A",
|
||||
note: "N/A",
|
||||
note_type: "N/A",
|
||||
target: "N/A",
|
||||
response: "N/A",
|
||||
save_response_into: "N/A",
|
||||
depends_on: "N/A",
|
||||
slider_range: "N/A",
|
||||
output_variable_name: "N/A",
|
||||
weight: "N/A",
|
||||
extra_output_variable: "N/A",
|
||||
type: "N/A",
|
||||
};
|
||||
} else {
|
||||
viewModel.detail_fields = {
|
||||
...viewModel.detail_fields,
|
||||
id: data["id"] || "N/A",
|
||||
"quiz.name": data["quiz"]["name"] || "N/A",
|
||||
question: data["question"] || "N/A",
|
||||
question_arguments: data["question_arguments"] || "N/A",
|
||||
order: data["order"] || "N/A",
|
||||
note: data["note"] || "N/A",
|
||||
note_type: data["note_type"] || "N/A",
|
||||
target: data["target"] || "N/A",
|
||||
response: data["response"] || "N/A",
|
||||
save_response_into: data["save_response_into"] || "N/A",
|
||||
depends_on: data["depends_on"] || "N/A",
|
||||
slider_range: data["slider_range"] || "N/A",
|
||||
output_variable_name: data["output_variable_name"] || "N/A",
|
||||
weight: data["weight"] || "N/A",
|
||||
extra_output_variable: data["extra_output_variable"] || "N/A",
|
||||
type: data["type"] || "N/A",
|
||||
};
|
||||
}
|
||||
|
||||
res.render("admin/View_Questions", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
viewModel.detail_fields = {
|
||||
...viewModel.detail_fields,
|
||||
id: "N/A",
|
||||
"quiz.name": "N/A",
|
||||
question: "N/A",
|
||||
question_arguments: "N/A",
|
||||
order: "N/A",
|
||||
note: "N/A",
|
||||
note_type: "N/A",
|
||||
target: "N/A",
|
||||
response: "N/A",
|
||||
save_response_into: "N/A",
|
||||
depends_on: "N/A",
|
||||
slider_range: "N/A",
|
||||
output_variable_name: "N/A",
|
||||
weight: "N/A",
|
||||
extra_output_variable: "N/A",
|
||||
type: "N/A",
|
||||
};
|
||||
res.render("admin/View_Questions", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get("/admin/questions-delete/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
|
||||
const questionsAdminDeleteViewModel = require("../../view_models/questions_admin_delete_view_model");
|
||||
|
||||
const viewModel = new questionsAdminDeleteViewModel(db.question);
|
||||
|
||||
try {
|
||||
const exists = await db.question.getByPK(id);
|
||||
|
||||
if (!exists) {
|
||||
req.flash("error", "Question not found");
|
||||
return res.redirect("/admin/questions/0");
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
await db.question.realDelete(id);
|
||||
await db.answer.destroy({
|
||||
where: { question_id: id },
|
||||
});
|
||||
req.flash("success", "Question was deleted successfully");
|
||||
|
||||
return res.redirect("/admin/questions/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
req.flash("error", error.message || "Something went wrong");
|
||||
return res.redirect("/admin/questions/0");
|
||||
}
|
||||
});
|
||||
|
||||
// APIS
|
||||
|
||||
app.get("/admin/api/questions", async function (req, res, next) {
|
||||
try {
|
||||
const session = req.session;
|
||||
let listViewModel = require("../../view_models/questions_admin_list_paginate_view_model");
|
||||
let viewModel = new listViewModel(db.question, "Questiones", session.success, session.error, "/admin/questions");
|
||||
const direction = req.query.direction ? req.query.direction : "ASC";
|
||||
const page = req.query.page ? parseInt(req.query.page) : 1;
|
||||
const limit = req.query.limit ? parseInt(req.query.limit) : 10;
|
||||
const offset = (page - 1) * limit;
|
||||
let order_by = req.query.order_by ? req.query.order_by : viewModel.get_field_column()[0];
|
||||
let orderAssociations = [];
|
||||
viewModel.set_order_by(order_by);
|
||||
let joins = order_by.includes(".") ? order_by.split(".") : [];
|
||||
order_by = order_by.includes(".") ? joins[joins.length - 1] : order_by;
|
||||
if (joins.length > 0) {
|
||||
for (let i = joins.length - 1; i > 0; i--) {
|
||||
orderAssociations.push(`${joins[i - 1]}`);
|
||||
}
|
||||
}
|
||||
viewModel.set_id(req.query.id ? req.query.id : "");
|
||||
viewModel.set_quiz_id(req.query.quiz_id ? req.query.quiz_id : "");
|
||||
viewModel.set_type(req.query.type ? req.query.type : "");
|
||||
|
||||
let where = helpers.filterEmptyFields({
|
||||
id: viewModel.get_id(),
|
||||
quiz_id: viewModel.get_quiz_id(),
|
||||
type: viewModel.get_type(),
|
||||
});
|
||||
const { rows: allItems, count } = await db.question.findAndCountAll({
|
||||
where: where,
|
||||
limit: limit == 0 ? null : limit,
|
||||
offset: offset,
|
||||
include: { all: true, nested: true },
|
||||
order: [["id", direction]],
|
||||
distinct: true,
|
||||
});
|
||||
|
||||
const response = {
|
||||
items: allItems,
|
||||
page,
|
||||
nextPage: limit == 0 ? false : count > offset + limit ? page + 1 : false,
|
||||
retrievedCount: allItems.length,
|
||||
fullCount: count,
|
||||
};
|
||||
|
||||
return res.status(201).json({ success: true, data: response });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
module.exports = app;
|
||||
@@ -0,0 +1,460 @@
|
||||
"use strict";
|
||||
|
||||
const app = require("express").Router();
|
||||
const Sequelize = require("sequelize");
|
||||
const logger = require("../../services/LoggingService");
|
||||
let pagination = require("../../services/PaginationService");
|
||||
let SessionService = require("../../services/SessionService");
|
||||
let JwtService = require("../../services/JwtService");
|
||||
const ValidationService = require("../../services/ValidationService");
|
||||
const PermissionService = require("../../services/PermissionService");
|
||||
const UploadService = require("../../services/UploadService");
|
||||
const AuthService = require("../../services/AuthService");
|
||||
const db = require("../../models");
|
||||
const helpers = require("../../core/helpers");
|
||||
|
||||
const role = 1;
|
||||
|
||||
app.get("/admin/quizzes/:num", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
try {
|
||||
let session = req.session;
|
||||
let paginateListViewModel = require("../../view_models/quizzes_admin_list_paginate_view_model");
|
||||
|
||||
var viewModel = new paginateListViewModel(db.quiz, "Quizzes", session.success, session.error, "/admin/quizzes");
|
||||
|
||||
const format = req.query.format ? req.query.format : "view";
|
||||
const direction = req.query.direction ? req.query.direction : "ASC";
|
||||
const per_page = req.query.per_page ? req.query.per_page : 10;
|
||||
let order_by = req.query.order_by ? req.query.order_by : viewModel.get_field_column()[0];
|
||||
let orderAssociations = [];
|
||||
viewModel.set_order_by(order_by);
|
||||
let joins = order_by.includes(".") ? order_by.split(".") : [];
|
||||
order_by = order_by.includes(".") ? joins[joins.length - 1] : order_by;
|
||||
if (joins.length > 0) {
|
||||
for (let i = joins.length - 1; i > 0; i--) {
|
||||
orderAssociations.push(`${joins[i - 1]}`);
|
||||
}
|
||||
}
|
||||
// Check for flash messages
|
||||
const flashMessageSuccess = req.flash("success");
|
||||
if (flashMessageSuccess && flashMessageSuccess.length > 0) {
|
||||
viewModel.success = flashMessageSuccess[0];
|
||||
}
|
||||
const flashMessageError = req.flash("error");
|
||||
if (flashMessageError && flashMessageError.length > 0) {
|
||||
viewModel.error = flashMessageError[0];
|
||||
}
|
||||
|
||||
viewModel.set_id(req.query.id ? req.query.id : "");
|
||||
viewModel.set_name(req.query.name ? req.query.name : "");
|
||||
|
||||
let where = helpers.filterEmptyFields({
|
||||
id: viewModel.get_id(),
|
||||
name: viewModel.get_name(),
|
||||
});
|
||||
|
||||
let associatedWhere = helpers.filterEmptyFields({});
|
||||
const isAssociationRequired = Object.keys(associatedWhere).length > 0 ? true : false;
|
||||
|
||||
const count = await db.quiz._count(where, [{ model: db.question, where: associatedWhere, required: isAssociationRequired, as: "questions" }]);
|
||||
|
||||
viewModel.set_total_rows(count);
|
||||
viewModel.set_per_page(+per_page);
|
||||
viewModel.set_page(+req.params.num);
|
||||
viewModel.set_query(req.query);
|
||||
viewModel.set_sort_base_url(`/admin/quizzes/${+req.params.num}`);
|
||||
viewModel.set_sort(direction);
|
||||
|
||||
const list = await db.quiz.get_question_paginated(
|
||||
db,
|
||||
associatedWhere,
|
||||
viewModel.get_page() - 1 < 0 ? 0 : viewModel.get_page(),
|
||||
viewModel.get_per_page(),
|
||||
where,
|
||||
order_by,
|
||||
direction,
|
||||
orderAssociations
|
||||
);
|
||||
|
||||
viewModel.set_list(list);
|
||||
|
||||
viewModel.question = await db.question;
|
||||
|
||||
if (format == "csv") {
|
||||
const csv = viewModel.to_csv();
|
||||
return res
|
||||
.set({
|
||||
"Content-Type": "text/csv",
|
||||
"Content-Disposition": 'attachment; filename="export.csv"',
|
||||
})
|
||||
.send(csv);
|
||||
}
|
||||
|
||||
// if (format != 'view') {
|
||||
// res.json(viewModel.to_json());
|
||||
// } else {
|
||||
// }
|
||||
|
||||
return res.render("admin/Quizzes", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Quizzes", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/admin/quizzes-add", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
|
||||
const quizzesAdminAddViewModel = require("../../view_models/quizzes_admin_add_view_model");
|
||||
|
||||
const viewModel = new quizzesAdminAddViewModel(db.quiz, "Add quiz", "", "", "/admin/quizzes");
|
||||
|
||||
res.render("admin/Add_Quizzes", viewModel);
|
||||
});
|
||||
|
||||
app.post(
|
||||
"/admin/quizzes-add",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
ValidationService.validateInput({ name: "required" }, { "name.required": "Name is required" }),
|
||||
async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const quizzesAdminAddViewModel = require("../../view_models/quizzes_admin_add_view_model");
|
||||
|
||||
const viewModel = new quizzesAdminAddViewModel(db.quiz, "Add quiz", "", "", "/admin/quizzes");
|
||||
|
||||
// TODO use separate controller for image upload
|
||||
// {{{upload_field_setter}}}
|
||||
|
||||
const { name, description } = req.body;
|
||||
|
||||
viewModel.form_fields = {
|
||||
...viewModel.form_fields,
|
||||
name,
|
||||
description,
|
||||
};
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
viewModel.error = req.validationError;
|
||||
return res.render("admin/Add_Quizzes", viewModel);
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
const data = await db.quiz.insert({ name, description });
|
||||
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Add_Quizzes", viewModel);
|
||||
}
|
||||
|
||||
await db.activity_log.insert({
|
||||
action: "ADD",
|
||||
name: "Admin_quiz_controller.js",
|
||||
portal: "admin",
|
||||
data: JSON.stringify({ name, description }),
|
||||
});
|
||||
|
||||
req.flash("success", "Quiz created successfully");
|
||||
return res.redirect("/admin/quizzes/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Add_Quizzes", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get("/admin/quizzes-edit/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const quizzesAdminEditViewModel = require("../../view_models/quizzes_admin_edit_view_model");
|
||||
|
||||
const viewModel = new quizzesAdminEditViewModel(db.quiz, "Edit quiz", "", "", "/admin/quizzes");
|
||||
|
||||
try {
|
||||
const exists = await db.quiz.getByPK(id);
|
||||
|
||||
if (!exists) {
|
||||
req.flash("error", "Quiz not found");
|
||||
return res.redirect("/admin/quizzes/0");
|
||||
}
|
||||
const values = exists;
|
||||
Object.keys(viewModel.form_fields).forEach((field) => {
|
||||
viewModel.form_fields[field] = values[field] || "";
|
||||
});
|
||||
viewModel.question = db.question;
|
||||
return res.render("admin/Edit_Quizzes", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Edit_Quizzes", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.post(
|
||||
"/admin/quizzes-edit/:id",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
ValidationService.validateInput({ name: "required" }, { "name.required": "Name is required" }),
|
||||
async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
|
||||
const quizzesAdminEditViewModel = require("../../view_models/quizzes_admin_edit_view_model");
|
||||
|
||||
const viewModel = new quizzesAdminEditViewModel(db.quiz, "Edit quiz", "", "", "/admin/quizzes");
|
||||
|
||||
const { name, description } = req.body;
|
||||
|
||||
viewModel.form_fields = {
|
||||
...viewModel.form_fields,
|
||||
name,
|
||||
description,
|
||||
};
|
||||
|
||||
delete viewModel.form_fields.id;
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
viewModel.error = req.validationError;
|
||||
return res.render("admin/Edit_Quizzes", viewModel);
|
||||
}
|
||||
|
||||
const resourceExists = await db.quiz.getByPK(id);
|
||||
if (!resourceExists) {
|
||||
req.flash("error", "Quiz not found");
|
||||
return res.redirect("/admin/quizzes/0");
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
let data = await db.quiz.edit({ name, description }, id);
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Edit_Quizzes", viewModel);
|
||||
}
|
||||
|
||||
if (resourceExists.questions) {
|
||||
if (resourceExists.questions.length == 1) {
|
||||
resourceExists.questions.forEach(async (item) => {
|
||||
data = await db.question.edit(helpers.filterEmptyFields({}), item.id);
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Edit_Quizzes", viewModel);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
resourceExists.questions.forEach(async (item, index) => {
|
||||
data = await db.question.edit(helpers.filterEmptyFields({}), item.id);
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Edit_Quizzes", viewModel);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
await db.activity_log.insert({
|
||||
action: "EDIT",
|
||||
name: "Admin_quiz_controller.js",
|
||||
portal: "admin",
|
||||
data: JSON.stringify({ name, description }),
|
||||
});
|
||||
|
||||
req.flash("success", "Quiz edited successfully");
|
||||
|
||||
return res.redirect("/admin/quizzes/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Edit_Quizzes", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get(
|
||||
"/admin/quizzes-view/:id",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
|
||||
async function (req, res, next) {
|
||||
try {
|
||||
let id = req.params.id;
|
||||
|
||||
const quizzesAdminDetailViewModel = require("../../view_models/quizzes_admin_detail_view_model");
|
||||
|
||||
var viewModel = new quizzesAdminDetailViewModel(db.quiz, "Quiz details", "", "", "/admin/quizzes");
|
||||
|
||||
const data = await db.quiz.getByPK(id);
|
||||
|
||||
if (!data) {
|
||||
viewModel.error = "Quiz not found";
|
||||
viewModel.detail_fields = { ...viewModel.detail_fields, id: "N/A", name: "N/A", description: "N/A" };
|
||||
} else {
|
||||
viewModel.detail_fields = {
|
||||
...viewModel.detail_fields,
|
||||
id: data["id"] || "N/A",
|
||||
name: data["name"] || "N/A",
|
||||
description: data["description"] || "N/A",
|
||||
};
|
||||
}
|
||||
|
||||
res.render("admin/View_Quizzes", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
viewModel.detail_fields = { ...viewModel.detail_fields, id: "N/A", name: "N/A", description: "N/A" };
|
||||
res.render("admin/View_Quizzes", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get("/admin/quizzes-delete/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
|
||||
const quizzesAdminDeleteViewModel = require("../../view_models/quizzes_admin_delete_view_model");
|
||||
|
||||
const viewModel = new quizzesAdminDeleteViewModel(db.quiz);
|
||||
|
||||
try {
|
||||
const exists = await db.quiz.getByPK(id);
|
||||
|
||||
if (!exists) {
|
||||
req.flash("error", "Quiz not found");
|
||||
return res.redirect("/admin/quizzes/0");
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
await db.quiz.realDelete(id);
|
||||
await db.question.destroy({
|
||||
where: {
|
||||
quiz_id: id,
|
||||
},
|
||||
});
|
||||
|
||||
await db.activity_log.insert({
|
||||
action: "DELETE",
|
||||
name: "Admin_quiz_controller.js",
|
||||
portal: "admin",
|
||||
data: JSON.stringify(exists),
|
||||
});
|
||||
|
||||
req.flash("success", "Quiz was deleted successfully");
|
||||
|
||||
return res.redirect("/admin/quizzes/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
req.flash("error", error.message || "Something went wrong");
|
||||
return res.redirect("/admin/quizzes/0");
|
||||
}
|
||||
});
|
||||
|
||||
// APIS
|
||||
|
||||
app.get("/admin/api/quizzes", async function (req, res, next) {
|
||||
try {
|
||||
const session = req.session;
|
||||
let listViewModel = require("../../view_models/quizzes_admin_list_paginate_view_model");
|
||||
let viewModel = new listViewModel(db.quiz, "Quizzes", session.success, session.error, "/admin/quizzes");
|
||||
const direction = req.query.direction ? req.query.direction : "ASC";
|
||||
const page = req.query.page ? parseInt(req.query.page) : 1;
|
||||
const limit = req.query.limit ? parseInt(req.query.limit) : 10;
|
||||
const offset = (page - 1) * limit;
|
||||
let order_by = req.query.order_by ? req.query.order_by : viewModel.get_field_column()[0];
|
||||
let orderAssociations = [];
|
||||
viewModel.set_order_by(order_by);
|
||||
let joins = order_by.includes(".") ? order_by.split(".") : [];
|
||||
order_by = order_by.includes(".") ? joins[joins.length - 1] : order_by;
|
||||
if (joins.length > 0) {
|
||||
for (let i = joins.length - 1; i > 0; i--) {
|
||||
orderAssociations.push(`${joins[i - 1]}`);
|
||||
}
|
||||
}
|
||||
|
||||
viewModel.set_id(req.query.id ? req.query.id : "");
|
||||
viewModel.set_name(req.query.name ? req.query.name : "");
|
||||
|
||||
let where = helpers.filterEmptyFields({
|
||||
id: viewModel.get_id(),
|
||||
name: viewModel.get_name(),
|
||||
});
|
||||
|
||||
const { rows: allItems, count } = await db.quiz.findAndCountAll({
|
||||
where: where,
|
||||
limit: limit == 0 ? null : limit,
|
||||
offset: offset,
|
||||
// include: { all: true, nested: true },
|
||||
include: [
|
||||
{
|
||||
model: db.question,
|
||||
as: "questions",
|
||||
order: [["order", "ASC"]],
|
||||
separate: true,
|
||||
required: false,
|
||||
include: [
|
||||
{
|
||||
model: db.answer,
|
||||
as: "answers",
|
||||
required: false,
|
||||
separate: true,
|
||||
order: [["order", "ASC"]],
|
||||
include: [{ model: db.image, as: "image", required: false }],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
order: [["id", direction]],
|
||||
distinct: true,
|
||||
});
|
||||
|
||||
for (const row of allItems) {
|
||||
if (row.questions) {
|
||||
for (const question of row.questions) {
|
||||
if (question.answers) {
|
||||
for (const answer of question.answers) {
|
||||
if (answer.black_list_actives) {
|
||||
const blActivesListIds = JSON.parse(answer.black_list_actives);
|
||||
const blActivesListNames = await db.active
|
||||
.findAll({
|
||||
where: {
|
||||
id: blActivesListIds,
|
||||
},
|
||||
})
|
||||
.then((data) => {
|
||||
return data.map((item) => {
|
||||
item = item.name;
|
||||
return item;
|
||||
});
|
||||
});
|
||||
answer.black_list_actives = JSON.stringify(blActivesListNames);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
const response = {
|
||||
items: allItems,
|
||||
page,
|
||||
nextPage: limit == 0 ? false : count > offset + limit ? page + 1 : false,
|
||||
retrievedCount: allItems.length,
|
||||
fullCount: count,
|
||||
};
|
||||
|
||||
return res.status(201).json({ success: true, data: response });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = app;
|
||||
@@ -0,0 +1,476 @@
|
||||
"use strict";
|
||||
|
||||
const app = require("express").Router();
|
||||
const Sequelize = require("sequelize");
|
||||
const logger = require("../../services/LoggingService");
|
||||
let pagination = require("../../services/PaginationService");
|
||||
let SessionService = require("../../services/SessionService");
|
||||
let JwtService = require("../../services/JwtService");
|
||||
const ValidationService = require("../../services/ValidationService");
|
||||
const PermissionService = require("../../services/PermissionService");
|
||||
const UploadService = require("../../services/UploadService");
|
||||
const AuthService = require("../../services/AuthService");
|
||||
const db = require("../../models");
|
||||
const helpers = require("../../core/helpers");
|
||||
|
||||
const role = 1;
|
||||
|
||||
app.get("/admin/profile-sections/:num", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
try {
|
||||
let session = req.session;
|
||||
let paginateListViewModel = require("../../view_models/result_profile_admin_list_paginate_view_model");
|
||||
|
||||
var viewModel = new paginateListViewModel(db.result_profile, "Profile sections", session.success, session.error, "/admin/profile-sections");
|
||||
|
||||
const format = req.query.format ? req.query.format : "view";
|
||||
const direction = req.query.direction ? req.query.direction : "ASC";
|
||||
const per_page = req.query.per_page ? req.query.per_page : 10;
|
||||
let order_by = req.query.order_by ? req.query.order_by : viewModel.get_field_column()[0];
|
||||
let orderAssociations = [];
|
||||
viewModel.set_order_by(order_by);
|
||||
let joins = order_by.includes(".") ? order_by.split(".") : [];
|
||||
order_by = order_by.includes(".") ? joins[joins.length - 1] : order_by;
|
||||
if (joins.length > 0) {
|
||||
for (let i = joins.length - 1; i > 0; i--) {
|
||||
orderAssociations.push(`${joins[i - 1]}`);
|
||||
}
|
||||
}
|
||||
// Check for flash messages
|
||||
const flashMessageSuccess = req.flash("success");
|
||||
if (flashMessageSuccess && flashMessageSuccess.length > 0) {
|
||||
viewModel.success = flashMessageSuccess[0];
|
||||
}
|
||||
const flashMessageError = req.flash("error");
|
||||
if (flashMessageError && flashMessageError.length > 0) {
|
||||
viewModel.error = flashMessageError[0];
|
||||
}
|
||||
|
||||
viewModel.set_id(req.query.id ? req.query.id : "");
|
||||
viewModel.set_section_title(req.query.section_title ? req.query.section_title : "");
|
||||
|
||||
let where = helpers.filterEmptyFields({
|
||||
id: viewModel.get_id(),
|
||||
section_title: viewModel.get_section_title(),
|
||||
});
|
||||
|
||||
const count = await db.result_profile._count(where, []);
|
||||
|
||||
viewModel.set_total_rows(count);
|
||||
viewModel.set_per_page(+per_page);
|
||||
viewModel.set_page(+req.params.num);
|
||||
viewModel.set_query(req.query);
|
||||
viewModel.set_sort_base_url(`/admin/profile-sections/${+req.params.num}`);
|
||||
viewModel.set_sort(direction);
|
||||
|
||||
const list = await db.result_profile.getPaginated(viewModel.get_page() - 1 < 0 ? 0 : viewModel.get_page(), viewModel.get_per_page(), where, order_by, direction, orderAssociations);
|
||||
|
||||
for (const item of list) {
|
||||
if (item.output_variable_list) {
|
||||
const parsedList = JSON.parse(item.output_variable_list);
|
||||
let actualList = await db.output_variable.findAll({
|
||||
where: {
|
||||
id: parsedList,
|
||||
},
|
||||
});
|
||||
actualList = actualList.map((ov) => ov.name);
|
||||
item.output_variable_list = actualList;
|
||||
}
|
||||
}
|
||||
|
||||
viewModel.set_list(list);
|
||||
|
||||
if (format == "csv") {
|
||||
const csv = viewModel.to_csv();
|
||||
return res
|
||||
.set({
|
||||
"Content-Type": "text/csv",
|
||||
"Content-Disposition": 'attachment; filename="export.csv"',
|
||||
})
|
||||
.send(csv);
|
||||
}
|
||||
|
||||
// if (format != 'view') {
|
||||
// res.json(viewModel.to_json());
|
||||
// } else {
|
||||
// }
|
||||
|
||||
return res.render("admin/Result_profile", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Result_profile", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/admin/profile-sections-add", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
|
||||
const resultProfileAdminAddViewModel = require("../../view_models/result_profile_admin_add_view_model");
|
||||
|
||||
const viewModel = new resultProfileAdminAddViewModel(db.result_profile, "Add result profile", "", "", "/admin/profile-sections");
|
||||
viewModel.output_variables = await db.output_variable.getAll();
|
||||
res.render("admin/Add_Result_profile", viewModel);
|
||||
});
|
||||
|
||||
app.post("/admin/profile-sections-add", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const resultProfileAdminAddViewModel = require("../../view_models/result_profile_admin_add_view_model");
|
||||
|
||||
const viewModel = new resultProfileAdminAddViewModel(db.result_profile, "Add result profile", "", "", "/admin/profile-sections");
|
||||
viewModel.output_variables = await db.output_variable.getAll();
|
||||
// TODO use separate controller for image upload
|
||||
// {{{upload_field_setter}}}
|
||||
|
||||
const { section_title, output_variable_list = [] } = req.body;
|
||||
|
||||
viewModel.form_fields = {
|
||||
...viewModel.form_fields,
|
||||
section_title,
|
||||
};
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
viewModel.error = req.validationError;
|
||||
return res.render("admin/Add_Result_profile", viewModel);
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
output_variable_list;
|
||||
const data = await db.result_profile.insert({
|
||||
section_title,
|
||||
output_variable_list: !Array.isArray(output_variable_list) ? JSON.stringify([output_variable_list]) : JSON.stringify(output_variable_list),
|
||||
});
|
||||
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Add_Result_profile", viewModel);
|
||||
}
|
||||
|
||||
req.flash("success", "Result profile created successfully");
|
||||
return res.redirect("/admin/profile-sections/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Add_Result_profile", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/admin/profile-sections-edit/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const resultProfileAdminEditViewModel = require("../../view_models/result_profile_admin_edit_view_model");
|
||||
|
||||
const viewModel = new resultProfileAdminEditViewModel(db.result_profile, "Edit result profile", "", "", "/admin/profile-sections");
|
||||
|
||||
try {
|
||||
const exists = await db.result_profile.getByPK(id);
|
||||
|
||||
if (!exists) {
|
||||
req.flash("error", "Result profile not found");
|
||||
return res.redirect("/admin/profile-sections/0");
|
||||
}
|
||||
const values = exists;
|
||||
Object.keys(viewModel.form_fields).forEach((field) => {
|
||||
viewModel.form_fields[field] = values[field] || "";
|
||||
});
|
||||
if (viewModel.form_fields["output_variable_list"]) {
|
||||
const parsedList = JSON.parse(viewModel.form_fields["output_variable_list"]);
|
||||
let actualList = await db.output_variable.findAll({
|
||||
where: {
|
||||
id: parsedList,
|
||||
},
|
||||
});
|
||||
actualList = actualList.map((ov) => ov.name);
|
||||
viewModel.form_fields["output_variable_list"] = actualList;
|
||||
}
|
||||
viewModel.output_variables = await db.output_variable.getAll();
|
||||
return res.render("admin/Edit_Result_profile", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Edit_Result_profile", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.post("/admin/profile-sections-edit/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
|
||||
const resultProfileAdminEditViewModel = require("../../view_models/result_profile_admin_edit_view_model");
|
||||
|
||||
const viewModel = new resultProfileAdminEditViewModel(db.result_profile, "Edit result profile", "", "", "/admin/profile-sections");
|
||||
|
||||
let { section_title, output_variable_list = [] } = req.body;
|
||||
|
||||
viewModel.form_fields = {
|
||||
...viewModel.form_fields,
|
||||
section_title,
|
||||
output_variable_list,
|
||||
};
|
||||
|
||||
delete viewModel.form_fields.id;
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
viewModel.error = req.validationError;
|
||||
return res.render("admin/Edit_Result_profile", viewModel);
|
||||
}
|
||||
|
||||
const resourceExists = await db.result_profile.getByPK(id);
|
||||
if (!resourceExists) {
|
||||
req.flash("error", "Result profile not found");
|
||||
return res.redirect("/admin/profile-sections/0");
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
let data = await db.result_profile.edit(
|
||||
{ section_title, output_variable_list: !Array.isArray(output_variable_list) ? JSON.stringify([output_variable_list]) : JSON.stringify(output_variable_list) },
|
||||
id
|
||||
);
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Edit_Result_profile", viewModel);
|
||||
}
|
||||
|
||||
req.flash("success", "Result profile edited successfully");
|
||||
|
||||
return res.redirect("/admin/profile-sections/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Edit_Result_profile", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.get(
|
||||
"/admin/profile-sections-view/:id",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
|
||||
async function (req, res, next) {
|
||||
try {
|
||||
let id = req.params.id;
|
||||
|
||||
const resultProfileAdminDetailViewModel = require("../../view_models/result_profile_admin_detail_view_model");
|
||||
|
||||
var viewModel = new resultProfileAdminDetailViewModel(db.result_profile, "Result profile details", "", "", "/admin/profile-sections");
|
||||
|
||||
const data = await db.result_profile.getByPK(id);
|
||||
|
||||
if (data["output_variable_list"]) {
|
||||
const parsedList = JSON.parse(data["output_variable_list"]);
|
||||
let actualList = await db.output_variable.findAll({
|
||||
where: {
|
||||
id: parsedList,
|
||||
},
|
||||
});
|
||||
actualList = actualList.map((ov) => ov.name);
|
||||
data["output_variable_list"] = actualList;
|
||||
}
|
||||
if (!data) {
|
||||
viewModel.error = "Result profile not found";
|
||||
viewModel.detail_fields = { ...viewModel.detail_fields, id: "N/A", section_title: "N/A", output_variable_list: "N/A" };
|
||||
} else {
|
||||
viewModel.detail_fields = { ...viewModel.detail_fields, id: data["id"] || "N/A", section_title: data["section_title"] || "N/A", output_variable_list: data["output_variable_list"] || "N/A" };
|
||||
}
|
||||
|
||||
res.render("admin/View_Result_profile", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
viewModel.detail_fields = { ...viewModel.detail_fields, id: "N/A", section_title: "N/A", output_variable_list: "N/A" };
|
||||
res.render("admin/View_Result_profile", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get("/admin/profile-sections-delete/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
|
||||
const resultProfileAdminDeleteViewModel = require("../../view_models/result_profile_admin_delete_view_model");
|
||||
|
||||
const viewModel = new resultProfileAdminDeleteViewModel(db.result_profile);
|
||||
|
||||
try {
|
||||
const exists = await db.result_profile.getByPK(id);
|
||||
|
||||
if (!exists) {
|
||||
req.flash("error", "Result profile not found");
|
||||
return res.redirect("/admin/profile-sections/0");
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
await db.result_profile.realDelete(id);
|
||||
|
||||
req.flash("success", "Result profile was deleted successfully");
|
||||
|
||||
return res.redirect("/admin/profile-sections/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
req.flash("error", error.message || "Something went wrong");
|
||||
return res.redirect("/admin/profile-sections/0");
|
||||
}
|
||||
});
|
||||
|
||||
// APIS
|
||||
|
||||
app.get("/admin/api/profile-sections", JwtService.verifyTokenMiddleware(role), async function (req, res, next) {
|
||||
try {
|
||||
const user_id = req.user_id;
|
||||
const session = req.session;
|
||||
let listViewModel = require("../../view_models/result_profile_admin_list_paginate_view_model");
|
||||
let viewModel = new listViewModel(db.result_profile, "Profile sections", session.success, session.error, "/admin/profile-sections");
|
||||
const direction = req.query.direction ? req.query.direction : "ASC";
|
||||
const page = req.query.page ? parseInt(req.query.page) : 1;
|
||||
const limit = req.query.limit ? parseInt(req.query.limit) : 10;
|
||||
const offset = (page - 1) * limit;
|
||||
let order_by = req.query.order_by ? req.query.order_by : viewModel.get_field_column()[0];
|
||||
let orderAssociations = [];
|
||||
viewModel.set_order_by(order_by);
|
||||
let joins = order_by.includes(".") ? order_by.split(".") : [];
|
||||
order_by = order_by.includes(".") ? joins[joins.length - 1] : order_by;
|
||||
if (joins.length > 0) {
|
||||
for (let i = joins.length - 1; i > 0; i--) {
|
||||
orderAssociations.push(`${joins[i - 1]}`);
|
||||
}
|
||||
}
|
||||
|
||||
viewModel.set_id(req.query.id ? req.query.id : "");
|
||||
viewModel.set_section_title(req.query.section_title ? req.query.section_title : "");
|
||||
|
||||
let where = helpers.filterEmptyFields({
|
||||
id: viewModel.get_id(),
|
||||
section_title: viewModel.get_section_title(),
|
||||
});
|
||||
|
||||
let include = [];
|
||||
|
||||
const { rows: allItems, count } = await db.result_profile.findAndCountAll({
|
||||
where: where,
|
||||
limit: limit == 0 ? null : limit,
|
||||
offset: offset,
|
||||
include: include,
|
||||
distinct: true,
|
||||
});
|
||||
|
||||
const response = {
|
||||
items: allItems,
|
||||
page,
|
||||
nextPage: count > offset + limit ? page + 1 : false,
|
||||
retrievedCount: allItems.length,
|
||||
fullCount: count,
|
||||
};
|
||||
|
||||
return res.status(201).json({ success: true, data: response });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
app.post("/admin/api/profile-sections-add", JwtService.verifyTokenMiddleware(role), async function (req, res, next) {
|
||||
const resultProfileAdminAddViewModel = require("../../view_models/result_profile_admin_add_view_model");
|
||||
|
||||
const viewModel = new resultProfileAdminAddViewModel(db.result_profile);
|
||||
|
||||
const { section_title, output_variable_list } = req.body;
|
||||
try {
|
||||
if (req.validationError) {
|
||||
return res.status(500).json({ success: false, message: req.validationError });
|
||||
}
|
||||
|
||||
const data = await db.result_profile.insert({ section_title, output_variable_list });
|
||||
|
||||
if (!data) {
|
||||
return res.status(500).json({ success: false, message: "Something went wrong" });
|
||||
}
|
||||
|
||||
return res.status(201).json({ success: true, message: "Result profile created successfully" });
|
||||
} catch (error) {
|
||||
return res.status(500).json({ success: false, message: "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
app.put("/admin/api/profile-sections-edit/:id", JwtService.verifyTokenMiddleware(role), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
|
||||
const resultProfileAdminEditViewModel = require("../../view_models/result_profile_admin_edit_view_model");
|
||||
|
||||
const viewModel = new resultProfileAdminEditViewModel(db.result_profile);
|
||||
|
||||
const { section_title, output_variable_list } = req.body;
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
return res.status(500).json({ success: false, message: req.validationError });
|
||||
}
|
||||
|
||||
const resourceExists = await db.result_profile.getByPK(id);
|
||||
if (!resourceExists) {
|
||||
return res.status(404).json({ success: false, message: "Result profile not found" });
|
||||
}
|
||||
|
||||
const data = await db.result_profile.edit({ section_title, output_variable_list }, id);
|
||||
|
||||
if (!data) {
|
||||
return res.status(500).json({ success: false, message: "Something went wrong" });
|
||||
}
|
||||
|
||||
return res.json({ success: true, message: "Result profile edited successfully" });
|
||||
} catch (error) {
|
||||
return res.status(500).json({ success: false, message: "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/admin/api/profile-sections-view/:id", JwtService.verifyTokenMiddleware(role), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
|
||||
const resultProfileAdminDetailViewModel = require("../../view_models/result_profile_admin_detail_view_model");
|
||||
|
||||
const viewModel = new resultProfileAdminDetailViewModel(db.result_profile);
|
||||
|
||||
try {
|
||||
const data = await db.result_profile.getByPK(id);
|
||||
|
||||
if (!data) {
|
||||
return res.status(404).json({ message: "Result profile not found", data: null });
|
||||
} else {
|
||||
const fields = { ...viewModel.detail_fields, id: data["id"] || "", section_title: data["section_title"] || "", output_variable_list: data["output_variable_list"] || "" };
|
||||
return res.status(200).json({ data: fields });
|
||||
}
|
||||
} catch (error) {
|
||||
return res.status(404).json({ message: "Something went wrong", data: null });
|
||||
}
|
||||
});
|
||||
|
||||
app.delete("/admin/api/profile-sections-delete/:id", JwtService.verifyTokenMiddleware(role), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
|
||||
const resultProfileAdminDeleteViewModel = require("../../view_models/result_profile_admin_delete_view_model");
|
||||
|
||||
const viewModel = new resultProfileAdminDeleteViewModel(db.result_profile);
|
||||
|
||||
try {
|
||||
const exists = await db.result_profile.getByPK(id);
|
||||
|
||||
if (!exists) {
|
||||
return res.status(404).json({ success: false, message: "Result profile not found" });
|
||||
}
|
||||
|
||||
await db.result_profile.realDelete(id);
|
||||
|
||||
return res.status(200).json({ success: true, message: "Result profile deleted successfully" });
|
||||
} catch (error) {
|
||||
return res.status(500).json({ success: false, message: "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = app;
|
||||
@@ -0,0 +1,353 @@
|
||||
"use strict";
|
||||
|
||||
const app = require("express").Router();
|
||||
const Sequelize = require("sequelize");
|
||||
const logger = require("../../services/LoggingService");
|
||||
let pagination = require("../../services/PaginationService");
|
||||
let SessionService = require("../../services/SessionService");
|
||||
let JwtService = require("../../services/JwtService");
|
||||
const ValidationService = require("../../services/ValidationService");
|
||||
const PermissionService = require("../../services/PermissionService");
|
||||
const UploadService = require("../../services/UploadService");
|
||||
const AuthService = require("../../services/AuthService");
|
||||
const db = require("../../models");
|
||||
const helpers = require("../../core/helpers");
|
||||
|
||||
const role = 1;
|
||||
|
||||
app.get("/admin/rules/:num", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
try {
|
||||
let session = req.session;
|
||||
let paginateListViewModel = require("../../view_models/rules_admin_list_paginate_view_model");
|
||||
|
||||
var viewModel = new paginateListViewModel(db.rule, "Rules", session.success, session.error, "/admin/rules");
|
||||
|
||||
const format = req.query.format ? req.query.format : "view";
|
||||
const direction = req.query.direction ? req.query.direction : "ASC";
|
||||
const per_page = req.query.per_page ? req.query.per_page : 10;
|
||||
let order_by = req.query.order_by ? req.query.order_by : viewModel.get_field_column()[0];
|
||||
let orderAssociations = [];
|
||||
viewModel.set_order_by(order_by);
|
||||
let joins = order_by.includes(".") ? order_by.split(".") : [];
|
||||
order_by = order_by.includes(".") ? joins[joins.length - 1] : order_by;
|
||||
if (joins.length > 0) {
|
||||
for (let i = joins.length - 1; i > 0; i--) {
|
||||
orderAssociations.push(`${joins[i - 1]}`);
|
||||
}
|
||||
}
|
||||
// Check for flash messages
|
||||
const flashMessageSuccess = req.flash("success");
|
||||
if (flashMessageSuccess && flashMessageSuccess.length > 0) {
|
||||
viewModel.success = flashMessageSuccess[0];
|
||||
}
|
||||
const flashMessageError = req.flash("error");
|
||||
if (flashMessageError && flashMessageError.length > 0) {
|
||||
viewModel.error = flashMessageError[0];
|
||||
}
|
||||
|
||||
viewModel.set_id(req.query.id ? req.query.id : "");
|
||||
viewModel.set_operator(req.query.operator ? req.query.operator : "");
|
||||
viewModel.set_action(req.query.action ? req.query.action : "");
|
||||
viewModel.set_output_variable_name(req.query.output_variable_name ? req.query.output_variable_name : "");
|
||||
|
||||
let where = helpers.filterEmptyFields({
|
||||
id: viewModel.get_id(),
|
||||
operator: viewModel.get_operator(),
|
||||
action: viewModel.get_action(),
|
||||
output_variable_name: viewModel.get_output_variable_name(),
|
||||
});
|
||||
|
||||
const count = await db.rule._count(where, []);
|
||||
|
||||
viewModel.set_total_rows(count);
|
||||
viewModel.set_per_page(+per_page);
|
||||
viewModel.set_page(+req.params.num);
|
||||
viewModel.set_query(req.query);
|
||||
viewModel.set_sort_base_url(`/admin/rules/${+req.params.num}`);
|
||||
viewModel.set_sort(direction);
|
||||
|
||||
const list = await db.rule.getPaginated(viewModel.get_page() - 1 < 0 ? 0 : viewModel.get_page(), viewModel.get_per_page(), where, order_by, direction, orderAssociations);
|
||||
|
||||
viewModel.set_list(list);
|
||||
|
||||
if (format == "csv") {
|
||||
const csv = viewModel.to_csv();
|
||||
return res
|
||||
.set({
|
||||
"Content-Type": "text/csv",
|
||||
"Content-Disposition": 'attachment; filename="export.csv"',
|
||||
})
|
||||
.send(csv);
|
||||
}
|
||||
|
||||
// if (format != 'view') {
|
||||
// res.json(viewModel.to_json());
|
||||
// } else {
|
||||
// }
|
||||
|
||||
return res.render("admin/Rules", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Rules", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/admin/rules-add", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
|
||||
const rulesAdminAddViewModel = require("../../view_models/rules_admin_add_view_model");
|
||||
|
||||
const viewModel = new rulesAdminAddViewModel(db.rule, "Add rule", "", "", "/admin/rules");
|
||||
viewModel.outputVariables = await db.output_variable.getAll();
|
||||
viewModel.actives = await db.active.getAll();
|
||||
res.render("admin/Add_Rules", viewModel);
|
||||
});
|
||||
|
||||
app.post(
|
||||
"/admin/rules-add",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
ValidationService.validateInput(
|
||||
{ output_variable_name: "required", actives: "required", operator: "required", compare_value: "required", action: "required" },
|
||||
{
|
||||
"output_variable_name.required": "OutputVariableName is required",
|
||||
"actives.required": "Actives is required",
|
||||
"operator.required": "Operator is required",
|
||||
"compare_value.required": "CompareValue is required",
|
||||
"action.required": "Action is required",
|
||||
}
|
||||
),
|
||||
async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const rulesAdminAddViewModel = require("../../view_models/rules_admin_add_view_model");
|
||||
|
||||
const viewModel = new rulesAdminAddViewModel(db.rule, "Add rule", "", "", "/admin/rules");
|
||||
viewModel.outputVariables = await db.output_variable.getAll();
|
||||
viewModel.actives = await db.active.getAll();
|
||||
|
||||
// TODO use separate controller for image upload
|
||||
// {{{upload_field_setter}}}
|
||||
|
||||
let { output_variable_name, actives, operator, compare_value, min, max, action } = req.body;
|
||||
if (!Array.isArray(actives)) {
|
||||
actives = [actives];
|
||||
}
|
||||
viewModel.form_fields = {
|
||||
...viewModel.form_fields,
|
||||
output_variable_name,
|
||||
actives,
|
||||
operator,
|
||||
compare_value,
|
||||
min,
|
||||
max,
|
||||
action,
|
||||
};
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
viewModel.error = req.validationError;
|
||||
return res.render("admin/Add_Rules", viewModel);
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
const data = await db.rule.insert({ output_variable_name, actives: JSON.stringify(actives), operator, compare_value, min, max, action });
|
||||
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Add_Rules", viewModel);
|
||||
}
|
||||
|
||||
req.flash("success", "Rule created successfully");
|
||||
return res.redirect("/admin/rules/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Add_Rules", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get("/admin/rules-edit/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const rulesAdminEditViewModel = require("../../view_models/rules_admin_edit_view_model");
|
||||
|
||||
const viewModel = new rulesAdminEditViewModel(db.rule, "Edit rule", "", "", "/admin/rules");
|
||||
|
||||
try {
|
||||
const exists = await db.rule.getByPK(id);
|
||||
|
||||
if (!exists) {
|
||||
req.flash("error", "Rule not found");
|
||||
return res.redirect("/admin/rules/0");
|
||||
}
|
||||
const values = exists;
|
||||
Object.keys(viewModel.form_fields).forEach((field) => {
|
||||
viewModel.form_fields[field] = values[field] || "";
|
||||
});
|
||||
|
||||
viewModel.outputVariables = await db.output_variable.getAll();
|
||||
viewModel.actives = await db.active.getAll();
|
||||
return res.render("admin/Edit_Rules", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Edit_Rules", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.post(
|
||||
"/admin/rules-edit/:id",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
ValidationService.validateInput(
|
||||
{ output_variable_name: "required", actives: "required", operator: "required", compare_value: "required", action: "required" },
|
||||
{
|
||||
"output_variable_name.required": "OutputVariableName is required",
|
||||
"actives.required": "Actives is required",
|
||||
"operator.required": "Operator is required",
|
||||
"compare_value.required": "CompareValue is required",
|
||||
"action.required": "Action is required",
|
||||
}
|
||||
),
|
||||
async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
|
||||
const rulesAdminEditViewModel = require("../../view_models/rules_admin_edit_view_model");
|
||||
|
||||
const viewModel = new rulesAdminEditViewModel(db.rule, "Edit rule", "", "", "/admin/rules");
|
||||
|
||||
viewModel.outputVariables = await db.output_variable.getAll();
|
||||
viewModel.actives = await db.active.getAll();
|
||||
let { output_variable_name, actives, operator, compare_value, min, max, action } = req.body;
|
||||
if (!Array.isArray(actives)) {
|
||||
actives = [actives];
|
||||
}
|
||||
viewModel.form_fields = {
|
||||
...viewModel.form_fields,
|
||||
output_variable_name,
|
||||
actives,
|
||||
operator,
|
||||
compare_value,
|
||||
min,
|
||||
max,
|
||||
action,
|
||||
};
|
||||
|
||||
delete viewModel.form_fields.id;
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
viewModel.error = req.validationError;
|
||||
return res.render("admin/Edit_Rules", viewModel);
|
||||
}
|
||||
|
||||
const resourceExists = await db.rule.getByPK(id);
|
||||
if (!resourceExists) {
|
||||
req.flash("error", "Rule not found");
|
||||
return res.redirect("/admin/rules/0");
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
let data = await db.rule.edit({ output_variable_name, actives: JSON.stringify(actives), operator, compare_value, min, max, action }, id);
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Edit_Rules", viewModel);
|
||||
}
|
||||
|
||||
req.flash("success", "Rule edited successfully");
|
||||
|
||||
return res.redirect("/admin/rules/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Edit_Rules", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get(
|
||||
"/admin/rules-view/:id",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
|
||||
async function (req, res, next) {
|
||||
try {
|
||||
let id = req.params.id;
|
||||
|
||||
const rulesAdminDetailViewModel = require("../../view_models/rules_admin_detail_view_model");
|
||||
|
||||
var viewModel = new rulesAdminDetailViewModel(db.rule, "Rule details", "", "", "/admin/rules");
|
||||
|
||||
const data = await db.rule.getByPK(id);
|
||||
data.operator = db.rule.operator_mapping()[data.operator];
|
||||
data.action = db.rule.action_mapping()[data.action];
|
||||
|
||||
if (!data) {
|
||||
viewModel.error = "Rule not found";
|
||||
viewModel.detail_fields = { ...viewModel.detail_fields, id: "N/A", output_variable_name: "N/A", actives: "N/A", operator: "N/A", compare_value: "N/A", min: "N/A", max: "N/A", action: "N/A" };
|
||||
} else {
|
||||
viewModel.detail_fields = {
|
||||
...viewModel.detail_fields,
|
||||
id: data["id"] || "N/A",
|
||||
output_variable_name: data["output_variable_name"] || "N/A",
|
||||
actives: data["actives"] || "N/A",
|
||||
operator: data["operator"] || "N/A",
|
||||
compare_value: data["compare_value"] || "N/A",
|
||||
min: data["min"] || "N/A",
|
||||
max: data["max"] || "N/A",
|
||||
action: data["action"] || "N/A",
|
||||
};
|
||||
}
|
||||
|
||||
res.render("admin/View_Rules", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
viewModel.detail_fields = { ...viewModel.detail_fields, id: "N/A", output_variable_name: "N/A", actives: "N/A", operator: "N/A", compare_value: "N/A", min: "N/A", max: "N/A", action: "N/A" };
|
||||
res.render("admin/View_Rules", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get("/admin/rules-delete/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
|
||||
const rulesAdminDeleteViewModel = require("../../view_models/rules_admin_delete_view_model");
|
||||
|
||||
const viewModel = new rulesAdminDeleteViewModel(db.rule);
|
||||
|
||||
try {
|
||||
const exists = await db.rule.getByPK(id);
|
||||
|
||||
if (!exists) {
|
||||
req.flash("error", "Rule not found");
|
||||
return res.redirect("/admin/rules/0");
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
await db.rule.realDelete(id);
|
||||
|
||||
req.flash("success", "Rule was deleted successfully");
|
||||
|
||||
return res.redirect("/admin/rules/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
req.flash("error", error.message || "Something went wrong");
|
||||
return res.redirect("/admin/rules/0");
|
||||
}
|
||||
});
|
||||
|
||||
// APIS
|
||||
|
||||
module.exports = app;
|
||||
@@ -0,0 +1,342 @@
|
||||
"use strict";
|
||||
|
||||
const app = require("express").Router();
|
||||
const Sequelize = require("sequelize");
|
||||
const logger = require("../../services/LoggingService");
|
||||
let pagination = require("../../services/PaginationService");
|
||||
let SessionService = require("../../services/SessionService");
|
||||
let JwtService = require("../../services/JwtService");
|
||||
const ValidationService = require("../../services/ValidationService");
|
||||
const PermissionService = require("../../services/PermissionService");
|
||||
const UploadService = require("../../services/UploadService");
|
||||
const AuthService = require("../../services/AuthService");
|
||||
const db = require("../../models");
|
||||
const helpers = require("../../core/helpers");
|
||||
|
||||
const role = 1;
|
||||
|
||||
app.get("/admin/users/:num", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
try {
|
||||
let session = req.session;
|
||||
let paginateListViewModel = require("../../view_models/users_admin_list_paginate_view_model");
|
||||
|
||||
var viewModel = new paginateListViewModel(db.user, "Users", session.success, session.error, "/admin/users");
|
||||
|
||||
const format = req.query.format ? req.query.format : "view";
|
||||
const direction = req.query.direction ? req.query.direction : "ASC";
|
||||
const per_page = req.query.per_page ? req.query.per_page : 10;
|
||||
let order_by = req.query.order_by ? req.query.order_by : viewModel.get_field_column()[0];
|
||||
let orderAssociations = [];
|
||||
viewModel.set_order_by(order_by);
|
||||
let joins = order_by.includes(".") ? order_by.split(".") : [];
|
||||
order_by = order_by.includes(".") ? joins[joins.length - 1] : order_by;
|
||||
if (joins.length > 0) {
|
||||
for (let i = joins.length - 1; i > 0; i--) {
|
||||
orderAssociations.push(`${joins[i - 1]}`);
|
||||
}
|
||||
}
|
||||
// Check for flash messages
|
||||
const flashMessageSuccess = req.flash("success");
|
||||
if (flashMessageSuccess && flashMessageSuccess.length > 0) {
|
||||
viewModel.success = flashMessageSuccess[0];
|
||||
}
|
||||
const flashMessageError = req.flash("error");
|
||||
if (flashMessageError && flashMessageError.length > 0) {
|
||||
viewModel.error = flashMessageError[0];
|
||||
}
|
||||
|
||||
viewModel.set_id(req.query.id ? req.query.id : "");
|
||||
viewModel.set_credential_email(req.query.credential_email ? req.query.credential_email : "");
|
||||
viewModel.set_first_name(req.query.first_name ? req.query.first_name : "");
|
||||
viewModel.set_last_name(req.query.last_name ? req.query.last_name : "");
|
||||
|
||||
let where = helpers.filterEmptyFields({
|
||||
id: viewModel.get_id(),
|
||||
first_name: viewModel.get_first_name(),
|
||||
last_name: viewModel.get_last_name(),
|
||||
});
|
||||
|
||||
let associatedWhere = helpers.filterEmptyFields({
|
||||
email: viewModel.get_credential_email(),
|
||||
});
|
||||
const isAssociationRequired = Object.keys(associatedWhere).length > 0 ? true : false;
|
||||
|
||||
const count = await db.user._count(where, [{ model: db.credential, where: associatedWhere, required: isAssociationRequired, as: "credential" }]);
|
||||
|
||||
viewModel.set_total_rows(count);
|
||||
viewModel.set_per_page(+per_page);
|
||||
viewModel.set_page(+req.params.num);
|
||||
viewModel.set_query(req.query);
|
||||
viewModel.set_sort_base_url(`/admin/users/${+req.params.num}`);
|
||||
viewModel.set_sort(direction);
|
||||
|
||||
const list = await db.user.get_credential_paginated(
|
||||
db,
|
||||
associatedWhere,
|
||||
viewModel.get_page() - 1 < 0 ? 0 : viewModel.get_page(),
|
||||
viewModel.get_per_page(),
|
||||
where,
|
||||
order_by,
|
||||
direction,
|
||||
orderAssociations
|
||||
);
|
||||
|
||||
viewModel.set_list(list);
|
||||
|
||||
viewModel.credential = await db.credential;
|
||||
|
||||
if (format == "csv") {
|
||||
const csv = viewModel.to_csv();
|
||||
return res
|
||||
.set({
|
||||
"Content-Type": "text/csv",
|
||||
"Content-Disposition": 'attachment; filename="export.csv"',
|
||||
})
|
||||
.send(csv);
|
||||
}
|
||||
|
||||
// if (format != 'view') {
|
||||
// res.json(viewModel.to_json());
|
||||
// } else {
|
||||
// }
|
||||
|
||||
return res.render("admin/Users", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Users", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/admin/users-add", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
|
||||
const usersAdminAddViewModel = require("../../view_models/users_admin_add_view_model");
|
||||
|
||||
const viewModel = new usersAdminAddViewModel(db.user, "Add user", "", "", "/admin/users");
|
||||
|
||||
res.render("admin/Add_Users", viewModel);
|
||||
});
|
||||
|
||||
app.post(
|
||||
"/admin/users-add",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
ValidationService.validateInput(
|
||||
{ first_name: "required", last_name: "required", status: "required" },
|
||||
{ "first_name.required": "FirstName is required", "last_name.required": "LastName is required", "status.required": "Status is required" }
|
||||
),
|
||||
async function (req, res, next) {
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const usersAdminAddViewModel = require("../../view_models/users_admin_add_view_model");
|
||||
|
||||
const viewModel = new usersAdminAddViewModel(db.user, "Add user", "", "", "/admin/users");
|
||||
|
||||
// TODO use separate controller for image upload
|
||||
// {{{upload_field_setter}}}
|
||||
|
||||
const { email, password, first_name, last_name, image, role_id, phone, status } = req.body;
|
||||
|
||||
viewModel.form_fields = {
|
||||
...viewModel.form_fields,
|
||||
email,
|
||||
password,
|
||||
first_name,
|
||||
last_name,
|
||||
image,
|
||||
role_id,
|
||||
phone,
|
||||
status,
|
||||
};
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
viewModel.error = req.validationError;
|
||||
return res.render("admin/Add_Users", viewModel);
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
const { email, password = "", role_id, ...rest } = viewModel.form_fields;
|
||||
const data = await AuthService.register(email, password, role_id, rest);
|
||||
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Add_Users", viewModel);
|
||||
}
|
||||
|
||||
await db.activity_log.insert({
|
||||
action: "ADD",
|
||||
name: "Admin_user_controller.js",
|
||||
portal: "admin",
|
||||
data: JSON.stringify({ email, password, first_name, last_name, image, role_id, phone, status }),
|
||||
});
|
||||
|
||||
req.flash("success", "User created successfully");
|
||||
return res.redirect("/admin/users/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Add_Users", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get("/admin/users-edit/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
const usersAdminEditViewModel = require("../../view_models/users_admin_edit_view_model");
|
||||
|
||||
const viewModel = new usersAdminEditViewModel(db.user, "Edit user", "", "", "/admin/users");
|
||||
|
||||
try {
|
||||
const exists = await db.user.get_user_credential(id, db);
|
||||
|
||||
if (!exists) {
|
||||
req.flash("error", "User not found");
|
||||
return res.redirect("/admin/users/0");
|
||||
}
|
||||
const values = exists;
|
||||
Object.keys(viewModel.form_fields).forEach((field) => {
|
||||
if (field === "credential.email") {
|
||||
viewModel.form_fields[field] = values["credential"]["email"];
|
||||
return;
|
||||
}
|
||||
if (field === "credential.password") {
|
||||
viewModel.form_fields[field] = values["credential"]["password"];
|
||||
return;
|
||||
}
|
||||
viewModel.form_fields[field] = values[field] || "";
|
||||
});
|
||||
viewModel.credential = db.credential;
|
||||
return res.render("admin/Edit_Users", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Edit_Users", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.post("/admin/users-edit/:id", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
let id = req.params.id;
|
||||
if (req.session.csrf === undefined) {
|
||||
req.session.csrf = SessionService.randomString(100);
|
||||
}
|
||||
|
||||
const usersAdminEditViewModel = require("../../view_models/users_admin_edit_view_model");
|
||||
|
||||
const viewModel = new usersAdminEditViewModel(db.user, "Edit user", "", "", "/admin/users");
|
||||
|
||||
const { credential_email, credential_password, first_name, last_name, role_id, image, phone, status } = req.body;
|
||||
|
||||
viewModel.form_fields = {
|
||||
...viewModel.form_fields,
|
||||
"credential.email": credential_email,
|
||||
"credential.password": credential_password,
|
||||
first_name,
|
||||
last_name,
|
||||
role_id,
|
||||
image,
|
||||
phone,
|
||||
status,
|
||||
};
|
||||
|
||||
delete viewModel.form_fields.id;
|
||||
|
||||
try {
|
||||
if (req.validationError) {
|
||||
viewModel.error = req.validationError;
|
||||
return res.render("admin/Edit_Users", viewModel);
|
||||
}
|
||||
|
||||
const resourceExists = await db.user.get_user_credential(id, db);
|
||||
if (!resourceExists) {
|
||||
req.flash("error", "User not found");
|
||||
return res.redirect("/admin/users/0");
|
||||
}
|
||||
|
||||
viewModel.session = req.session;
|
||||
|
||||
let data = await db.user.edit({ first_name, last_name, role_id, image, phone, status }, id);
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Edit_Users", viewModel);
|
||||
}
|
||||
|
||||
if (resourceExists.credential) {
|
||||
data = await db.credential.edit(helpers.filterEmptyFields({ email: credential_email, password: credential_password }), resourceExists.credential.id);
|
||||
if (!data) {
|
||||
viewModel.error = "Something went wrong";
|
||||
return res.render("admin/Edit_Users", viewModel);
|
||||
}
|
||||
}
|
||||
|
||||
await db.activity_log.insert({
|
||||
action: "EDIT",
|
||||
name: "Admin_user_controller.js",
|
||||
portal: "admin",
|
||||
data: JSON.stringify({ credential_email, credential_password, first_name, last_name, role_id, image, phone, status }),
|
||||
});
|
||||
|
||||
req.flash("success", "User edited successfully");
|
||||
|
||||
return res.redirect("/admin/users/0");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
return res.render("admin/Edit_Users", viewModel);
|
||||
}
|
||||
});
|
||||
|
||||
app.get(
|
||||
"/admin/users-view/:id",
|
||||
SessionService.verifySessionMiddleware(role, "admin"),
|
||||
|
||||
async function (req, res, next) {
|
||||
try {
|
||||
let id = req.params.id;
|
||||
|
||||
const usersAdminDetailViewModel = require("../../view_models/users_admin_detail_view_model");
|
||||
|
||||
var viewModel = new usersAdminDetailViewModel(db.user, "User details", "", "", "/admin/users");
|
||||
|
||||
const data = await db.user.get_user_credential(id, db);
|
||||
data.status = db.user.status_mapping()[data.status];
|
||||
data["credential.two_factor_authentication"] = db.credential.two_factor_authentication_mapping()[data.credential.two_factor_authentication];
|
||||
data["credential.type"] = db.credential.type_mapping()[data.credential.type];
|
||||
data["credential.status"] = db.credential.status_mapping()[data.credential.status];
|
||||
data["credential.verify"] = db.credential.verify_mapping()[data.credential.verify];
|
||||
|
||||
if (!data) {
|
||||
viewModel.error = "User not found";
|
||||
viewModel.detail_fields = { ...viewModel.detail_fields, id: "N/A", "credential.email": "N/A", first_name: "N/A", last_name: "N/A", role_id: "N/A", status: "N/A" };
|
||||
} else {
|
||||
viewModel.detail_fields = {
|
||||
...viewModel.detail_fields,
|
||||
id: data["id"] || "N/A",
|
||||
"credential.email": data["credential"]["email"] || "N/A",
|
||||
first_name: data["first_name"] || "N/A",
|
||||
last_name: data["last_name"] || "N/A",
|
||||
role_id: data["role_id"] || "N/A",
|
||||
status: data["status"] || "N/A",
|
||||
};
|
||||
}
|
||||
|
||||
res.render("admin/View_Users", viewModel);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
viewModel.error = error.message || "Something went wrong";
|
||||
viewModel.detail_fields = { ...viewModel.detail_fields, id: "N/A", "credential.email": "N/A", first_name: "N/A", last_name: "N/A", role_id: "N/A", status: "N/A" };
|
||||
res.render("admin/View_Users", viewModel);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// APIS
|
||||
|
||||
module.exports = app;
|
||||
@@ -0,0 +1,113 @@
|
||||
const SessionService = require("../../services/SessionService");
|
||||
const app = require("express").Router();
|
||||
const db = require("../../models");
|
||||
const role = 1;
|
||||
|
||||
app.get("/admin/letters/main", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
const { order: orderId } = req.query;
|
||||
// const orderId = 2;
|
||||
const order = await db.order.getByPK(orderId);
|
||||
const firstName = JSON.parse(order.customer).first_name;
|
||||
res.render("admin/Letters/Main_Letter", {
|
||||
firstName,
|
||||
get_page_name: () => "Letter",
|
||||
_base_url: "/admin/letters/main",
|
||||
});
|
||||
});
|
||||
|
||||
app.get("/admin/letters/profile", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
const { order: orderId } = req.query;
|
||||
|
||||
const order = await db.order.getByPK(orderId);
|
||||
const firstName = order.customer ? JSON.parse(order.customer).first_name ?? null : null;
|
||||
const profileCharcteristics = order.profile ? JSON.parse(order.profile) : [];
|
||||
res.render("admin/Letters/Profile_Letter", { firstName, profileCharcteristics, get_page_name: () => "Letter", _base_url: "/admin/letters/profile" });
|
||||
});
|
||||
|
||||
app.get("/admin/letters/formula", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
const { order: orderId } = req.query;
|
||||
|
||||
const order = await db.order.getByPK(orderId);
|
||||
let activesNames = order.actives ? JSON.parse(order.actives) : [];
|
||||
if (activesNames && activesNames.length) activesNames = activesNames.filter((active) => active !== "Base");
|
||||
const { rows: actives, count } = await db.active.findAndCountAll({
|
||||
where: { name: { [db.Sequelize.Op.in]: activesNames } },
|
||||
});
|
||||
|
||||
res.render("admin/Letters/Formula_Letter", { actives, count, get_page_name: () => "Letter", _base_url: "/admin/letters/formula" });
|
||||
});
|
||||
|
||||
app.get("/admin/letters/instructions", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
const { order: orderId } = req.query;
|
||||
|
||||
const order = await db.order.getByPK(orderId);
|
||||
|
||||
res.render("admin/Letters/Instructions_Letter", { get_page_name: () => "Letter", _base_url: "/admin/letters/instructions" });
|
||||
});
|
||||
|
||||
app.get("/admin/letters/all", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
const { order: orderId } = req.query;
|
||||
|
||||
const order = await db.order.getByPK(orderId);
|
||||
|
||||
const firstName = JSON.parse(order.customer).first_name;
|
||||
const profileCharcteristics = order.profile ? JSON.parse(order.profile) : [];
|
||||
|
||||
let activesNames = order.actives ? JSON.parse(order.actives) : [];
|
||||
if (activesNames && activesNames.length) activesNames = activesNames.filter((active) => active !== "Base");
|
||||
const { rows: actives, count } = await db.active.findAndCountAll({
|
||||
where: { name: { [db.Sequelize.Op.in]: activesNames } },
|
||||
});
|
||||
|
||||
res.render("admin/Letters/All", { firstName, profileCharcteristics, actives, count, get_page_name: () => "Letter", _base_url: "/admin/letters/all" });
|
||||
});
|
||||
|
||||
app.get("/admin/dashboard", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
const config = await db.configuration.findOne({ where: { id: 1 }, include: [{ model: db.image, as: "image" }] });
|
||||
res.render("admin/Dashboard", {
|
||||
config,
|
||||
get_page_name: () => "Dashboard",
|
||||
_base_url: "/admin/dashboard",
|
||||
});
|
||||
});
|
||||
|
||||
app.post("/questions/order/save", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
try {
|
||||
const questions = req.body;
|
||||
|
||||
for (const question of questions) {
|
||||
if (question.id && question.order) {
|
||||
await db.question.edit({ order: question.order }, question.id);
|
||||
}
|
||||
}
|
||||
return res.json({ success: true, message: "Successfully updated orders" });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return res.status(500).json({ success: false, message: "Failed to update orders" });
|
||||
}
|
||||
});
|
||||
app.post("/main-image/update", SessionService.verifySessionMiddleware(role, "admin"), async function (req, res, next) {
|
||||
try {
|
||||
const { image_url } = req.body;
|
||||
await db.configuration.edit({ image_id: image_url }, 1);
|
||||
return res.json({ success: true, message: "Successfully updated image" });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return res.status(500).json({ success: false, message: "Failed to update image" });
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/configurations", async function (req, res, next) {
|
||||
try {
|
||||
const config = await db.configuration.findOne({ where: { id: 1 }, include: [{ model: db.image, as: "image" }] });
|
||||
if (!config) {
|
||||
return res.status(404).json({ success: false, message: "No configurations found" });
|
||||
}
|
||||
return res.json({ success: true, payload: config });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return res.status(500).json({ success: false, message: "Failed to fetch configurations" });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = app;
|
||||
@@ -0,0 +1,37 @@
|
||||
"use strict";
|
||||
|
||||
const app = require("express").Router();
|
||||
// const Sequelize = require('sequelize');
|
||||
// const logger = require('../../services/LoggingService');
|
||||
// let pagination = require('../../services/PaginationService');
|
||||
// let SessionService = require('../../services/SessionService');
|
||||
let JwtService = require("../../services/JwtService");
|
||||
const ValidationService = require("../../services/ValidationService");
|
||||
// const PermissionService = require('../../services/PermissionService');
|
||||
// const UploadService = require('../../services/UploadService');
|
||||
// const AuthService = require('../../services/AuthService');
|
||||
const db = require("../../models");
|
||||
const helpers = require("../../core/helpers");
|
||||
|
||||
const role = 1;
|
||||
|
||||
app.get("/admin/api/profile-system", async function (req, res, next) {
|
||||
try {
|
||||
const { rows: allItems, count } = await db.profile_header.findAndCountAll({
|
||||
offset: offset,
|
||||
order: [["id", direction]],
|
||||
distinct: true,
|
||||
});
|
||||
|
||||
const response = {
|
||||
items: allItems,
|
||||
count,
|
||||
};
|
||||
|
||||
return res.status(201).json({ success: true, data: response });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
module.exports = app;
|
||||
@@ -0,0 +1,34 @@
|
||||
const AdminUserController = require("./admin/Admin_user_controller");
|
||||
const Admin_order_controller = require("./admin/Admin_order_controller");
|
||||
const AdminQuizController = require("./admin/Admin_quiz_controller");
|
||||
const AdminQuestionController = require("./admin/Admin_question_controller");
|
||||
const AdminRulesController = require("./admin/Admin_rules_controller");
|
||||
const AdminActivesController = require("./admin/Admin_actives_controller");
|
||||
const AdminOutputVariablesController = require("./admin/Admin_output_variables_controller");
|
||||
const AdminResultProfileController = require("./admin/Admin_result_profile_controller");
|
||||
const AdminGetProfileSystem = require("./admin/getProfileSystem");
|
||||
const PublicIndex = require("./public/index");
|
||||
const AdminAnswerController = require("./admin/Admin_answer_controller");
|
||||
const AdminDashboard = require("./admin/Dashboard");
|
||||
const MemberDashboard = require("./member/Dashboard");
|
||||
const getProducts = require("./shopify/getProducts");
|
||||
const ShopifyWebhook = require("./shopify/webhook");
|
||||
const KlaviyoController = require("./klaviyo/index");
|
||||
module.exports = [
|
||||
KlaviyoController,
|
||||
Admin_order_controller,
|
||||
ShopifyWebhook,
|
||||
AdminResultProfileController,
|
||||
AdminGetProfileSystem,
|
||||
AdminUserController,
|
||||
AdminQuizController,
|
||||
AdminQuestionController,
|
||||
AdminRulesController,
|
||||
AdminActivesController,
|
||||
AdminOutputVariablesController,
|
||||
AdminAnswerController,
|
||||
AdminDashboard,
|
||||
MemberDashboard,
|
||||
PublicIndex,
|
||||
getProducts,
|
||||
];
|
||||
@@ -0,0 +1,78 @@
|
||||
// const SessionService = require('../../services/SessionService');
|
||||
const app = require("express").Router();
|
||||
const db = require("../../models");
|
||||
const axios = require("axios");
|
||||
const cors = require("cors");
|
||||
|
||||
const quiz_list_id = "SuMRRB";
|
||||
const klaviyo_api_key = "pk_026fc9c97c646a73a053c99ef8d8c9c53d";
|
||||
const corsOptions = {
|
||||
origin: ["http://localhost:3001"],
|
||||
optionsSuccessStatus: 200, // some legacy browsers (IE11, various SmartTVs) choke on 204
|
||||
};
|
||||
|
||||
//api: get output variable info
|
||||
app.post("/klaviyo/identity", cors(corsOptions), async function (req, res, next) {
|
||||
try {
|
||||
//body should have actives lsit as array
|
||||
const { email, firstName, lastName } = req.body;
|
||||
let data = JSON.stringify({
|
||||
token: klaviyo_api_key,
|
||||
properties: {
|
||||
$email: email,
|
||||
$first_name: firstName,
|
||||
$last_name: lastName,
|
||||
},
|
||||
});
|
||||
|
||||
let config = {
|
||||
method: "post",
|
||||
url: "https://a.klaviyo.com/api/identify",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
data: data,
|
||||
};
|
||||
|
||||
const response = await axios(config);
|
||||
console.log(response.data);
|
||||
|
||||
return res.status(201).json({ success: true, payload: response.data });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
app.post("/klaviyo/list", cors(corsOptions), async function (req, res, next) {
|
||||
try {
|
||||
//body should have actives lsit as array
|
||||
const { email } = req.body;
|
||||
let data = JSON.stringify({
|
||||
profiles: [
|
||||
{
|
||||
email: email,
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
let config = {
|
||||
method: "post",
|
||||
url: `https://a.klaviyo.com/api/v2/list/${quiz_list_id}/members?api_key=${klaviyo_api_key}`,
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
data: data,
|
||||
};
|
||||
|
||||
const response = await axios(config);
|
||||
console.log(response.data);
|
||||
|
||||
return res.status(201).json({ success: true, payload: response.data });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = app;
|
||||
@@ -0,0 +1,18 @@
|
||||
const SessionService = require('../../services/SessionService');
|
||||
const app = require('express').Router();
|
||||
|
||||
const role = 2;
|
||||
|
||||
app.get(
|
||||
"/member/dashboard",
|
||||
SessionService.verifySessionMiddleware(role,"member"),
|
||||
async function (req, res, next) {
|
||||
|
||||
res.render('member/Dashboard',{
|
||||
get_page_name: () => 'Dashboard',
|
||||
_base_url: '/member/dashboard',
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
module.exports = app;
|
||||
@@ -0,0 +1,320 @@
|
||||
// const SessionService = require('../../services/SessionService');
|
||||
const app = require("express").Router();
|
||||
const db = require("../../models");
|
||||
const axios = require("axios");
|
||||
|
||||
//api: get output variable info
|
||||
app.get("/api/v1/output-variable/:name", async function (req, res, next) {
|
||||
try {
|
||||
//body should have actives lsit as array
|
||||
const { name } = req.params;
|
||||
|
||||
const outputVariable = await db.output_variable.getByFields({ name });
|
||||
if (!outputVariable) {
|
||||
return res.status(404).json({ success: false, message: `Output variable of that name ${name} is not found.` });
|
||||
}
|
||||
let payload = {},
|
||||
actives = [];
|
||||
if (outputVariable.active_list) {
|
||||
let activeList = JSON.parse(outputVariable.active_list);
|
||||
for (const activeId of activeList) {
|
||||
const active = await db.active.getByPK(activeId);
|
||||
if (active) {
|
||||
actives.push(active.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
payload = { name: outputVariable.name, actives: actives, ranges_response: JSON.parse(outputVariable.ranges_response) };
|
||||
|
||||
return res.status(201).json({ success: true, data: payload });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/api/v1/output-variables/actives-list", async function (req, res, next) {
|
||||
try {
|
||||
//body should have actives lsit as array
|
||||
const { names_list } = req.query;
|
||||
if (!names_list) {
|
||||
return res.status(401).json({ success: false, message: "Empty list" });
|
||||
}
|
||||
const outputVariablesList = names_list.split(",");
|
||||
|
||||
const outputVars = await db.output_variable.findAll({
|
||||
where: {
|
||||
name: outputVariablesList,
|
||||
},
|
||||
});
|
||||
|
||||
let allActivesList = [];
|
||||
outputVars.forEach((outputVar) => {
|
||||
if (outputVar.active_list) {
|
||||
let parsedList = JSON.parse(outputVar.active_list);
|
||||
if (parsedList.length) {
|
||||
parsedList.forEach((item) => {
|
||||
if (!allActivesList.includes(item)) {
|
||||
allActivesList.push(item);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
let actives = await db.active
|
||||
.findAll({
|
||||
where: {
|
||||
id: allActivesList,
|
||||
},
|
||||
})
|
||||
.then((data) => {
|
||||
return data.map((item) => {
|
||||
return item.name;
|
||||
});
|
||||
});
|
||||
if (!actives) {
|
||||
return res.status(404).json({ success: false, message: "No actives found for this list" });
|
||||
}
|
||||
return res.status(201).json({ success: true, data: actives });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/api/v1/places/autocomplete", async function (req, res, next) {
|
||||
try {
|
||||
const { input } = req.query;
|
||||
|
||||
var config = {
|
||||
method: "get",
|
||||
// url: `https://maps.googleapis.com/maps/api/place/autocomplete/json?input=${encodeURIComponent(input)}&types=(regions)&key=${process.env.GOOGLE_PLACES_API_KEY}`,
|
||||
url: `https://maps.googleapis.com/maps/api/place/autocomplete/json?input=${encodeURIComponent(input)}&key=${process.env.GOOGLE_PLACES_API_KEY}`,
|
||||
headers: {},
|
||||
};
|
||||
|
||||
const response = await axios(config).then(function (response) {
|
||||
return response.data;
|
||||
});
|
||||
const payload = response.predictions.map((prediction) => {
|
||||
return {
|
||||
name: prediction.description,
|
||||
id: prediction.place_id,
|
||||
};
|
||||
});
|
||||
|
||||
return res.status(201).json(payload);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
app.get("/api/v1/rules", async function (req, res, next) {
|
||||
try {
|
||||
//body should have actives lsit as array
|
||||
const rules = await db.rule.getAll();
|
||||
|
||||
if (!rules) {
|
||||
return res.status(404).json({ success: false, message: `There are no rules` });
|
||||
}
|
||||
|
||||
return res.status(201).json({ success: true, data: rules });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/api/v1/profile-sections", async function (req, res, next) {
|
||||
try {
|
||||
//body should have actives lsit as array
|
||||
const profileSections = await db.result_profile.getAll();
|
||||
|
||||
if (!profileSections) {
|
||||
return res.status(404).json({ success: false, message: `There are sections to display` });
|
||||
}
|
||||
|
||||
for (const section of profileSections) {
|
||||
if (section.output_variable_list) {
|
||||
const parsedList = JSON.parse(section.output_variable_list);
|
||||
let actualList = await db.output_variable.findAll({
|
||||
where: {
|
||||
id: parsedList,
|
||||
},
|
||||
});
|
||||
actualList = actualList.map((ov) => ov.name);
|
||||
section.output_variable_list = actualList;
|
||||
}
|
||||
}
|
||||
return res.status(201).json({ success: true, data: profileSections });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/api/v1/weather-profile", async function (req, res, next) {
|
||||
try {
|
||||
const { city_id } = req.query;
|
||||
var config = {
|
||||
method: "get",
|
||||
url: `https://maps.googleapis.com/maps/api/place/details/json?place_id=${city_id}&fields=geometry,formatted_address,address_component&key=${process.env.GOOGLE_PLACES_API_KEY}`,
|
||||
headers: {},
|
||||
};
|
||||
|
||||
const place_details = await axios(config);
|
||||
// .then((response) => response.data);
|
||||
if (place_details?.data?.status !== "OK") {
|
||||
console.error(place_details);
|
||||
return res.status(400).json({ success: false, message: "Can't get location" });
|
||||
}
|
||||
const lon = place_details.data.result.geometry.location.lng;
|
||||
const lat = place_details.data.result.geometry.location.lat;
|
||||
const country = place_details.data.result.address_components.find((adr) => adr.types.includes("country"));
|
||||
// const country;
|
||||
config = {
|
||||
method: "get",
|
||||
url: `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=${process.env.OPEN_WEATHER_API_KEY}&units=metric`,
|
||||
};
|
||||
|
||||
const weather = await axios(config).then((response) => response.data);
|
||||
|
||||
config = {
|
||||
method: "get",
|
||||
url: `https://api.openweathermap.org/data/2.5/air_pollution?lat=${lat}&lon=${lon}&appid=${process.env.OPEN_WEATHER_API_KEY}&units=metric`,
|
||||
};
|
||||
const pollutionData = await axios(config).then((response) => response.data);
|
||||
|
||||
// let temperatureWeight = weather.main.temp;
|
||||
let { sunValue, sunWeight, temperatureWeight } = calculateSun(weather.main.temp);
|
||||
let { humidityValue, humidityWeight } = calculateHumidity(weather.main.humidity);
|
||||
let { pollutionValue, pollutionWeight } = calculatePollution(pollutionData.list[0].main.aqi);
|
||||
let temperature = weather.main.temp;
|
||||
let unit = "°C";
|
||||
if (country.short_name == "GB" || country.short_name == "US") {
|
||||
temperature = (temperature * 9) / 5 + 32;
|
||||
unit = "°F";
|
||||
}
|
||||
let payload = {
|
||||
unit: unit,
|
||||
humidity: humidityValue,
|
||||
temperature: Math.round(temperature),
|
||||
sun: sunValue,
|
||||
pollution: pollutionValue,
|
||||
weights: {
|
||||
Pollution: {
|
||||
value: pollutionWeight,
|
||||
base: 33,
|
||||
},
|
||||
Sun: {
|
||||
value: sunWeight,
|
||||
base: 10,
|
||||
},
|
||||
Temperature: {
|
||||
value: temperatureWeight,
|
||||
base: 0,
|
||||
},
|
||||
Hydration: {
|
||||
value: humidityWeight,
|
||||
base: 15,
|
||||
},
|
||||
},
|
||||
};
|
||||
return res.status(201).json({
|
||||
success: true,
|
||||
data: payload,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
function calculateSun(sunTemp) {
|
||||
let maxSun = 56.7;
|
||||
let sun = parseFloat(sunTemp / maxSun) * 100;
|
||||
if (sun > 0 && sun <= 33.334) {
|
||||
return {
|
||||
sunValue: "low",
|
||||
sunWeight: 33.334 * 10,
|
||||
temperatureWeight: 0,
|
||||
};
|
||||
} else if (sun > 33.334 && sun <= 66.667) {
|
||||
return {
|
||||
sunValue: "medium",
|
||||
sunWeight: 66.667 * 10,
|
||||
temperatureWeight: 0,
|
||||
};
|
||||
} else if (sun > 66.667 && sun <= 100) {
|
||||
return {
|
||||
sunValue: "High",
|
||||
sunWeight: 100 * 10,
|
||||
temperatureWeight: 0,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
sunValue: "",
|
||||
sunWeight: 0,
|
||||
temperatureWeight: 0,
|
||||
};
|
||||
}
|
||||
}
|
||||
function calculateHumidity(humidity) {
|
||||
if (humidity < 30) {
|
||||
return {
|
||||
humidityValue: "Low",
|
||||
humidityWeight: 33.334 * 15,
|
||||
};
|
||||
} else if (humidity >= 30 && humidity < 50) {
|
||||
return {
|
||||
humidityValue: "Medium",
|
||||
humidityWeight: 66.667 * 15,
|
||||
};
|
||||
} else if (humidity >= 50) {
|
||||
return {
|
||||
humidityValue: "High",
|
||||
humidityWeight: 100 * 15,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
humidityValue: "",
|
||||
humidityWeight: 0,
|
||||
};
|
||||
}
|
||||
}
|
||||
function calculatePollution(airQuality) {
|
||||
// Air Quality Index. Possible values: 1, 2, 3, 4, 5. Where 1 = Good, 2 = Fair, 3 = Moderate, 4 = Poor, 5 = Very Poor.
|
||||
if (airQuality == 1) {
|
||||
return {
|
||||
pollutionValue: "Very low",
|
||||
pollutionWeight: 20 * 33,
|
||||
};
|
||||
} else if (airQuality == 2) {
|
||||
return {
|
||||
pollutionValue: "Low",
|
||||
pollutionWeight: 40 * 33,
|
||||
};
|
||||
} else if (airQuality == 3) {
|
||||
return {
|
||||
pollutionValue: "Moderate",
|
||||
pollutionWeight: 60 * 33,
|
||||
};
|
||||
} else if (airQuality == 4) {
|
||||
return {
|
||||
pollutionValue: "High",
|
||||
pollutionWeight: 80 * 33,
|
||||
};
|
||||
} else if (airQuality == 5) {
|
||||
return {
|
||||
pollutionValue: "Very high",
|
||||
pollutionWeight: 100 * 33,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
pollutionValue: "",
|
||||
pollutionWeight: 0,
|
||||
};
|
||||
}
|
||||
}
|
||||
module.exports = app;
|
||||
@@ -0,0 +1,20 @@
|
||||
const axios = require("axios");
|
||||
|
||||
const app = require("express").Router();
|
||||
|
||||
app.get("/v1/api/get-shopify-products", async function (req, res, next) {
|
||||
try {
|
||||
var config = {
|
||||
method: "get",
|
||||
url: `https://${process.env.SHOPIFY_API_KEY}:${process.env.SHOPIFY_API_PASSWORD}@${process.env.SHOPIFY_SITE}/admin/api/2021-10/products.json`,
|
||||
headers: {},
|
||||
};
|
||||
|
||||
const response = await axios(config);
|
||||
return res.status(201).json(response.data);
|
||||
} catch (error) {
|
||||
return res.status(500).json({ success: false, message: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = app;
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,80 @@
|
||||
const app = require("express").Router();
|
||||
const db = require("../../models");
|
||||
const crypto = require("crypto");
|
||||
app.post("/v1/api/webhook", async function (req, res, next) {
|
||||
try {
|
||||
const hmac = req.get("X-Shopify-Hmac-Sha256");
|
||||
const rawBody = req.rawBody;
|
||||
if (!verify_webhook(rawBody, hmac)) {
|
||||
return res.sendStatus(403);
|
||||
}
|
||||
|
||||
const webhookId = req.get("X-Shopify-Webhook-Id");
|
||||
const event = req.body;
|
||||
const currentOrderLineItems = event.line_items.map((item) => item.name);
|
||||
|
||||
//this gets the first ever order of said customer since it can't happen unless he goes thro quiz.
|
||||
const customerId = event.customer.id;
|
||||
const customerOrderedBefore = await db.order.findOne({
|
||||
where: {
|
||||
customer_shopify_id: customerId,
|
||||
},
|
||||
});
|
||||
|
||||
let attributes = event.note_attributes ?? [];
|
||||
|
||||
if (!attributes.length) {
|
||||
if (!customerOrderedBefore) {
|
||||
return res.sendStatus(204);
|
||||
}
|
||||
attributes.push({
|
||||
name: "answers",
|
||||
value: customerOrderedBefore.answers, //we take old answers
|
||||
});
|
||||
attributes.push({
|
||||
name: "profile",
|
||||
value: customerOrderedBefore.profile, //we take old profile
|
||||
});
|
||||
attributes.push({
|
||||
name: "actives",
|
||||
value: JSON.stringify(currentOrderLineItems ?? []), //we take new actives
|
||||
});
|
||||
}
|
||||
|
||||
if (await db.order.getByFields({ webhook_id: webhookId })) return res.sendStatus(205); //webhook handled before
|
||||
|
||||
const orderExists = await db.order.getByFields({ shopify_id: `${event.id}` });
|
||||
const modelParams = {
|
||||
webhook_id: webhookId,
|
||||
shopify_id: event.id,
|
||||
customer_shopify_id: event.customer.id,
|
||||
customer: JSON.stringify(event.customer),
|
||||
answers: attributes.find((attr) => attr.name == "answers")?.value ?? "[]",
|
||||
profile: attributes.find((attr) => attr.name == "profile")?.value ?? "{}",
|
||||
actives: attributes.find((attr) => attr.name == "actives")?.value ?? "[]",
|
||||
items: JSON.stringify(event.line_items ?? []),
|
||||
financial_status: event.financial_status,
|
||||
fulfillment_status: event.fulfillment_status,
|
||||
};
|
||||
|
||||
if (orderExists) {
|
||||
console.log("Modifying order");
|
||||
await db.order.edit(modelParams, orderExists.id);
|
||||
} else {
|
||||
console.log("Creating new order");
|
||||
await db.order.insert(modelParams);
|
||||
}
|
||||
|
||||
return res.sendStatus(200);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.sendStatus(500);
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = app;
|
||||
|
||||
function verify_webhook(data, hmac_header) {
|
||||
let calculated_hmac = crypto.createHmac("sha256", process.env.SHOPIFY_SECRET_KEY).update(data).digest("base64");
|
||||
return calculated_hmac == hmac_header;
|
||||
}
|
||||
Reference in New Issue
Block a user