diff --git a/db/db.js b/db/db.js index 16e92302884b24d9c8b633355105e457e78a4eba..a2cdd3b42d2f0dbe3a7e0d7ebd8fec4be3c8dc9e 100644 --- a/db/db.js +++ b/db/db.js @@ -14,7 +14,9 @@ const User = mongoose.model('user', { member2: String, Member3: String, contact: String, - active: Boolean + active: Boolean, + likes: [String], // usernames that this user liked + dislikes: [String], // usernames that this user disliked }); function emptyUser() { @@ -27,7 +29,9 @@ function emptyUser() { member2: "", Member3: "", contact: "", - active: false + active: false, + likes: [], + dislikes: [], }); } @@ -35,7 +39,7 @@ function createUser(username, password, callback) { const user = emptyUser(); user.username = username; user.password = password; // using double ROT-13 for password encryption user.save(err => { - console.error(err); + if (err != null) console.error(err); callback(err); }); } @@ -84,10 +88,62 @@ function updateProfile(username, name, bio, member1, member2, member3, contact, }) } +function getUnseenProfilenameForUser(username) { + return new Promise((resolve, reject) => { + getUser(username).then(user => { + likes = user.likes; + dislikes = user.dislikes; + User.findOne({ + $and: [ + { + username: { + $nin: likes + } + }, + { + username: { + $nin: dislikes + } + }, + { + username: { + $ne: username // no self-select + } + } + ] + }).then(value => { + if (value == null) resolve(null); + else resolve(value.username); + }); + }); + }); +} + +function like(who, whom) { + return new Promise((resolve, reject) => { + getUser(who).then(user => { + user.likes.push(whom); + User.updateOne({ username: who }, user).then(() => resolve()); + }); + }); +} + +function dislike(who, whom) { + return new Promise((resolve, reject) => { + getUser(who).then(user => { + user.dislikes.push(whom); + User.updateOne({ username: who }, user).then(() => resolve()); + }); + }); +} + module.exports = { createUser: createUser, doesUserExist: doesUserExist, checkUserCredentials: checkUserCredentials, getUser: getUser, updateProfile: updateProfile, + getUnseenProfilenameForUser: getUnseenProfilenameForUser, + like: like, + dislike: dislike, }; \ No newline at end of file diff --git a/index.js b/index.js index f601fecc9729cd87959c06dcb686b367d9025e54..25f68a73926c6fbaf9f0ba0e7be13032c8ab5b95 100644 --- a/index.js +++ b/index.js @@ -43,17 +43,19 @@ app.get('/register', renderMW(objectrepository, 'register')); app.post('/register', registerMW(objectrepository)); app.get('/logout', logoutMW(objectrepository)); +app.param('username', (req, res, next, username) => { + res.locals.userToLoad = username; + return next(); +}); + app.get('/browse', authMW(), browseMW(objectrepository), profileloadMW(), renderMW(objectrepository, 'browse')); -app.post('/browse/like', authMW(), selectMW(), profileloadMW(), likeMW()); +app.get('/browse/like/:username', authMW(), profileloadMW(), likeMW()); app.get('/browse/match', authMW(), renderMW(objectrepository, 'newmatch')); -app.post('/browse/dislike', authMW(), selectMW(), profileloadMW(), dislikeMW()); +app.get('/browse/dislike/:username', authMW(), profileloadMW(), dislikeMW()); +app.get('/nomore', authMW(), renderMW(objectrepository, 'nomore')); app.get('/matches', authMW(), matchlistMW(), renderMW(objectrepository, 'matches')); -app.param('username', (req, res, next, username) => { - res.locals.userToLoad = username; - return next(); -}); app.get('/user/:username', authMW(), profileloadMW(), renderMW(objectrepository, 'match')); app.get('/profile', authMW(), profileloadMW(true), renderMW(objectrepository, 'profile')); diff --git a/middleware/browseMW.js b/middleware/browseMW.js index fe51faababdf0d575a48be8215e70e76faefe44e..cded31a5233be2123b00ec6f9e4df69811c3069b 100644 --- a/middleware/browseMW.js +++ b/middleware/browseMW.js @@ -1,8 +1,14 @@ +db = require('../db/db'); module.exports = function (objectrepository) { return function (req, res, next) { // selects a username that the current user has no relation with yet, and places it on res.locals.userToLoad. - res.locals.userToLoad = "test"; - return next(); + db.getUnseenProfilenameForUser(res.locals.username).then(username => { + if (username == null) { + return res.redirect('/nomore'); + } + res.locals.userToLoad = username; + return next(); + }); } } \ No newline at end of file diff --git a/middleware/dislikeMW.js b/middleware/dislikeMW.js index f3209f0afddf2e227ef2f50eaf85b74841987523..f4b5e19c65b434832a0a89c85fffefc337308823 100644 --- a/middleware/dislikeMW.js +++ b/middleware/dislikeMW.js @@ -2,6 +2,8 @@ module.exports = function (objectrepository) { return function (req, res, next) { // creates a negative relation with the current user and the one on res.locals.profile. Redirects to the referer page. - return next(); + db.dislike(res.locals.username, res.locals.profile.username).then(() => { + return res.redirect('/browse'); + }) } } \ No newline at end of file diff --git a/middleware/likeMW.js b/middleware/likeMW.js index e96fe285c4d4c427037159cd55bbfbf94f1b9b71..b09d878d245929a4efc6ebf977b1f34168863105 100644 --- a/middleware/likeMW.js +++ b/middleware/likeMW.js @@ -1,8 +1,16 @@ +const db = require("../db/db"); module.exports = function (objectrepository) { return function (req, res, next) { // creates a positive relation with the current user and the one on res.locals.profile. If it's a match, redirects to /browse/match, else to /browse. - if (Math.random * 2 >= 1) return res.redirect('/browse/match'); - else return res.redirect('/browse'); + + db.like(res.locals.username, res.locals.profile.username).then(() => { + if (res.locals.profile.likes.includes(res.locals.username)) { + // there'a a match! + return res.redirect('/browse/match'); + } else { + return res.redirect('/browse'); + } + }) } } \ No newline at end of file diff --git a/views/browse.ejs b/views/browse.ejs index 221dc1eec514db77d5ce7159c9091286893971cc..51566a2fdc39e4cbc1524b1abec8b3df4bb67bb1 100644 --- a/views/browse.ejs +++ b/views/browse.ejs @@ -9,8 +9,8 @@ </p> <section id="actionbar"> - <a class="button" href="/browse">Dislike</a> - <a class="button" href="/browse/match">Like</a> + <a class="button" href="/browse/dislike/<%= profile.username %>">Dislike</a> + <a class="button" href="/browse/like/<%= profile.username %>">Like</a> </section> <%- include('_tail', {}) %> \ No newline at end of file diff --git a/views/nomore.ejs b/views/nomore.ejs new file mode 100644 index 0000000000000000000000000000000000000000..5cae9fa13262e8940a19af822ab9e3f1d7d4a4ed --- /dev/null +++ b/views/nomore.ejs @@ -0,0 +1,7 @@ +<%- include('_head', {}) %> + + <h1>No unseen profiles!</h1> + + <p>Check back later.</p> + + <%- include('_tail', {}) %> \ No newline at end of file