From 77f836842b0fda4010ef486e57c674468bb727f4 Mon Sep 17 00:00:00 2001 From: Mike Fitzpatrick Date: Wed, 17 Jul 2019 03:21:49 -0400 Subject: [PATCH] - Tweaks --- models/auction.js | 76 ++++++++++++++++++++++++++++++++++++++++ models/bid.js | 5 +++ models/event.js | 10 ++++-- models/item.js | 4 +++ models/user.js | 6 ++++ routes/auction.js | 43 +++++++++++++++++++++++ routes/index.js | 1 + routes/items.js | 1 - routes/users.js | 2 +- strategies/auth/index.js | 1 + 10 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 models/auction.js create mode 100644 routes/auction.js diff --git a/models/auction.js b/models/auction.js new file mode 100644 index 0000000..27df49b --- /dev/null +++ b/models/auction.js @@ -0,0 +1,76 @@ +const mongoose = require('mongoose'); +const timestamps = require('mongoose-timestamp'); + +const ItemAuctionStatusSchema = new mongoose.Schema( + { + bidCount: Number, + bidders: [ mongoose.Schema.Types.ObjectId ], + currentBid: Number, + currentMax: Number, + winners: [ mongoose.Schema.Types.ObjectId ], + }, + { minimize: false }, +); + +const AuctionSchema = new mongoose.Schema( + { + eventId: { + type: String, + required: true, + trim: true, + }, + scoreboard: [ ItemAuctionStatusSchema ], + }, + { minimize: false }, +); + +AuctionSchema.plugin(timestamps); + +AuctionSchema.statics.getAuctionStatus = function(eventId, bidderId, callback = () => {}) { + this.findOne({ _id: eventId }, (err, event) => { + if (err) { + return next(err); + } + + const statusObject = []; + + if (event) { + statusObject.push(event.scoreboard.map((item) => ({ + id: item._id, + bidCount: item.bidCount, + currentPrice: item.currentBid, + isBidding: item.bidders.indexOf(bidderId) > -1, + isWinning: item.winners.indexOf(bidderId) > -1, + }))); + } + + return callback(null, statusObject); + }); +}; + +AuctionSchema.statics.getAuctionItemStatus = function(eventId, itemId, bidderId, callback = () => {}) { + this.findOne({ _id: eventId }, (err, event) => { + if (err) { + return next(err); + } + + const itemStatus = {}; + + if (event) { + const item = event.scoreboard.id(itemId); + if (item) { + itemStatus._id = item._id; + itemStatus.bidCount = item.bidCount; + itemStatus.currentPrice = item.currentBid; + itemStatus.isBidding = item.bidders.indexOf(bidderId) > -1; + itemStatus.isWinning = item.winners.indexOf(bidderId) > -1; + } + } + + return callback(null, itemStatus); + }); +}; + + +const Auction = mongoose.model('Auction', AuctionSchema); +module.exports = Auction; diff --git a/models/bid.js b/models/bid.js index 9a500e4..3e58027 100644 --- a/models/bid.js +++ b/models/bid.js @@ -3,6 +3,11 @@ const timestamps = require('mongoose-timestamp'); const BidSchema = new mongoose.Schema( { + eventId: { + type: String, + required: true, + trim: true, + }, itemId: { type: String, required: true, diff --git a/models/event.js b/models/event.js index bf29779..c504387 100644 --- a/models/event.js +++ b/models/event.js @@ -1,7 +1,9 @@ -const config = require('../config.js'); const mongoose = require('mongoose'); const timestamps = require('mongoose-timestamp'); +const config = require('../config.js'); +const Item = require('./item'); + const PostSchema = new mongoose.Schema( { author: String, @@ -133,7 +135,11 @@ const EventSchema = new mongoose.Schema( EventSchema.plugin(timestamps); -EventSchema.path('images').get(v => `${config.assetStoreUrl}${v.url}`) +EventSchema.path('images').get(v => `${config.assetStoreUrl}${v.url}`); + +EventSchema.methods.getEventAuctionItems = function(callback = () => {}) { + return Item.getAuctionItemsByEvent(this.id, callback); +}; const Event = mongoose.model('Event', EventSchema); module.exports = Event; diff --git a/models/item.js b/models/item.js index b58e4f3..bc905c4 100644 --- a/models/item.js +++ b/models/item.js @@ -131,5 +131,9 @@ ItemSchema.statics.addBatch = function(data = [], callback = () => {}) { }; +ItemSchema.statics.getAuctionItemsByEvent = function(eventId, callback = () => {}) { + return this.find({ eventId, type: 'auction' }, callback); +}; + const Item = mongoose.model('Item', ItemSchema); module.exports = Item; diff --git a/models/user.js b/models/user.js index d808272..77f94e2 100644 --- a/models/user.js +++ b/models/user.js @@ -244,6 +244,7 @@ UserSchema.methods.toAuthJSON = function () { email: this.email, token: this.generateJWT(), user: { + id: this._id, nomDeBid: nomDeBid, email: this.email, firstName: this.firstName, @@ -266,6 +267,11 @@ UserSchema.methods.toProfileJSON = function () { email: this.email, firstName: this.firstName, generatedNomDeBid: !hasNomDeBid, + hasLinkedApple: !!this.getAuthStrategy('apple'), + hasLinkedFacebook: !!this.getAuthStrategy('facebook'), + hasLinkedGoogle: !!this.getAuthStrategy('google'), + hasLocalAccount: !!this.getAuthStrategy('local'), + _id: this.id, isAllowedToBid: this.isAllowedToBid, isOrganizationEmployee: this.isOrganizationEmployee, isVerified: this.isVerified, diff --git a/routes/auction.js b/routes/auction.js new file mode 100644 index 0000000..6b3f198 --- /dev/null +++ b/routes/auction.js @@ -0,0 +1,43 @@ +const errors = require('restify-errors'); + +const config = require('../config'); +const Auction = require('../models/auction'); +const Bid = require('../models/bid'); +const User = require('../models/user'); + +module.exports = function (server, auth) { + + server.get('/auction', auth.basic, function (req, res, next) { + Auction.getAuctionStatus(null, req.user.bidderId, (err, doc) => { + if (err) { + return next(err); + } + + res.send(doc); + next(); + }); + }); + + server.get('/auction/:event_id', auth.basic, function (req, res, next) { + Auction.getAuctionStatus(req.params.event_id, req.user.bidderId, (err, doc) => { + if (err) { + return next(err); + } + + res.send(doc); + next(); + }); + }); + + server.get('/auction/:event_id/:item_id', auth.basic, function (req, res, next) { + const { event_id: eventId, item_id: itemId } = req.params; + Auction.getAuctionItemStatus(eventId, itemId, req.user.bidderId, (err, doc) => { + if (err) { + return next(err); + } + + res.send(doc); + next(); + }); + }); +}; diff --git a/routes/index.js b/routes/index.js index b62f701..a8b57c0 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,4 +1,5 @@ module.exports = function(server, auth) { + require('./auction.js')(server, auth); require('./auth.js')(server, auth); require('./bids.js')(server, auth); require('./demo.js')(server, auth); diff --git a/routes/items.js b/routes/items.js index 196874f..c21c584 100644 --- a/routes/items.js +++ b/routes/items.js @@ -23,7 +23,6 @@ module.exports = function (server, auth) { server.get('/items', auth.basic, (req, res, next) => { const select = req.user.isManager ? STAFF : PUBLIC; - Item.find(req.params, select, function(err, docs) { if (err) { console.error(err); diff --git a/routes/users.js b/routes/users.js index 4bce319..83076bf 100644 --- a/routes/users.js +++ b/routes/users.js @@ -54,7 +54,7 @@ module.exports = function (server, auth) { ); } - res.send(doc); + res.send(req.user.isManager ? doc : doc.toProfileJSON()); next(); }); }); diff --git a/strategies/auth/index.js b/strategies/auth/index.js index 29d8c3c..575ebb8 100644 --- a/strategies/auth/index.js +++ b/strategies/auth/index.js @@ -1,4 +1,5 @@ const createRequestUserObject = (req, user) => ({ + bidderId: user.id || null, isGuest: !(user && user.id), isManager: user && user.isEventManager(), isSelf: user && user.id === req.params.user_id,