abmp-npm 1.8.16 → 1.8.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/backend/consts.js CHANGED
@@ -12,9 +12,22 @@ const PRECISION = 3;
12
12
  const MAX__MEMBERS_SEARCH_RESULTS = 120;
13
13
  const WIX_QUERY_MAX_LIMIT = 1000;
14
14
 
15
+ /**
16
+ * Member action types
17
+ * @readonly
18
+ * @enum {string}
19
+ */
20
+ const MEMBER_ACTIONS = {
21
+ UPDATE: 'update',
22
+ NEW: 'new',
23
+ DROP: 'drop',
24
+ NONE: 'none',
25
+ };
26
+
15
27
  module.exports = {
16
28
  CONFIG_KEYS,
17
29
  PRECISION,
18
30
  MAX__MEMBERS_SEARCH_RESULTS,
19
31
  WIX_QUERY_MAX_LIMIT,
32
+ MEMBER_ACTIONS,
20
33
  };
package/backend/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  module.exports = {
2
2
  ...require('./forms-methods'),
3
3
  ...require('./search-filters-methods'),
4
+ ...require('./members-data-methods'),
4
5
  };
@@ -1,7 +1,15 @@
1
+ const { auth } = require('@wix/essentials');
2
+ const { currentMember } = require('@wix/members');
3
+
1
4
  const { COLLECTIONS } = require('../public/consts');
2
5
 
6
+ const { MEMBER_ACTIONS } = require('./consts');
3
7
  const { wixData } = require('./elevated-modules');
4
8
  const { createSiteMember } = require('./members-area-methods');
9
+ const { formatDateToMonthYear, getAddressDisplayOptions, isStudent } = require('./utils');
10
+
11
+ // Elevate currentMember.getMember to bypass permissions
12
+ const elevatedGetMember = auth.elevate(currentMember.getMember);
5
13
 
6
14
  /**
7
15
  * Retrieves member data by member ID
@@ -49,7 +57,82 @@ async function createContactAndMemberIfNew(memberData) {
49
57
  }
50
58
  }
51
59
 
60
+ /**
61
+ * Validates member token and retrieves member data
62
+ * @param {string} memberIdInput - The member ID to validate
63
+ * @returns {Promise<{memberData: Object|null, isValid: boolean}>} Validation result with member data
64
+ */
65
+ async function validateMemberToken(memberIdInput) {
66
+ const invalidTokenResponse = { memberData: null, isValid: false };
67
+
68
+ if (!memberIdInput) {
69
+ return invalidTokenResponse;
70
+ }
71
+
72
+ try {
73
+ // Get current logged-in member using elevated permissions
74
+ const member = await elevatedGetMember();
75
+ if (!member || !member._id) {
76
+ console.log(
77
+ 'member not found from currentMember.getMember() for memberIdInput',
78
+ memberIdInput
79
+ );
80
+ return invalidTokenResponse;
81
+ }
82
+
83
+ // Query member data using elevated permissions (suppressAuth equivalent)
84
+ const { items } = await wixData
85
+ .query(COLLECTIONS.MEMBERS_DATA)
86
+ .eq('contactId', member._id)
87
+ .find();
88
+
89
+ console.log('items', items[0]);
90
+ console.log('member._id', member._id);
91
+
92
+ if (!items[0]?._id) {
93
+ const errorMessage = `No record found in DB for logged in Member [Corrupted Data - Duplicate Members? ] - There is no match in DB for currentMember: ${JSON.stringify(
94
+ { memberIdInput, currentMemberId: member._id }
95
+ )}`;
96
+ console.error(errorMessage);
97
+ throw new Error('CORRUPTED_MEMBER_DATA');
98
+ }
99
+
100
+ console.log(`Id found in DB for memberIdInput :${memberIdInput} is ${items[0]?._id}`);
101
+
102
+ const memberData = items[0];
103
+
104
+ // Format membership dates
105
+ memberData.memberships = memberData.memberships.map(membership => ({
106
+ ...membership,
107
+ membersince: formatDateToMonthYear(membership.membersince),
108
+ }));
109
+
110
+ const savedMemberId = memberData?._id;
111
+ const isValid = savedMemberId === memberIdInput;
112
+
113
+ if (!savedMemberId || !isValid) {
114
+ return invalidTokenResponse;
115
+ }
116
+
117
+ // Check if member is dropped
118
+ if (memberData.action === MEMBER_ACTIONS.DROP) {
119
+ return invalidTokenResponse;
120
+ }
121
+
122
+ // Add computed properties
123
+ memberData.addressDisplayOption = getAddressDisplayOptions(memberData);
124
+ console.log('memberData', memberData);
125
+ memberData.isStudent = isStudent(memberData);
126
+
127
+ return { memberData, isValid };
128
+ } catch (error) {
129
+ console.error('Error in validateMemberToken:', error);
130
+ throw error;
131
+ }
132
+ }
133
+
52
134
  module.exports = {
53
135
  findMemberByWixDataId,
54
136
  createContactAndMemberIfNew,
137
+ validateMemberToken,
55
138
  };
