abmp-npm 1.8.17 → 1.8.19

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 { members } = 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 members.getCurrentMember to bypass permissions
12
+ const elevatedGetCurrentMember = auth.elevate(members.getCurrentMember);
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 elevatedGetCurrentMember();
75
+ if (!member || !member._id) {
76
+ console.log(
77
+ 'member not found from members.getCurrentMember() 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.17",
3
+ "version": "1.8.19",
4
4
  "main": "index.js",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1",
@@ -32,7 +32,9 @@
32
32
  "@wix/essentials": "^0.1.28",
33
33
  "@wix/members": "^1.0.330",
34
34
  "@wix/site-location": "^1.31.0",
35
+ "@wix/site-members": "^1.32.0",
35
36
  "@wix/site-window": "^1.44.0",
37
+ "lodash": "^4.17.21",
36
38
  "ngeohash": "^0.6.3",
37
39
  "phone": "^3.1.67",
38
40
  "psdev-utils": "1.1.1"
@@ -99,13 +99,12 @@ async function personalDetailsOnReady({
99
99
 
100
100
  let memberData, isValid, isStudent;
101
101
 
102
- // Main initialization - Get from wixLocation
102
+ // Main initialization
103
103
  const queryParams = await wixLocation.query();
104
104
  const memberTokenId = queryParams.token;
105
105
  const baseUrl = await wixLocation.baseUrl();
106
106
 
107
107
  console.log('memberTokenId', memberTokenId);
108
- console.log('baseUrl', baseUrl);
109
108
 
110
109
  if (!memberTokenId) {
111
110
  showUnauthorizedState();