Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
b04adfd
Merge pull request #27 from MakanMatch/main
Prakhar896 Jun 28, 2024
9a2158b
Updated Association code, created getImageForReview endpoint, remove …
lincoln0623 Jun 28, 2024
89ea6e4
Resolved ERR_HTTP_HEADERS_SENT error.
lincoln0623 Jun 28, 2024
7645ba4
Merge pull request #31 from MakanMatch/main
Prakhar896 Jun 29, 2024
f4462e9
added type hint for bucket in FireStorage
Prakhar896 Jun 29, 2024
27ed1dd
Update guestID fetching in backend
lincoln0623 Jun 29, 2024
3b07ead
Changed some UERROR to ERROR, Added logger.log to catch errors
lincoln0623 Jun 29, 2024
7ab3186
done rendering from database and editing of message
nicholascheww Jun 29, 2024
f07a027
done delete message
nicholascheww Jun 29, 2024
f680922
strengthened updateListing endpoint
Prakhar896 Jul 3, 2024
ffc9709
fixed sequelize model intellisense issues
Prakhar896 Jul 3, 2024
42a7e80
added new automated router detect and register index script
Prakhar896 Jul 3, 2024
1111049
Catching errors
lincoln0623 Jul 3, 2024
bf65d13
Merge branch 'lincoln' into main
lincoln0623 Jul 3, 2024
b3de736
fixed some of jun hans bugs
Prakhar896 Jul 3, 2024
c610cea
Merge pull request #34 from MakanMatch/prakhar
Prakhar896 Jul 3, 2024
b5e9b2c
made minor changes
Prakhar896 Jul 5, 2024
a720015
changed all routers to use auto syntax
Prakhar896 Jul 5, 2024
cdeda04
removed arbitrary console log
Prakhar896 Jul 5, 2024
56ab84e
removed hard coded timestamp
nicholascheww Jul 5, 2024
790c6d6
changed error to show on frontend also
nicholascheww Jul 5, 2024
0cf6431
removed timestamp and have item potency
nicholascheww Jul 5, 2024
4192c96
Merge pull request #33 from MakanMatch/nicholas
Prakhar896 Jul 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ConfiguringDatabase.md → ConfiguringSystem.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Configuring Database for MakanMatch Backend
# Configuring System Operation

There's a few ways you can configure the database the backend system uses.