package/backend/utils.js CHANGED
@@ -39,7 +39,50 @@ const retrieveAllItems = async collectionName => {
39
39
  return allItems;
40
40
  };
41
41
 
42
+ /**
43
+ * Format date to Month Year string
44
+ * @param {string} dateString - The date string to format
45
+ * @returns {string} Formatted date (e.g., "January 2024")
46
+ */
47
+ function formatDateToMonthYear(dateString) {
48
+ if (!dateString) return '';
49
+
50
+ const date = new Date(dateString);
51
+ if (isNaN(date.getTime())) return '';
52
+ const options = { year: 'numeric', month: 'long' };
53
+ return date.toLocaleDateString('en-US', options);
54
+ }
55
+
56
+ /**
57
+ * Check if member is a student
58
+ * @param {Object} member - The member object
59
+ * @returns {boolean} True if member has student membership
60
+ */
61
+ function isStudent(member) {
62
+ const memberships = member?.memberships;
63
+ if (!Array.isArray(memberships)) return false;
64
+
65
+ return memberships.some(membership => membership.membertype === 'student');
66
+ }
67
+
68
+ /**
69
+ * Get address display options for member
70
+ * @param {Object} member - The member object
71
+ * @returns {Array} Address display options
72
+ */
73
+ function getAddressDisplayOptions(member) {
74
+ const addresses = member.addresses || [];
75
+ const displayOptions = member.addressDisplayOption || [];
76
+ if (addresses.length === 1 && addresses[0].key) {
77
+ return [{ key: addresses[0].key, isMain: true }];
78
+ }
79
+ return displayOptions;
80
+ }
81
+
42
82
  module.exports = {
43
83
  getSiteConfigs,
44
84
  retrieveAllItems,
85
+ formatDateToMonthYear,
86
+ isStudent,
87
+ getAddressDisplayOptions,
45
88
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "abmp-npm",
3
- "version": "1.8.16",
3
+ "version": "1.8.18",
4
4
  "main": "index.js",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1",
@@ -48,8 +48,6 @@ const FORM_SECTION_HANDLER_MAP = {
48
48
 
49
49
  async function personalDetailsOnReady({
50
50
  $w: _$w,
51
- memberTokenId,
52
- baseUrl,
53
51
  getInterestAll,
54
52
  saveRegistrationData,
55
53
  validateMemberToken,
@@ -102,14 +100,11 @@ async function personalDetailsOnReady({
102
100
  let memberData, isValid, isStudent;
103
101
 
104
102
  // Main initialization
105
- console.log('memberTokenId', memberTokenId);
106
- console.log('baseUrl', baseUrl);
107
-
108
- const memberTokenIdAPI = await wixLocation.query();
109
- console.log('memberTokenIdAPI with await', memberTokenIdAPI);
103
+ const queryParams = await wixLocation.query();
104
+ const memberTokenId = queryParams.token;
105
+ const baseUrl = await wixLocation.baseUrl();
110
106
 
111
- const baseUrlAPI = await wixLocation.baseUrl();
112
- console.log('baseUrlAPI with await', baseUrlAPI);
107
+ console.log('memberTokenId', memberTokenId);
113
108
 
114
109
  if (!memberTokenId) {
115
110
  showUnauthorizedState();