Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
15 changes: 14 additions & 1 deletion api/main_endpoints/routes/Auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,12 @@ const {
const membershipState = require('../../util/constants').MEMBERSHIP_STATE;
const PASSWORD_RESET_EXPIRATION = require('../../util/constants').PASSWORD_RESET_EXPIRATION;
const { sendVerificationEmail, sendPasswordReset } = require('../util/emailHelpers');
const { userWithEmailExists, checkIfPageCountResets, findPasswordReset } = require('../util/userHelpers');
const {
userWithEmailExists,
checkIfPageCountResets,
findPasswordReset,
expireMembershipIfLapsed
} = require('../util/userHelpers');

const AuditLogActions = require('../util/auditLogActions.js');
const AuditLog = require('../models/AuditLog.js');
Expand Down Expand Up @@ -170,13 +175,21 @@ router.post('/login', async (req, res) => {
return res.status(UNAUTHORIZED).send({ message: `Account ${email} is banned lol` });
}

// Nothing else expires memberships, so catch a lapsed one here and strip
// the door code before it can be handed back out on the profile page
const membershipLapsed = expireMembershipIfLapsed(user);

// Handle Page Reset
if (checkIfPageCountResets(user.lastLogin)) {
user.pagesPrinted = 0;
}
user.lastLogin = new Date();
await user.save();

if (membershipLapsed) {
logger.info('Membership lapsed, revoked door code for user:', String(user._id));
}

const token = jwt.sign({
_id: user._id,
accessLevel: user.accessLevel,
Expand Down
26 changes: 26 additions & 0 deletions api/main_endpoints/util/userHelpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -228,9 +228,35 @@ async function updateMembershipDetails(userId, numberOfSemestersToSignUpFor, doo
}
}

/**
* Revoke a member's benefits once their membership has lapsed. Officers and
* above aren't subject to membership expiration, so they keep their door code.
* Mutates the document in place; the caller is responsible for saving it.
* @param {Object} user - The user document to check
* @returns {Boolean} whether the membership had lapsed
*/
function expireMembershipIfLapsed(user) {
if (!user || user.accessLevel !== membershipState.MEMBER) {
return false;
}
if (!user.membershipValidUntil) {
return false;
}
// `$gt` is how getNewPaidMembersThisSemester counts active members, so an
// expiration landing exactly on now counts as lapsed here too
if (new Date(user.membershipValidUntil) > new Date()) {
return false;
}

user.accessLevel = membershipState.NON_MEMBER;
user.doorCode = undefined;
return true;
}

module.exports = {
registerUser,
getMemberExpirationDate,
expireMembershipIfLapsed,
testPasswordStrength,
hashPassword,
userWithEmailExists,
Expand Down
Loading