Expand Down
19 changes: 3 additions & 16 deletions config/boilerplateConfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,8 @@
"useFileLogging": false,
"logPostBootOnly": false,
"clearUponBoot": false
}
},
"test": {
"username": "root",
"password": null,
"database": "database_test",
"host": "127.0.0.1",
"dialect": "mysql"
},
"production": {
"username": "root",
"password": null,
"database": "database_production",
"host": "127.0.0.1",
"dialect": "mysql",
"routeLogging": false
},
"routeLogging": false,
"routerRegistration": "manual"
}
}
37 changes: 25 additions & 12 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,17 +54,29 @@ app.get("/", (req, res) => {

// Register routers
app.use(checkHeaders) // Middleware to check Content-Type and API key headers
app.use("/misc", require("./routes/misc"));
app.use("/cdn", require("./routes/cdn/contentDelivery"));
app.use("/cdn", require("./routes/cdn/coreData"));
app.use("/reviews", require("./routes/reviews/reviews"));
app.use("/createAccount", require('./routes/identity/createAccount'));
app.use("/loginAccount", require('./routes/identity/loginAccount'));
app.use("/accountRecovery", require('./routes/identity/accountRecovery'));
app.use("/identity/emailVerification", require('./routes/identity/emailVerification'));
app.use("/identity/myAccount", require("./routes/identity/myAccount"));
app.use("/listings", require("./routes/listings/listings"));
app.use("/", require("./routes/orders/listingDetails"));
if (config["routerRegistration"] != "automated") {
console.log("MAIN: Route registration mode: MANUAL")
app.use(require("./routes/misc").at || '/', require("./routes/misc").router);
app.use(require("./routes/cdn/contentDelivery").at || '/', require("./routes/cdn/contentDelivery").router);
app.use(require("./routes/cdn/coreData").at || '/', require("./routes/cdn/coreData").router);
app.use(require("./routes/reviews/reviews").at || '/', require("./routes/reviews/reviews").router);
app.use(require('./routes/identity/createAccount').at || '/', require('./routes/identity/createAccount').router);
app.use(require('./routes/identity/LoginAccount').at || '/', require('./routes/identity/LoginAccount').router);
app.use(require('./routes/identity/AccountRecovery').at || '/', require('./routes/identity/AccountRecovery').router);
app.use(require('./routes/identity/emailVerification').at || '/', require('./routes/identity/emailVerification').router);
app.use(require("./routes/identity/myAccount").at || '/', require("./routes/identity/myAccount").router);
app.use(require("./routes/listings/listings").at || '/', require("./routes/listings/listings").router);
app.use(require("./routes/orders/listingDetails").at || '/', require("./routes/orders/listingDetails").router);
} else {
console.log("MAIN: Route registration mode: AUTOMATED")
require('./routes').forEach(({ router, at, name }) => {
try {
app.use(at, router)
} catch (err) {
Logger.logAndThrow(`MAIN: Failed to register router auto-loaded from ${name} at '${at}'. Error: ${err}`)
}
})
}

async function onDBSynchronise() {
const guests = await Guest.findAll()
Expand All @@ -90,7 +102,7 @@ async function onDBSynchronise() {
Universal.data["DUMMY_GUEST_USERNAME"] = newGuest.username
console.log(`Created dummy guest with User ID: ${newGuest.userID}`)
}

const joshuasHost = await Host.findByPk("272d3d17-fa63-49c4-b1ef-1a3b7fe63cf4")
if (!joshuasHost) {
const newHost = await Host.create({
Expand Down Expand Up @@ -146,5 +158,6 @@ if (!SEQUELIZE_ACTIVE) {
.catch(err => {
console.log(err)
console.log(`MAIN: Failed to setup sequelize. Terminating boot.`)
process.exit(1)
})
}
4 changes: 2 additions & 2 deletions models/ChatMessage.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@ module.exports = (sequelize, DataTypes) => {
type: DataTypes.STRING,
allowNull: false
},
from: {
sender: {
type: DataTypes.STRING,
allowNull: false
},
datetime: {
type: DataTypes.STRING,
allowNull: false
}
},
}, { tableName: 'chatMessages' })

// Associations
Expand Down
1 change: 1 addition & 0 deletions models/Guest.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ module.exports = (sequelize, DataTypes) => {
})
Guest.hasMany(models.Review, {
foreignKey: "guestID",
as: "reviews",
onDelete: "cascade"
})
}
Expand Down
7 changes: 5 additions & 2 deletions models/Review.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,11 @@ module.exports = (sequelize, DataTypes) => {

// Associations
Review.associate = (models) => {
Review.belongsTo(models.Host)
Review.belongsTo(models.Guest)
Review.belongsTo(models.Host),
Review.belongsTo(models.Guest, {
foreignKey: 'guestID',
as: 'guest'
});
}

return Review;
Expand Down
76 changes: 22 additions & 54 deletions models/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ const Universal = require('../services/Universal');
const basename = path.basename(__filename);
const env = process.env.DB_CONFIG || 'development';
const config = require('../config/config.json')[env];
const db = {};

if (!config) {
throw new Error("Database configuration not found in config/config.json")
}

// System Configuration Setup (e.g Logging)
if (config.logging == true) {
if (config.loggingOptions != undefined) {
var queryLogsFile = "sqlQueries.txt"
Expand All @@ -42,6 +42,7 @@ if (config.logging == true) {
// If logging options not provided, sequelize will default to console.log
}

// Sequelize Initialization
/**
* @type {Sequelize.Sequelize}
*/
Expand All @@ -60,6 +61,21 @@ if (process.env.DB_MODE == "mysql") {
})
}

// Model Registration
const db = {};

// Hard-import models
db.Admin = require('./Admin')(sequelize, Sequelize.DataTypes);
db.ChatHistory = require('./ChatHistory')(sequelize, Sequelize.DataTypes);
db.ChatMessage = require('./ChatMessage')(sequelize, Sequelize.DataTypes);
db.FoodListing = require('./FoodListing')(sequelize, Sequelize.DataTypes);
db.Guest = require('./Guest')(sequelize, Sequelize.DataTypes);
db.Host = require('./Host')(sequelize, Sequelize.DataTypes);
db.Reservation = require('./Reservation')(sequelize, Sequelize.DataTypes);
db.Review = require('./Admin')(sequelize, Sequelize.DataTypes);
db.Warning = require('./Admin')(sequelize, Sequelize.DataTypes);

// Auto-detect and import other models (intellisense will not work for these models)
fs
.readdirSync(__dirname)
.filter(file => {
Expand All @@ -71,11 +87,11 @@ fs
);
})
.forEach(file => {
/**
* @type {Sequelize.Model}
*/
const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
db[model.name] = model;
// Add model if model not hard-imported
if (db[model.name] !== undefined) {
db[model.name] = model;
}
});

Object.keys(db).forEach(modelName => {
Expand All @@ -84,52 +100,4 @@ Object.keys(db).forEach(modelName => {
}
});

const { admin, chatHistory, chatMessage, foodListing, guest, host, reservation, review, warning, ...otherModels } = db

/**
* @type {Sequelize.Model}
*/
const Admin = admin;

/**
* @type {Sequelize.Model}
*/
const ChatHistory = chatHistory;

/**
* @type {Sequelize.Model}
*/
const ChatMessage = chatMessage;

/**
* @type {Sequelize.Model}
*/
const FoodListing = foodListing;

/**
* @type {Sequelize.Model}
*/
const Guest = guest;

/**
* @type {Sequelize.Model}
*/
const Host = host;

/**
* @type {Sequelize.Model}
*/
const Reservation = reservation;

/**
* @type {Sequelize.Model}
*/
const Review = review;

/**
* @type {Sequelize.Model}
*/
const Warning = warning;

// console.log({ Admin, FoodListing, Guest, Host, Reservation, Review, Warning, ...otherModels, sequelize, Sequelize })
module.exports = { Admin, ChatHistory, ChatMessage, FoodListing, Guest, Host, Reservation, Review, Warning, ...otherModels, sequelize, Sequelize };
module.exports = { ...db, sequelize, Sequelize };
38 changes: 36 additions & 2 deletions routes/cdn/contentDelivery.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const router = express.Router();
const path = require("path");
const FileManager = require("../../services/FileManager");
const Logger = require("../../services/Logger");
const { FoodListing } = require("../../models");
const { FoodListing,Review } = require("../../models");

router.get("/getImageForListing", async (req, res) => {
const { listingID, imageName } = req.query;
Expand Down Expand Up @@ -36,4 +36,38 @@ router.get("/getImageForListing", async (req, res) => {
return;
});

module.exports = router;
router.get("/getImageForReview", async (req, res) => {
const { reviewID, imageName } = req.query;
if (!reviewID || !imageName) {
res.status(400).send("ERROR: Invalid request parameters.");
return;
}

// Find the review
const findReview = await Review.findByPk(reviewID);
if (!findReview) {
Logger.log(`CDN CONTENTDELIVERY GETIMAGEFORREVIEW ERROR: Review not found.`)
res.status(404).send("ERROR: Review not found.");
return;
}

const findImageName = await FileManager.prepFile(imageName);
if (!findImageName.startsWith("SUCCESS")) {
Logger.log(`CDN CONTENTDELIVERY GETIMAGEFORREVIEW ERROR: Image not found.`)
res.status(404).send("ERROR: Image not found.");
return;
}

const reviewImages = findReview.images.split("|");

if (reviewImages.includes(imageName) !== true) {
Logger.log(`CDN CONTENTDELIVERY GETIMAGEFORREVIEW ERROR: Requested image does not belong to its corresponding review.`)
res.status(404).send("ERROR: Requested image does not belong to its corresponding review.");
return;
}

res.status(200).sendFile(findImageName.substring("SUCCESS: File path: ".length))
return;
});

module.exports = { router, at: '/cdn' };
18 changes: 12 additions & 6 deletions routes/cdn/coreData.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ const { validateToken } = require("../../middleware/auth");

router.get('/MyAccount', validateToken, (req, res) => {
const userInfo = req.user;
console.log(userInfo)
res.json(userInfo);
});

Expand Down Expand Up @@ -84,6 +83,7 @@ router.get("/getListing", async (req, res) => {
router.get("/accountInfo", async (req, res) => { // GET account information
try {
const targetUserID = req.query.userID;
if (!targetUserID) { res.status(400).send("ERROR: One or more required payloads not provided."); }
let user, userType;

user = await Guest.findOne({ where: { userID: targetUserID } });
Expand All @@ -103,7 +103,7 @@ router.get("/accountInfo", async (req, res) => { // GET account information
}

if (!user) {
return res.status(404).send("User does not exist.");
return res.status(404).send("ERROR: User does not exist.");
}

const accountInfo = {
Expand Down Expand Up @@ -134,7 +134,8 @@ router.get("/accountInfo", async (req, res) => { // GET account information
res.status(200).json(accountInfo);

} catch (err) {
res.status(500).send("An error occured while fetching the account information.")
res.status(500).send("ERROR: An error occured while fetching the account information.")
console.log(err)
}
})

Expand All @@ -144,7 +145,7 @@ router.get("/getReviews", async (req, res) => { // GET full reviews list
const order = [];

if (!req.query.hostID) {
return res.status(400).send("UERROR: Missing host ID or order.");
return res.status(400).send("ERROR: Missing host ID or order.");
} else {
where.hostID = req.query.hostID;
}
Expand Down Expand Up @@ -173,6 +174,11 @@ router.get("/getReviews", async (req, res) => { // GET full reviews list
const reviews = await Review.findAll({
where,
order,
include: [{
model: Guest,
as: 'guest',
attributes: ['username']
}]
})

if (req.query.order === "images") {
Expand Down Expand Up @@ -200,7 +206,7 @@ router.get("/getReviews", async (req, res) => { // GET full reviews list

router.get("/reviews", async (req, res) => { // GET review from review id
if (!req.query.id) {
return res.status(400).send("UERROR: Missing review ID");
return res.status(400).send("ERROR: Missing review ID");
} else {
const review = await Review.findByPk(req.query.id);
if (review) {
Expand All @@ -211,4 +217,4 @@ router.get("/reviews", async (req, res) => { // GET review from review id
}
})

module.exports = router;
module.exports = { router, at: '/cdn' };
Loading