diff --git a/api/config/config.example.json b/api/config/config.example.json index 3e65ddb1b..655219439 100644 --- a/api/config/config.example.json +++ b/api/config/config.example.json @@ -33,7 +33,9 @@ "ENABLED": false }, "membershipPayment": { - "API_KEY": "GO_AWAY_LOL" + "API_KEY": "GO_AWAY_LOL", + "DCD_ENABLED": false, + "DCD_URL": "NOT_SET" }, "secretKey": "super duper secret key", "SCEvents": { diff --git a/api/main_endpoints/routes/MembershipPayment.js b/api/main_endpoints/routes/MembershipPayment.js index 994555934..57cea4591 100644 --- a/api/main_endpoints/routes/MembershipPayment.js +++ b/api/main_endpoints/routes/MembershipPayment.js @@ -11,8 +11,12 @@ const { TOO_MANY_REQUESTS } = require('../../util/constants').STATUS_CODES; const membershipState = require('../../util/constants').MEMBERSHIP_STATE; -const { updateMembershipExpiration } = require('../util/userHelpers'); -const { findVerifyPayment, storePayment } = require('../util/membershipPaymentQueries.js'); +const { updateMembershipDetails } = require('../util/userHelpers'); +const { + findVerifyPayment, + storePayment, + requestDoorCode +} = require('../util/membershipPaymentQueries.js'); const { decodeToken } = require('../util/token-functions.js'); const { membershipPayment = {} } = require('../../config/config.json'); const { API_KEY = 'GO_AWAY_LOL' } = membershipPayment; @@ -60,9 +64,20 @@ router.post('/verifyMembership', async (req, res) => { const { amount } = paymentDocument; const semestersToAdd = amount >= 30 ? 2 : 1; - const membershipUpdateResult = await updateMembershipExpiration( + let doorCode = null; + if (membershipPayment.DCD_ENABLED) { + doorCode = await requestDoorCode(); + if (!doorCode) { + logger.error('Error requesting door code for user:', userId); + } + } else { + logger.info('Door code distribution disabled, skipping door code request for user:', userId); + } + + const membershipUpdateResult = await updateMembershipDetails( decoded.token._id, - semestersToAdd + semestersToAdd, + doorCode ); if (!membershipUpdateResult) { diff --git a/api/main_endpoints/util/membershipPaymentQueries.js b/api/main_endpoints/util/membershipPaymentQueries.js index 6f33820b1..fbce67790 100644 --- a/api/main_endpoints/util/membershipPaymentQueries.js +++ b/api/main_endpoints/util/membershipPaymentQueries.js @@ -1,5 +1,8 @@ const MembershipPayment = require('../models/MembershipPayment'); const logger = require('../../util/logger'); +const axios = require('axios'); +const { membershipPayment = {} } = require('../../config/config.json'); +const { DCD_URL } = membershipPayment; const status = { PENDING: 'pending', @@ -68,4 +71,19 @@ function storePayment({ confirmationCode, amount, payerName, note, transactionId }); } -module.exports = { findVerifyPayment, storePayment }; +async function requestDoorCode() { + try { + const response = await axios.get(DCD_URL + '/getDoorCode'); + if (response.status === 200 && response.data && response.data.code) { + return response.data.code; + } else { + logger.error('requestDoorCode received unexpected response from DCD:', response.status, response.data); + return null; + } + } catch (error) { + logger.error('requestDoorCode encountered an error:', error); + return null; + } +} + +module.exports = { findVerifyPayment, storePayment, requestDoorCode }; diff --git a/api/main_endpoints/util/userHelpers.js b/api/main_endpoints/util/userHelpers.js index c9e0c3c0f..49aedc0f4 100644 --- a/api/main_endpoints/util/userHelpers.js +++ b/api/main_endpoints/util/userHelpers.js @@ -200,12 +200,13 @@ function checkIfPageCountResets(lastLogin) { } /** - * Update a user's membershipValidUntil date + * Update a user's membership details when they are verified as a member * @param {String} userId - The user's ID * @param {Number} numberOfSemestersToSignUpFor - Number of semesters to extend + * @param {String} doorCode - The door code to assign to the user, if applicable * @returns {Object} result - Contains success status and message */ -async function updateMembershipExpiration(userId, numberOfSemestersToSignUpFor) { +async function updateMembershipDetails(userId, numberOfSemestersToSignUpFor, doorCode) { try { const newExpiration = getMemberExpirationDate(numberOfSemestersToSignUpFor); const user = await User.findByIdAndUpdate( @@ -213,6 +214,7 @@ async function updateMembershipExpiration(userId, numberOfSemestersToSignUpFor) { membershipValidUntil: newExpiration, accessLevel: membershipState.MEMBER, + doorCode: doorCode || undefined }, { new: true }, ); @@ -234,5 +236,5 @@ module.exports = { userWithEmailExists, checkIfPageCountResets, findPasswordReset, - updateMembershipExpiration + updateMembershipDetails };