CSE316/final/server/controllers/top5list-controller.js
2022-05-23 06:22:34 -04:00

945 lines
30 KiB
JavaScript

const Top5List = require('../models/top5list-model');
const CommunityList = require('../models/communitylist-model');
const auth = require('../auth');
const User = require('../models/user-model')
createTop5List = async (req, res) => {
const body = req.body;
if (!body) {
return res.status(400).json({
success: false,
errorMessage: 'You must provide a Top 5 List',
})
}
auth.verify(req, res, async function () {
_id = req.userId;
});
if (_id === 'Guest') {
return res.status(403).json({success: false, errorMessage: 'Please log in to creat new list'});
}
let owner = await getOwner(_id);
body.owner = owner;
body.likes = [];
body.dislikes = [];
body.views = 0;
body.comments = [];
body.published = false;
const top5List = new Top5List(body);
console.log("creating top5List: " + JSON.stringify(top5List));
if (!top5List) {
return res.status(400).json({ success: false, errorMessage: err })
}
top5List
.save()
.then(() => {
return res.status(201).json({
success: true,
top5List: top5List,
message: 'Top 5 List Created!'
})
})
.catch(error => {
return res.status(400).json({
error,
errorMessage : 'Top 5 List Not Created!'
})
})
}
updateTop5List = async (req, res) => {
let _id = '';
auth.verify(req, res, async function () {
_id = req.userId;
});
let owner = 'Guest';
if (_id !== 'Guest') {
owner = await getOwner(_id);
}
const body = req.body
console.log("updateTop5List: " + JSON.stringify(body));
if (!body) {
return res.status(400).json({
success: false,
errorMessage: 'You must provide a body to update',
})
}
await Top5List.findOne({ _id: req.params.id }, (err, top5List) => {
console.log("top5List found: " + JSON.stringify(top5List));
if (err || top5List.owner !== owner) {
return res.status(404).json({
err,
errorMessage: 'Top 5 List not found!',
})
}
if (top5List.published) {
return res.status(403).json({
err,
errorMessage: 'Cannot modify published list!',
})
}
top5List.name = body.name;
top5List.items = body.items;
top5List
.save()
.then(() => {
console.log("SUCCESS!!!");
return res.status(200).json({
success: true,
id: top5List._id,
message: 'Top 5 List updated!',
})
})
.catch(error => {
console.log("FAILURE: " + JSON.stringify(error));
return res.status(404).json({
error,
errorMessage: 'Top 5 List not updated!',
})
})
})
}
publishTop5List = async (req, res) => {
let _id = '';
auth.verify(req, res, async function () {
_id = req.userId;
});
let owner = 'Guest';
if (_id !== 'Guest') {
owner = await getOwner(_id);
}
const body = req.body
console.log("publishTop5List: " + JSON.stringify(body));
if (!body) {
return res.status(400).json({
success: false,
errorMessage: 'You must provide a body to update',
})
}
if (!body.name || !body.items[0] || !body.items[1] || !body.items[2] || !body.items[3] || !body.items[4]) {
return res.status(403).json({success: false, errorMessage: 'Must fill in all items and title.'});
}
if (body.items[0] === body.items[1] || body.items[0] === body.items[2] || body.items[0] === body.items[3] || body.items[0] === body.items[4] || body.items[1] === body.items[2] || body.items[1] === body.items[3] || body.items[1] === body.items[4] || body.items[2] === body.items[3] || body.items[2] === body.items[4] || body.items[3] === body.items[4]) {
return res.status(403).json({success: false, errorMessage: 'All item should be identical'});
}
Top5List.findOne({ $and:[{owner: owner}, {name: body.name}, {published: true}]}, (err, top5List) => {
if (err) {
return res.status(400).json({success: false, errorMessage: err});
}
if (top5List) {
console.log('there is list with same name')
console.log(top5List);
return res.status(403).json({success: false, errorMessage: 'Cannot publish list with same name'});
}
else {
Top5List.findOne({ _id: req.params.id }, (err, top5List) => {
console.log("top5List found: " + JSON.stringify(top5List));
if (err || top5List.owner !== owner) {
return res.status(404).json({
err,
errorMessage: 'Top 5 List not found!',
})
}
console.log(top5List);
if (top5List.published) {
return res.status(403).json({
err,
errorMessage: 'Cannot modify published list!',
})
}
let d = new Date;
CommunityList.findOne({name: body.name}, (err, communityList) => {
console.log("community list found: " + communityList);
if (err) {
return res.status(403).json({
err,
errorMessage: 'Error with CommunityList',
})
}
if (!communityList) {
communityList = {
name: body.name,
items: [],
likes: [],
dislikes: [],
views: 0,
comments: [],
publishedAt: [],
}
communityList = new CommunityList(communityList);
console.log("creating communityList: " + communityList);
}
let citem = communityList.items;
for (let i = 0; i < 5; i ++) {
let tmp = citem.find(function(a){return a[0] === body.items[i]});
if (tmp) {
tmp[1] = parseInt(tmp[1]) + (5-i);
console.log(tmp);
}
else {
citem.push([body.items[i], (5-i)]);
}
}
communityList.items = citem;
communityList.publishedAt = [d.getFullYear(), (d.getMonth()+1), d.getDate()];
communityList.save().then(() => { console.log('updated communityList!')});
})
top5List.name = body.name;
top5List.items = body.items;
top5List.likes = [];
top5List.dislikes = [];
top5List.views = 0;
top5List.comments = [];
top5List.published = true;
top5List.publishedAt = [d.getFullYear(), d.getMonth()+1, d.getDate()];
top5List
.save()
.then(() => {
console.log("SUCCESS!!!");
return res.status(200).json({
success: true,
id: top5List._id,
message: 'Top 5 List updated!',
})
})
.catch(error => {
console.log("FAILURE: " + JSON.stringify(error));
return res.status(404).json({
error,
errorMessage: 'Top 5 List not updated!',
})
})
})
}
}).catch(err => console.log(err));
}
deleteTop5List = async (req, res) => {
let _id = '';
auth.verify(req, res, async function () {
_id = req.userId;
});
let owner = 'Guest';
if (_id !== 'Guest') {
owner = await getOwner(_id);
}
await Top5List.findById({ _id: req.params.id }, (err, top5List) => {
if (err || top5List.owner !== owner) {
return res.status(404).json({
err,
errorMessage: 'Top 5 List not found!',
})
}
let d = new Date;
if (top5List.published){
CommunityList.findOne({name: top5List.name}, (err, communityList) => {
console.log("community list found: " + communityList);
if (err || !communityList) {
return res.status(403).json({
err,
errorMessage: 'Error with CommunityList',
})
}
let citem = communityList.items;
console.log(citem);
console.log(top5List.items);
for (let i = 0; i < 5; i ++) {
let tmp = citem.find(function(a){return a[0] === top5List.items[i]});
if (tmp) {
tmp[1] -= (5-i);
if (tmp[1] < 0) {
console.log('vote<0)');
}
else if (tmp[1] == 0) {
let index = citem.indexOf(tmp);
citem.splice(index, 1);
}
}
else {
console.log('Error with CommunityList(cannot find item)\ntmp:',tmp, '\ncitem:', citem);
}
}
console.log(citem);
if (citem.length < 5) {
if (citem.length > 0) {
console.log('length is less than 5');
}
else {
console.log('deleting ' + communityList);
CommunityList.findOneAndDelete({_id: communityList._id}, () => {})
}
}
else {
communityList.items = citem;
communityList.publishedAt = [d.getFullYear(), (d.getMonth()+1), d.getDate()];
communityList.save();
}
})
}
Top5List.findOneAndDelete({ _id: req.params.id }, () => {
return res.status(200).json({ success: true, data: top5List })
}).catch(err => console.log(err))
})
}
getTop5ListById = async (req, res) => {
let _id = '';
auth.verify(req, res, async function () {
_id = req.userId;
});
let owner = 'Guest';
if (_id !== 'Guest') {
owner = await getOwner(_id);
}
console.log(owner)
await Top5List.findById({ _id: req.params.id }, (err, list) => {
if (err) {
return res.status(400).json({ success: false, errorMessage: err });
}
if (!list||!list.published && list.owner !== owner) {
return res.status(400).json({success: false, errorMessage: "List does not exists"});
}
let pair = {
_id: list._id,
name: list.name,
items: list.items,
owner: list.owner,
likes: list.likes.length,
dislikes: list.dislikes.length,
views: list.views,
comments: list.comments,
published: list.published,
publishedAt: list.publishedAt,
};
return res.status(200).json({ success: true, top5List: pair })
}).catch(err => console.log(err))
}
getTop5Lists = async (req, res) => {
let _id = '';
auth.verify(req, res, async function () {
_id = req.userId;
});
let owner = 'Guest';
if (_id !== 'Guest') {
owner = await getOwner(_id);
}
//let owner = 'a';
await Top5List.find({ $or:[{owner: owner}, {published: true}] }, (err, top5Lists) => {
if (err) {
return res.status(400).json({ success: false, errorMessage: err })
}
if (!top5Lists) {
console.log("!top5Lists.length");
return res
.status(404)
.json({ success: false, errorMessage: 'Top 5 Lists not found' })
}
else {
// PUT ALL THE LISTS INTO ID, NAME PAIRS
let pairs = [];
for (let key in top5Lists) {
let list = top5Lists[key];
let pair = {
_id: list._id,
name: list.name,
items: list.items,
owner: list.owner,
likes: list.likes.length,
dislikes: list.dislikes.length,
views: list.views,
comments: list.comments,
published: list.published,
publishedAt: list.publishedAt,
};
pairs.push(pair);
}
return res.status(200).json({ success: true, idNamePairs: pairs })
}
}).catch(err => console.log(err))
}
getCommunityLists = async (req, res) => {
await CommunityList.find({}, (err, communityLists) => {
if (err) {
return res.status(400).json({ success: false, errorMessage: err })
}
if (!communityLists) {
console.log("!communityLists.length");
return res
.status(404)
.json({ success: false, errorMessage: 'Top 5 Lists not found' })
}
else {
// PUT ALL THE LISTS INTO ID, NAME PAIRS
let pairs = [];
for (let key in communityLists) {
let list = communityLists[key];
let items = list.items.sort(function(a, b){return b[1] - a[1]});
let temp = [];
for (let i = 0; i < 5; i ++) {
temp.push(items[i][0] + ' (' + items[i][1] + ' votes)' );
}
let pair = {
_id: list._id,
name: list.name,
items: temp,
owner: 'Community',
likes: list.likes.length,
dislikes: list.dislikes.length,
views: list.views,
comments: list.comments,
published: true,
publishedAt: list.publishedAt,
};
pairs.push(pair);
}
return res.status(200).json({ success: true, idNamePairs: pairs })
}
}).catch(err => console.log(err))
}
getCommunityListById = async (req, res) => {
await CommunityList.findById({ _id: req.params.id }, (err, list) => {
console.log("communityList found: " + JSON.stringify(list));
if (err) {
return res.status(400).json({ success: false, errorMessage: err });
}
let items = list.items.sort(function(a, b){return b[1] - a[1]});
let temp = [];
for (let i = 0; i < 5; i ++) {
temp.push(items[i][0] + ' (' + items[i][1] + ' votes)' );
}
let pair = {
_id: list._id,
name: list.name,
items: temp,
owner: 'Community',
likes: list.likes.length,
dislikes: list.dislikes.length,
views: list.views,
comments: list.comments,
published: true,
publishedAt: list.publishedAt,
};
return res.status(200).json({ success: true, top5List: pair })
}).catch(err => console.log(err))
}
updateTop5ListViews = async (req, res) => {
await Top5List.findById({ _id: req.params.id }, (err, top5List) => {
console.log("top5List found: " + JSON.stringify(top5List));
if (!top5List||err) {
return res.status(404).json({
err,
errorMessage: 'Top 5 List not found!',
})
}
if (top5List.published) {
top5List.views += 1;
}
top5List
.save()
.then(() => {
console.log("SUCCESS!!!");
return res.status(200).json({
success: true,
id: top5List._id,
message: 'Top 5 List views updated!',
})
})
.catch(error => {
console.log("FAILURE: " + JSON.stringify(error));
return res.status(404).json({
error,
errorMessage: 'Top 5 List views not updated!',
})
})
})
}
updateTop5ListLikes = async (req, res) => {
let _id = '';
auth.verify(req, res, async function () {
_id = req.userId;
});
let owner = 'Guest';
if (_id !== 'Guest') {
owner = await getOwner(_id);
await Top5List.findById({ _id: req.params.id }, (err, top5List) => {
console.log("top5List found: " + JSON.stringify(top5List));
if (!top5List||err) {
return res.status(404).json({
err,
errorMessage: 'Top 5 List not found!',
})
}
if (top5List.published) {
let likes = top5List.likes;
let dislikes = top5List.dislikes;
if (likes.find((a) => a === owner)) {
let index = likes.indexOf(owner);
likes.splice(index, 1);
}
else {
likes.push(owner);
}
if (dislikes.find((a) => a === owner)) {
let index = likes.indexOf(owner);
dislikes.splice(index, 1);
}
top5List.likes = likes;
}
top5List
.save()
.then(() => {
let pair = {
_id: top5List._id,
name: top5List.name,
items: top5List.items,
owner: top5List.owner,
likes: top5List.likes.length,
dislikes: top5List.dislikes.length,
views: top5List.views,
comments: top5List.comments,
published: top5List.published,
publishedAt: top5List.publishedAt,
};
console.log("SUCCESS!!!");
return res.status(200).json({
success: true,
top5List: pair,
})
})
.catch(error => {
console.log("FAILURE: " + JSON.stringify(error));
return res.status(404).json({
error,
errorMessage: 'Top 5 List views not updated!',
})
})
})
}
else {
return res.status(403).json({
success: false,
errorMessage: 'Please login to like/dislike',
})
}
}
updateTop5ListDislikes = async (req, res) => {
let _id = '';
auth.verify(req, res, async function () {
_id = req.userId;
});
let owner = 'Guest';
if (_id !== 'Guest') {
owner = await getOwner(_id);
await Top5List.findById({ _id: req.params.id }, (err, top5List) => {
console.log("top5List found: " + JSON.stringify(top5List));
if (!top5List||err) {
return res.status(404).json({
err,
errorMessage: 'Top 5 List not found!',
})
}
if (top5List.published) {
let likes = top5List.likes;
let dislikes = top5List.dislikes;
if (likes.find((a) => a === owner)) {
let index = likes.indexOf(owner);
likes.splice(index, 1);
}
if (dislikes.find((a) => a === owner)) {
let index = likes.indexOf(owner);
dislikes.splice(index, 1);
}
else {
dislikes.push(owner);
}
top5List.dislikes = dislikes;
}
top5List
.save()
.then(() => {
let pair = {
_id: top5List._id,
name: top5List.name,
items: top5List.items,
owner: top5List.owner,
likes: top5List.likes.length,
dislikes: top5List.dislikes.length,
views: top5List.views,
comments: top5List.comments,
published: top5List.published,
publishedAt: top5List.publishedAt,
};
console.log("SUCCESS!!!");
return res.status(200).json({
success: true,
top5List: pair,
})
})
.catch(error => {
console.log("FAILURE: " + JSON.stringify(error));
return res.status(404).json({
error,
errorMessage: 'Top 5 List views not updated!',
})
})
})
}
else {
return res.status(403).json({
success: false,
errorMessage: 'Please login to like/dislike',
})
}
}
updateCommunityListViews = async (req, res) => {
console.log('get message');
await CommunityList.findById({ _id: req.params.id }, (err, communityList) => {
console.log("communityList found: " + JSON.stringify(communityList));
if (err) {
return res.status(404).json({
err,
errorMessage: 'Top 5 List not found!',
})
}
communityList.views += 1;
communityList
.save()
.then(() => {
console.log("SUCCESS!!!");
return res.status(200).json({
success: true,
id: communityList._id,
message: 'Top 5 List views updated!',
})
})
.catch(error => {
console.log("FAILURE: " + JSON.stringify(error));
return res.status(404).json({
error,
errorMessage: 'Top 5 List views not updated!',
})
})
})
}
updateCommunityListLikes = async (req, res) => {
let _id = '';
auth.verify(req, res, async function () {
_id = req.userId;
});
let owner = 'Guest';
if (_id !== 'Guest') {
owner = await getOwner(_id);
await CommunityList.findOne({ _id: req.params.id }, (err, top5List) => {
console.log("top5List found: " + JSON.stringify(top5List));
if (err) {
return res.status(404).json({
err,
errorMessage: 'Top 5 List not found!',
})
}
let likes = top5List.likes;
let dislikes = top5List.dislikes;
if (likes.find((a) => a === owner)) {
let index = likes.indexOf(owner);
likes.splice(index, 1);
}
else {
likes.push(owner);
}
if (dislikes.find((a) => a === owner)) {
let index = likes.indexOf(owner);
dislikes.splice(index, 1);
}
top5List.likes = likes;
top5List
.save()
.then(() => {
let pair = {
_id: top5List._id,
name: top5List.name,
items: top5List.items,
owner: 'Community',
likes: top5List.likes.length,
dislikes: top5List.dislikes.length,
views: top5List.views,
comments: top5List.comments,
published: true,
publishedAt: top5List.publishedAt,
};
console.log("SUCCESS!!!");
return res.status(200).json({
success: true,
top5List: pair,
})
})
.catch(error => {
console.log("FAILURE: " + JSON.stringify(error));
return res.status(404).json({
error,
errorMessage: 'Top 5 List views not updated!',
})
})
})
}
else {
return res.status(403).json({
success: false,
errorMessage: 'Please login to like/dislike',
})
}
}
updateCommunityListDislikes = async (req, res) => {
let _id = '';
auth.verify(req, res, async function () {
_id = req.userId;
});
let owner = 'Guest';
if (_id !== 'Guest') {
owner = await getOwner(_id);
await CommunityList.findOne({ _id: req.params.id }, (err, top5List) => {
console.log("top5List found: " + JSON.stringify(top5List));
if (err) {
return res.status(404).json({
err,
errorMessage: 'Top 5 List not found!',
})
}
let likes = top5List.likes;
let dislikes = top5List.dislikes;
if (likes.find((a) => a === owner)) {
let index = likes.indexOf(owner);
likes.splice(index, 1);
}
if (dislikes.find((a) => a === owner)) {
let index = likes.indexOf(owner);
dislikes.splice(index, 1);
}
else {
dislikes.push(owner);
}
top5List.dislikes = dislikes;
top5List
.save()
.then(() => {
let pair = {
_id: top5List._id,
name: top5List.name,
items: top5List.items,
owner: 'Community',
likes: top5List.likes.length,
dislikes: top5List.dislikes.length,
views: top5List.views,
comments: top5List.comments,
published: true,
publishedAt: top5List.publishedAt,
};
console.log("SUCCESS!!!");
return res.status(200).json({
success: true,
top5List: pair,
})
})
.catch(error => {
console.log("FAILURE: " + JSON.stringify(error));
return res.status(404).json({
error,
errorMessage: 'Top 5 List views not updated!',
})
})
})
}
else {
return res.status(403).json({
success: false,
errorMessage: 'Please login to like/dislike',
})
}
}
updateCommunityListComments = async (req, res) => {
const body = req.body
console.log('updating c list commens');
let _id = '';
auth.verify(req, res, async function () {
_id = req.userId;
});
let owner = 'Guest';
if (_id !== 'Guest') {
owner = await getOwner(_id);
await CommunityList.findOne({ _id: req.params.id }, (err, top5List) => {
console.log("top5List found: " + JSON.stringify(top5List));
if (!top5List || err) {
return res.status(404).json({
err,
errorMessage: 'Top 5 List not found!',
})
}
top5List.comments.push([owner, body.comment])
top5List
.save()
.then(() => {
let pair = {
_id: top5List._id,
name: top5List.name,
items: top5List.items,
owner: 'Community',
likes: top5List.likes.length,
dislikes: top5List.dislikes.length,
views: top5List.views,
comments: top5List.comments,
published: true,
publishedAt: top5List.publishedAt,
};
console.log("SUCCESS!!!");
return res.status(200).json({
success: true,
top5List: pair,
})
})
.catch(error => {
console.log("FAILURE: " + JSON.stringify(error));
return res.status(404).json({
error,
errorMessage: 'Top 5 List views not updated!',
})
})
})
}
else {
return res.status(403).json({
success: false,
errorMessage: 'Please login to leave comments',
})
}
}
updateTop5ListComments = async (req, res) => {
const body = req.body
let _id = '';
auth.verify(req, res, async function () {
_id = req.userId;
});
let owner = 'Guest';
if (_id !== 'Guest') {
owner = await getOwner(_id);
await Top5List.findOne({ _id: req.params.id }, (err, top5List) => {
console.log("top5List found: " + JSON.stringify(top5List));
if (!top5List || err) {
return res.status(404).json({
err,
errorMessage: 'Top 5 List not found!',
})
}
if (top5List.published) {
top5List.comments.push([owner, body.comment])
top5List
.save()
.then(() => {
let pair = {
_id: top5List._id,
name: top5List.name,
items: top5List.items,
owner: top5List.owner,
likes: top5List.likes.length,
dislikes: top5List.dislikes.length,
views: top5List.views,
comments: top5List.comments,
published: top5List.published,
publishedAt: top5List.publishedAt,
};
console.log("SUCCESS!!!");
return res.status(200).json({
success: true,
top5List: pair,
})
})
.catch(error => {
console.log("FAILURE: " + JSON.stringify(error));
return res.status(404).json({
error,
errorMessage: 'Top 5 List views not updated!',
})
})
}
})
}
else {
return res.status(403).json({
success: false,
errorMessage: 'Please login to leave comments',
})
}
}
getOwner = async function (_id) {
const loggedInUser = await User.findOne({ _id: _id});
return (loggedInUser.firstName + ' ' + loggedInUser.lastName);
}
module.exports = {
createTop5List,
updateTop5List,
publishTop5List,
deleteTop5List,
getTop5Lists,
getTop5ListById,
getCommunityLists,
getCommunityListById,
updateTop5ListViews,
updateTop5ListLikes,
updateTop5ListDislikes,
updateCommunityListViews,
updateCommunityListLikes,
updateCommunityListDislikes,
updateTop5ListComments,
updateCommunityListComments,
}