const express = require("express");
const app = express();
const bcrypt = require("bcrypt");
const jwt = require("jsonwebtoken");
const fs = require('fs');
var bodyParser = require('body-parser');
var cors = require('cors');
var axios = require('axios');
const User = require("../models/userModel");
const Event = require("../models/eventModel");
app.use(cors());
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
const PORT = 3001;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
// endpoints
// login
app.post("/login", async (request, response) => {
console.log("reached endpoint for login");
// check if email exists
User.findOne({ email: request.body.email })
// if email exists
.then((user) => {
// compare the password entered and the hashed password found
bcrypt
.compare(request.body.password, user.password)
// if the passwords match
.then(async (passwordCheck) => {
// check if password matches
if (!passwordCheck) {
return response.status(400).send({
message: "Password does not match",
error,
});
}
// create JWT token
const token = jwt.sign(
{
userId: user._id,
userEmail: user.email,
},
"RANDOM-TOKEN",
{ expiresIn: "24h" }
);
// check if user has previously made event(s)
let prev_events = await Event.find({ owner_email: request.body.email });
var has_prev_event = false;
if (prev_events.length != 0) {
has_prev_event = true;
}
//return success response
response.status(200).send({
message: "Login Successful",
email: user.email,
has_prev_event: has_prev_event,
events: prev_events,
token,
});
})
// catch error if password does not match
.catch((error) => {
response.status(400).send({
message: "Password does not match",
error,
});
});
})
// catch error if email does not exist
.catch((e) => {
response.status(404).send({
message: "Email not found",
e,
});
});
});
app.post("/register", async (request, response) => {
console.log("reached endpoint for register");
// hash the password
bcrypt
.hash(request.body.password, 10)
.then((hashedPassword) => {
// create a new user instance and collect the data
const user = new User({
email: request.body.email,
password: hashedPassword,
});
// save the new user
user
.save()
// return success if the new user is added to the database successfully
.then((result) => {
response.status(201).send({
message: "User Created Successfully",
result,
});
})
// catch error if the new user wasn't added successfully to the database
.catch((error) => {
console.log(error);
response.status(500).send({
message: "Error creating user",
error,
});
});
})
// catch error if the password hash isn't successful
.catch((e) => {
response.status(500).send({
message: "Password was not hashed successfully",
error,
});
});
});
// event creation
app.post("/event-creation", (request, response) => {
console.log("endpoint for event creation, owner email is: ", request.body.owner_email,);
const event = new Event({
event_name: request.body.event_name,
event_date: request.body.event_date,
event_budget: request.body.event_budget,
event_spent: 0,
owner_email: request.body.owner_email,
invitees: [],
attendees: 0,
event_spent: 0,
});
// save the new event
event
.save()
// return success if the new event is added to the database successfully
.then((result) => {
console.log("event created successfully");
response.status(201).send({
message: "Event Created Successfully",
result,
});
})
// catch error if the new event wasn't added successfully to the database
.catch((error) => {
response.status(500).send({
message: "Error creating event",
error,
});
console.log(error);
});
});
// venue search
app.post("/search", async (request, response) => {
console.log("/search endpoint request body: ", request.body);
var longitude = request.body.longitude;
var latitude = request.body.latitude;
var meters = request.body.meters;
var venue_type = request.body.venue_type;
var max_price = request.body.max_price;
const config = {
method: 'get',
url: `https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=${latitude}%2C${longitude}&radius=${meters}&minprice=0&maxprice=${max_price}&type=${venue_type}&key=AIzaSyAmeYzQ-LS4wPMOZW1_sQlt3XbfpKxKs6M`,
headers: {}
};
console.log(config.url);
axios(config)
.then((result) => {
response.send(JSON.stringify(result.data));
fs.writeFile('client/src/components/venue-search/venue-search-data.json', JSON.stringify(result.data.results), err => {
if (err) {
console.error(err);
}
// file written successfully
});
})
.catch((error) => {
console.log("error", error);
});
});
app.delete("/search", async (request, response) => {
console.log("clear endpoint");
fs.writeFile('client/src/components/venue-search/venue-search-data.json', '[]', err => {
if (err) {
console.error(err);
}
// file written successfully
});
});
app.post("/get-event-budget", async (request, response) => {
console.log("get-event-budget endpoint");
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
response.status(200).send({
budget: event["event_budget"]
});
});
app.post("/get-event-spent", async (request, response) => {
console.log("get-event-spent endpoint");
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
response.status(200).send({
event_spent: event["event_spent"]
});
});
app.post("/change-event-spent", async (request, response) => {
console.log("change-event-spent endpoint");
// before change, get needed variables
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var spent = event["event_spent"];
var spent_desc = event["event_spent_desc"];
var id = event["_id"];
// change new_spent & updating expenses list
var new_spent = parseInt(spent) + parseInt(request.body.new_expense);
// add to expenses list if expense > 0 (> 0 means adding expense)
if (parseInt(request.body.new_expense) > 0) {
console.log("> 0");
spent_desc.push({
"expense": request.body.new_expense,
"expense_desc": request.body.expenseDesc,
});
}
// delete from expenses list if expense < 0 (< 0 means deleting expense)
else {
console.log("before deletion:", spent_desc);
console.log("deleting in backend....");
// find index in which the expense is located
var index = -1;
console.log("N_E", request.body.new_expense);
console.log("E_D", request.body.expenseDesc);
var corrected_expense = request.body.new_expense * -1;
for (var i = 0; i < spent_desc.length; i++) {
if (parseInt(spent_desc[i]["expense"]) === corrected_expense &&
spent_desc[i]["expense_desc"] === request.body.expenseDesc) {
console.log("match found");
index = i;
break;
}
}
console.log("index", index);
// delete expense from expense list
spent_desc.splice(index, 1);
console.log("after deletion:", spent_desc);
}
let event2 = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var spent = event2["event_spent_desc"];
const result = await Event.updateOne({ _id: id }, { event_spent: new_spent, event_spent_desc: spent_desc });
response.status(200).send({
event_spent: new_spent,
event_spent_desc: spent_desc
});
});
app.post("/get-spent-desc", async (request, response) => {
console.log("get-spent-desc endpoint");
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email});
if (event === null) {
response.status(200).send({
event_spent_desc: 0
});
}
var spent_desc = event["event_spent_desc"];
response.status(200).send({
event_spent_desc: spent_desc
});
});
app.post("/get-invitees", async (request, response) => {
console.log("get-invitees endpoint");
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var temp = event["invitees"];
response.status(200).send({
invitees: temp
});
});
app.post("/add-invitee", async (request, response) => {
console.log("get-invitees endpoint");
let new_invitee = request.body.new_invitee;
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var temp = event["invitees"];
var id = event["_id"];
// add new invitee to array
temp.push({
name: new_invitee,
attending: false,
});
const result = await Event.updateOne({ _id: id }, { invitees: temp });
let event2 = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var updated_invitees = event["invitees"];
response.status(200).send({
updated_invitees: updated_invitees
});
});
app.post("/delete-invitee", async (request, response) => {
console.log("delete-invitee endpoint");
let deletedInvitee = request.body.deletedInvitee;
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var invitees_before = event["invitees"];
var id = event["_id"];
var index_to_delete = -1;
for (var i = 0; i < invitees_before.length; i++) {
if (invitees_before[i]["name"] === deletedInvitee) {
index_to_delete = i;
}
}
invitees_before.splice(index_to_delete, 1);
const result = await Event.updateOne({ _id: id }, { invitees: invitees_before });
response.status(200).send({
updated_invitees: invitees_before
});
});
app.post("/invitee-attending", async (request, response) => {
console.log("invitee-attending endpoint");
let invitee = request.body.invitee;
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var invitees_before = event["invitees"];
var id = event["_id"];
for (var i = 0; i < invitees_before.length; i++) {
if (invitees_before[i]["name"] === invitee) {
invitees_before[i]["attending"] = true;
}
}
var attendees = event["attendees"] + 1;
const result = await Event.updateOne({_id: id}, {invitees: invitees_before, attendees: attendees})
response.status(200).send({
updated_invitees: invitees_before
});
});
app.post("/invitee-unattending", async (request, response) => {
console.log("invitee unattending endpoint");
let invitee = request.body.invitee;
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var invitees_before = event["invitees"];
var id = event["_id"];
for (var i = 0; i < invitees_before.length; i++) {
if (invitees_before[i]["name"] === invitee) {
invitees_before[i]["attending"] = false;
}
}
var attendees = event["attendees"] - 1;
const result = await Event.updateOne({_id: id}, {invitees: invitees_before, attendees: attendees})
response.status(200).send({
updated_invitees: invitees_before
});
});
app.post("/countdown-return", async (request, response) => {
console.log("return countdown");
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var countdown = event["event_date"];
response.status(200).send({
ret_countdown: countdown
});
});
app.post("/get-attendees", async (request, response) => {
console.log("get attendees")
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email})
console.log(request.body.curr_event)
console.log(request.body.email)
let attendees= event["attendees"];
response.status(200).send({
attendees: attendees
});
});
app.post("/get-favorite", async (request, response) => {
console.log("get favorites")
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
console.log(request.body.curr_event)
console.log(request.body.email)
console.log(event)
var fav_venues = event["favorited_venues"];
response.status(200).send({
fav_venues: fav_venues
});
});
app.post("/add-favorite", async (request, response) => {
console.log("add favorite vendor")
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var temp = event["favorited_venues"];
var id = event["_id"];
let fav_name = request.body.curr_name;
let fav_rating = request.body.curr_rating;
let fav_price = request.body.curr_price;
let fav_lat = request.body.curr_lat;
let fav_long = request.body.curr_long;
// add new favorite to array
temp.push({
name: fav_name,
rating: fav_rating,
price: fav_price,
lat: fav_lat,
long: fav_long
});
await Event.updateOne({ _id: id }, { favorited_venues: temp });
let event2 = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var updated_fav = event2["favorited_venues"];
response.status(200).send({
updated_fav: updated_fav
});
})
app.delete("/delete-favorite", async (request, response) => {
console.log("delete-favorite endpoint");
let deletedName = request.body.deletedFav;
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var fav = event["favorited_venues"];
var id = event["_id"];
var index_to_delete = -1;
for (var i = 0; i < fav.length; i++) {
if (fav[i]["name"] === deletedName) {
index_to_delete = i;
}
}
console.log("index to delete: ", index_to_delete);
fav.splice(index_to_delete, 1);
await Event.updateOne({ _id: id }, { favorited_venues: fav });
let event2 = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var updated_fav = event2["favorited_venues"];
console.log(updated_fav)
response.status(200).send({
updated_favs: updated_fav
});
});
app.post("/get-tasks", async (request, response) => {
console.log("get-tasks endpoint");
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var temp = event["tasks"];
response.status(200).send({
tasks: temp
});
});
app.post("/add-task", async (request, response) => {
console.log("get-task endpoint");
// TODO: axios call has new_task variable
let new_task = request.body.new_task;
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var temp = event["tasks"];
var id = event["_id"];
// add new invitee to array
temp.push({
name: new_task,
done: false,
});
const result = await Event.updateOne({ _id: id }, { tasks: temp });
let event2 = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var updated_tasks = event["tasks"];
response.status(200).send({
updated_tasks: updated_tasks
});
});
app.post("/delete-task", async (request, response) => {
console.log("delete-task endpoint");
let deletedTask = request.body.deletedTask;
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var tasks_before = event["tasks"];
var id = event["_id"];
var index_to_delete = -1;
for (var i = 0; i < tasks_before.length; i++) {
if (tasks_before[i]["name"] === deletedTask) {
index_to_delete = i;
}
}
tasks_before.splice(index_to_delete, 1);
const result = await Event.updateOne({ _id: id }, { tasks: tasks_before });
response.status(200).send({
updated_tasks: tasks_before
});
});
app.post("/task-done", async (request, response) => {
console.log("task-done endpoint");
// TODO: request body has task variable
let task = request.body.task;
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var tasks_before = event["tasks"];
var id = event["_id"];
for (var i = 0; i < tasks_before.length; i++) {
if (tasks_before[i]["name"] === task) {
tasks_before[i]["done"] = true;
}
}
var tasks_done = event["tasks_done"] + 1;
const result = await Event.updateOne({_id: id}, {tasks: tasks_before, tasks_done: tasks_done})
response.status(200).send({
updated_tasks: tasks_before
});
});
app.post("/tasks-undone", async (request, response) => {
console.log("tasks undone endpoint");
let task = request.body.task;
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email });
var tasks_before = event["tasks"];
var id = event["_id"];
for (var i = 0; i < tasks_before.length; i++) {
if (tasks_before[i]["name"] === task) {
tasks_before[i]["done"] = false;
}
}
var tasks_done = event["tasks_done"] - 1;
const result = await Event.updateOne({_id: id}, {tasks: tasks_before, tasks_done: tasks_done})
response.status(200).send({
updated_tasks: tasks_before
});
});
app.post("/get-tasks-done", async (request, response) => {
console.log("get tasks_done")
let event = await Event.findOne({ event_name: request.body.curr_event, owner_email: request.body.email})
//let tasks_done = event["tasks_done"];
let done_tasks = [];
let tasks_before = event["tasks"];
console.log("tasks in before: ", tasks_before);
for (var i = 0; i < tasks_before.length; i++) {
if (tasks_before[i]["done"] === true) {
done_tasks.push(tasks_before[i]);
}
}
console.log("get-tasks-done: ", done_tasks);
response.status(200).send({
tasks_done: done_tasks
});
});
module.exports = app;