abmp-npm 1.8.44 → 1.9.1
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 +24 -7
- package/backend/daily-pull/consts.js +0 -3
- package/backend/daily-pull/sync-to-cms-methods.js +10 -6
- package/backend/daily-pull/utils.js +3 -3
- package/backend/data-hooks.js +29 -0
- package/backend/index.js +3 -1
- package/backend/jobs.js +14 -3
- package/backend/members-data-methods.js +231 -83
- package/backend/pac-api-methods.js +3 -4
- package/backend/search-filters-methods.js +3 -0
- package/backend/sso-methods.js +161 -0
- package/backend/tasks/consts.js +19 -0
- package/backend/tasks/index.js +6 -0
- package/backend/tasks/migration-methods.js +26 -0
- package/backend/tasks/tasks-configs.js +124 -0
- package/backend/tasks/tasks-helpers-methods.js +419 -0
- package/backend/tasks/tasks-process-methods.js +545 -0
- package/backend/utils.js +47 -28
- package/package.json +13 -2
- package/pages/LoadingPage.js +20 -0
- package/pages/Profile.js +2 -2
- package/pages/SaveAlerts.js +14 -0
- package/pages/index.js +2 -0
- package/pages/personalDetails.js +12 -8
- package/public/Utils/sharedUtils.js +0 -1
- package/public/consts.js +8 -23
- package/public/index.js +0 -1
- package/public/sso-auth-methods.js +43 -0
- package/backend/routers-methods.js +0 -182
- package/backend/routers-utils.js +0 -158
- package/backend/tasks.js +0 -37
package/backend/consts.js
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
const PAC_API_URL = 'https://members.abmp.com/eweb/api/Wix';
|
|
2
|
+
const SSO_TOKEN_AUTH_API_URL = 'https://members.professionalassistcorp.com/';
|
|
3
|
+
const SSO_TOKEN_AUTH_API_KEY = 'testkey';
|
|
4
|
+
|
|
1
5
|
/**
|
|
2
6
|
* Valid configuration keys for getSiteConfigs function
|
|
3
7
|
* @readonly
|
|
@@ -6,23 +10,36 @@
|
|
|
6
10
|
const CONFIG_KEYS = {
|
|
7
11
|
AUTOMATION_EMAIL_TRIGGER_ID: 'AUTOMATION_EMAIL_TRIGGER_ID',
|
|
8
12
|
SITE_ASSOCIATION: 'SITE_ASSOCIATION',
|
|
13
|
+
DEFAULT_PROFILE_SEO_DESCRIPTION: 'DEFAULT_PROFILE_SEO_DESCRIPTION',
|
|
14
|
+
INTERESTS_API_URL: 'INTERESTS_API_URL',
|
|
15
|
+
SITE_LOGO_URL: 'SITE_LOGO_URL',
|
|
16
|
+
MEMBERS_EXTERNAL_PORTAL_URL: 'MEMBERS_EXTERNAL_PORTAL_URL',
|
|
17
|
+
DEFAULT_PROFILE_IMAGE: 'DEFAULT_PROFILE_IMAGE',
|
|
9
18
|
};
|
|
10
19
|
|
|
11
20
|
const MAX__MEMBERS_SEARCH_RESULTS = 120;
|
|
12
21
|
const WIX_QUERY_MAX_LIMIT = 1000;
|
|
13
22
|
|
|
14
|
-
const TASKS_NAMES = {
|
|
15
|
-
ScheduleDailyMembersDataSync: 'ScheduleDailyMembersDataSync',
|
|
16
|
-
ScheduleMembersDataPerAction: 'ScheduleMembersDataPerAction',
|
|
17
|
-
SyncMembers: 'SyncMembers',
|
|
18
|
-
};
|
|
19
|
-
|
|
20
23
|
const GEO_HASH_PRECISION = 3;
|
|
21
24
|
|
|
25
|
+
const COMPILED_FILTERS_FIELDS = {
|
|
26
|
+
COMPILED_STATE_LIST: 'COMPILED_STATE_LIST',
|
|
27
|
+
COMPILED_AREAS_OF_PRACTICES: 'COMPILED_AREAS_OF_PRACTICES',
|
|
28
|
+
COMPILED_STATE_CITY_MAP: 'COMPILED_STATE_CITY_MAP',
|
|
29
|
+
};
|
|
30
|
+
const MEMBERSHIPS_TYPES = {
|
|
31
|
+
STUDENT: 'Student',
|
|
32
|
+
PAC_STAFF: 'PAC STAFF',
|
|
33
|
+
};
|
|
34
|
+
|
|
22
35
|
module.exports = {
|
|
23
36
|
CONFIG_KEYS,
|
|
24
37
|
MAX__MEMBERS_SEARCH_RESULTS,
|
|
25
38
|
WIX_QUERY_MAX_LIMIT,
|
|
26
|
-
TASKS_NAMES,
|
|
27
39
|
GEO_HASH_PRECISION,
|
|
40
|
+
PAC_API_URL,
|
|
41
|
+
COMPILED_FILTERS_FIELDS,
|
|
42
|
+
MEMBERSHIPS_TYPES,
|
|
43
|
+
SSO_TOKEN_AUTH_API_URL,
|
|
44
|
+
SSO_TOKEN_AUTH_API_KEY,
|
|
28
45
|
};
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
const PAC_API_URL = 'https://members.abmp.com/eweb/api/Wix';
|
|
2
|
-
|
|
3
1
|
const MEMBER_ACTIONS = {
|
|
4
2
|
UPDATE: 'update',
|
|
5
3
|
NEW: 'new',
|
|
@@ -30,5 +28,4 @@ module.exports = {
|
|
|
30
28
|
MEMBER_ACTIONS,
|
|
31
29
|
ADDRESS_VISIBILITY_OPTIONS,
|
|
32
30
|
DEFAULT_MEMBER_DISPLAY_SETTINGS,
|
|
33
|
-
PAC_API_URL,
|
|
34
31
|
};
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
const { taskManager } = require('psdev-task-manager');
|
|
2
2
|
|
|
3
|
-
const {
|
|
3
|
+
const { CONFIG_KEYS } = require('../consts');
|
|
4
4
|
const { fetchPACMembers } = require('../pac-api-methods');
|
|
5
|
+
const { TASKS_NAMES } = require('../tasks/consts');
|
|
6
|
+
const { getSiteConfigs } = require('../utils');
|
|
5
7
|
|
|
6
8
|
const { bulkProcessAndSaveMemberData } = require('./bulk-process-methods');
|
|
7
|
-
const { isUpdatedMember,
|
|
9
|
+
const { isUpdatedMember, isSiteAssociatedMember } = require('./utils');
|
|
8
10
|
|
|
9
11
|
async function syncMembersDataPerAction(action) {
|
|
10
12
|
try {
|
|
@@ -73,8 +75,10 @@ async function syncMembersDataPerAction(action) {
|
|
|
73
75
|
async function synchronizeSinglePage(taskObject) {
|
|
74
76
|
const { pageNumber, action } = taskObject.data;
|
|
75
77
|
try {
|
|
76
|
-
const memberDataResponse = await
|
|
77
|
-
|
|
78
|
+
const [siteAssociation, memberDataResponse] = await Promise.all([
|
|
79
|
+
getSiteConfigs(CONFIG_KEYS.SITE_ASSOCIATION),
|
|
80
|
+
fetchPACMembers(pageNumber, action),
|
|
81
|
+
]);
|
|
78
82
|
if (
|
|
79
83
|
!memberDataResponse ||
|
|
80
84
|
!memberDataResponse.results ||
|
|
@@ -83,7 +87,7 @@ async function synchronizeSinglePage(taskObject) {
|
|
|
83
87
|
throw new Error(`No data found for page ${pageNumber}`);
|
|
84
88
|
}
|
|
85
89
|
const toSyncMembers = memberDataResponse.results.filter(
|
|
86
|
-
member => isUpdatedMember(member) &&
|
|
90
|
+
member => isUpdatedMember(member) && isSiteAssociatedMember(member, siteAssociation)
|
|
87
91
|
);
|
|
88
92
|
if (toSyncMembers.length === 0) {
|
|
89
93
|
return {
|
|
@@ -91,7 +95,7 @@ async function synchronizeSinglePage(taskObject) {
|
|
|
91
95
|
pageNumber,
|
|
92
96
|
totalPageSize: memberDataResponse.results.length,
|
|
93
97
|
filteredPageSize: toSyncMembers.length,
|
|
94
|
-
message:
|
|
98
|
+
message: `No to be updated, or members of association: '${siteAssociation}' found`,
|
|
95
99
|
};
|
|
96
100
|
}
|
|
97
101
|
const result = await bulkProcessAndSaveMemberData(toSyncMembers, pageNumber);
|
|
@@ -3,8 +3,8 @@ const { updateWixMemberLoginEmail } = require('../members-area-methods');
|
|
|
3
3
|
const { MEMBER_ACTIONS } = require('./consts');
|
|
4
4
|
|
|
5
5
|
const isUpdatedMember = member => member.action !== MEMBER_ACTIONS.NONE;
|
|
6
|
-
const
|
|
7
|
-
member.memberships.some(membership => membership.association ===
|
|
6
|
+
const isSiteAssociatedMember = (member, siteAssociation) =>
|
|
7
|
+
member.memberships.some(membership => membership.association === siteAssociation);
|
|
8
8
|
|
|
9
9
|
const changeWixMembersEmails = async toChangeWixMembersEmails => {
|
|
10
10
|
console.log(
|
|
@@ -70,7 +70,7 @@ const createFullName = (firstName, lastName) => {
|
|
|
70
70
|
|
|
71
71
|
module.exports = {
|
|
72
72
|
isUpdatedMember,
|
|
73
|
-
|
|
73
|
+
isSiteAssociatedMember,
|
|
74
74
|
changeWixMembersEmails,
|
|
75
75
|
validateCoreMemberData,
|
|
76
76
|
containsNonEnglish,
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const { taskManager, TASK_TYPE } = require('psdev-task-manager');
|
|
2
|
+
|
|
3
|
+
const { COMPILED_FILTERS_FIELDS } = require('./consts');
|
|
4
|
+
const { TASKS_NAMES } = require('./tasks');
|
|
5
|
+
|
|
6
|
+
const scheduleCompileFiltersTask = field =>
|
|
7
|
+
taskManager().schedule({
|
|
8
|
+
name: TASKS_NAMES.CompileFiltersOptions,
|
|
9
|
+
data: { field },
|
|
10
|
+
type: TASK_TYPE.SCHEDULED,
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
function scheduleCompileInterestsTask() {
|
|
14
|
+
return scheduleCompileFiltersTask(COMPILED_FILTERS_FIELDS.COMPILED_AREAS_OF_PRACTICES);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function scheduleCompileStatesTask() {
|
|
18
|
+
return scheduleCompileFiltersTask(COMPILED_FILTERS_FIELDS.COMPILED_STATE_LIST);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function scheduleCompileCitiesTask() {
|
|
22
|
+
return scheduleCompileFiltersTask(COMPILED_FILTERS_FIELDS.COMPILED_STATE_CITY_MAP);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
module.exports = {
|
|
26
|
+
scheduleCompileInterestsTask,
|
|
27
|
+
scheduleCompileStatesTask,
|
|
28
|
+
scheduleCompileCitiesTask,
|
|
29
|
+
};
|
package/backend/index.js
CHANGED
|
@@ -2,11 +2,13 @@ module.exports = {
|
|
|
2
2
|
...require('./forms-methods'),
|
|
3
3
|
...require('./search-filters-methods'),
|
|
4
4
|
...require('./jobs'),
|
|
5
|
+
...require('./consts'), //TODO: remove it once we finish NPM movement
|
|
5
6
|
...require('./utils'), //TODO: remove it once we finish NPM movement
|
|
6
7
|
...require('./daily-pull'), //TODO: remove it once we finish NPM movement
|
|
7
8
|
...require('./pac-api-methods'), //TODO: remove it once we finish NPM movement
|
|
8
9
|
...require('./members-area-methods'), //TODO: remove it once we finish NPM movement
|
|
9
10
|
...require('./members-data-methods'), //TODO: remove it once we finish NPM movement
|
|
10
11
|
...require('./cms-data-methods'), //TODO: remove it once we finish NPM movement
|
|
11
|
-
...require('./
|
|
12
|
+
...require('./sso-methods'),
|
|
13
|
+
...require('./data-hooks'),
|
|
12
14
|
};
|
package/backend/jobs.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
const { taskManager } = require('psdev-task-manager');
|
|
2
2
|
|
|
3
|
-
const { TASKS_NAMES } = require('./
|
|
4
|
-
const { TASKS } = require('./tasks');
|
|
3
|
+
const { TASKS, TASKS_NAMES } = require('./tasks');
|
|
5
4
|
|
|
6
5
|
async function runScheduledTasks() {
|
|
7
6
|
try {
|
|
@@ -27,4 +26,16 @@ async function scheduleDailyPullTask() {
|
|
|
27
26
|
}
|
|
28
27
|
}
|
|
29
28
|
|
|
30
|
-
|
|
29
|
+
async function updateSiteMapS3() {
|
|
30
|
+
try {
|
|
31
|
+
return await taskManager().schedule({
|
|
32
|
+
name: TASKS_NAMES.updateSiteMapS3,
|
|
33
|
+
data: {},
|
|
34
|
+
type: 'scheduled',
|
|
35
|
+
});
|
|
36
|
+
} catch (error) {
|
|
37
|
+
throw new Error(`Failed to updateSiteMapS3: ${error.message}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
module.exports = { runScheduledTasks, scheduleDailyPullTask, updateSiteMapS3 };
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
const { COLLECTIONS } = require('../public/consts');
|
|
2
2
|
|
|
3
|
+
const { MEMBERSHIPS_TYPES } = require('./consts');
|
|
3
4
|
const { updateMemberContactInfo } = require('./contacts-methods');
|
|
4
|
-
const { MEMBER_ACTIONS } = require('./daily-pull');
|
|
5
|
+
const { MEMBER_ACTIONS } = require('./daily-pull/consts');
|
|
5
6
|
const { wixData } = require('./elevated-modules');
|
|
6
|
-
const { createSiteMember
|
|
7
|
+
const { createSiteMember } = require('./members-area-methods');
|
|
7
8
|
const {
|
|
8
|
-
|
|
9
|
+
chunkArray,
|
|
9
10
|
normalizeUrlForComparison,
|
|
10
11
|
queryAllItems,
|
|
11
|
-
formatDateToMonthYear,
|
|
12
|
-
getAddressDisplayOptions,
|
|
13
|
-
isStudent,
|
|
14
12
|
generateGeoHash,
|
|
15
13
|
} = require('./utils');
|
|
16
14
|
|
|
@@ -48,7 +46,7 @@ async function createContactAndMemberIfNew(memberData) {
|
|
|
48
46
|
...memberData,
|
|
49
47
|
contactId,
|
|
50
48
|
};
|
|
51
|
-
const updatedResult = await
|
|
49
|
+
const updatedResult = await updateMember(memberDataWithContactId);
|
|
52
50
|
memberDataWithContactId = {
|
|
53
51
|
...memberDataWithContactId,
|
|
54
52
|
...updatedResult,
|
|
@@ -60,79 +58,6 @@ async function createContactAndMemberIfNew(memberData) {
|
|
|
60
58
|
}
|
|
61
59
|
}
|
|
62
60
|
|
|
63
|
-
/**
|
|
64
|
-
* Validates member token and retrieves member data
|
|
65
|
-
* @param {string} memberIdInput - The member ID to validate
|
|
66
|
-
* @returns {Promise<{memberData: Object|null, isValid: boolean}>} Validation result with member data
|
|
67
|
-
*/
|
|
68
|
-
async function validateMemberToken(memberIdInput) {
|
|
69
|
-
const invalidTokenResponse = { memberData: null, isValid: false };
|
|
70
|
-
|
|
71
|
-
if (!memberIdInput) {
|
|
72
|
-
return invalidTokenResponse;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
try {
|
|
76
|
-
const member = await getCurrentMember();
|
|
77
|
-
if (!member || !member._id) {
|
|
78
|
-
console.log(
|
|
79
|
-
'member not found from members.getCurrentMember() for memberIdInput',
|
|
80
|
-
memberIdInput
|
|
81
|
-
);
|
|
82
|
-
return invalidTokenResponse;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Query member data using elevated permissions (suppressAuth equivalent)
|
|
86
|
-
const { items } = await wixData
|
|
87
|
-
.query(COLLECTIONS.MEMBERS_DATA)
|
|
88
|
-
.eq('contactId', member._id)
|
|
89
|
-
.find();
|
|
90
|
-
|
|
91
|
-
console.log('items', items[0]);
|
|
92
|
-
console.log('member._id', member._id);
|
|
93
|
-
|
|
94
|
-
if (!items[0]?._id) {
|
|
95
|
-
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(
|
|
96
|
-
{ memberIdInput, currentMemberId: member._id }
|
|
97
|
-
)}`;
|
|
98
|
-
console.error(errorMessage);
|
|
99
|
-
throw new Error('CORRUPTED_MEMBER_DATA');
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
console.log(`Id found in DB for memberIdInput :${memberIdInput} is ${items[0]?._id}`);
|
|
103
|
-
|
|
104
|
-
const memberData = items[0];
|
|
105
|
-
|
|
106
|
-
// Format membership dates
|
|
107
|
-
memberData.memberships = memberData.memberships.map(membership => ({
|
|
108
|
-
...membership,
|
|
109
|
-
membersince: formatDateToMonthYear(membership.membersince),
|
|
110
|
-
}));
|
|
111
|
-
|
|
112
|
-
const savedMemberId = memberData?._id;
|
|
113
|
-
const isValid = savedMemberId === memberIdInput;
|
|
114
|
-
|
|
115
|
-
if (!savedMemberId || !isValid) {
|
|
116
|
-
return invalidTokenResponse;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Check if member is dropped
|
|
120
|
-
if (memberData.action === MEMBER_ACTIONS.DROP) {
|
|
121
|
-
return invalidTokenResponse;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Add computed properties
|
|
125
|
-
memberData.addressDisplayOption = getAddressDisplayOptions(memberData);
|
|
126
|
-
console.log('memberData', memberData);
|
|
127
|
-
memberData.isStudent = isStudent(memberData);
|
|
128
|
-
|
|
129
|
-
return { memberData, isValid };
|
|
130
|
-
} catch (error) {
|
|
131
|
-
console.error('Error in validateMemberToken:', error);
|
|
132
|
-
throw error;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
61
|
/** Performs bulk save operation for member data
|
|
137
62
|
* @param { Array } memberDataList - Array of member data objects to save
|
|
138
63
|
* @returns { Promise < Object >} - Bulk save operation result
|
|
@@ -144,7 +69,7 @@ async function bulkSaveMembers(memberDataList) {
|
|
|
144
69
|
|
|
145
70
|
try {
|
|
146
71
|
// bulkSave all with batches of 1000 items as this is the Velo limit for bulkSave
|
|
147
|
-
const batches =
|
|
72
|
+
const batches = chunkArray(memberDataList, 1000);
|
|
148
73
|
return await Promise.all(
|
|
149
74
|
batches.map(batch => wixData.bulkSave(COLLECTIONS.MEMBERS_DATA, batch))
|
|
150
75
|
);
|
|
@@ -240,6 +165,59 @@ async function getMemberBySlug({
|
|
|
240
165
|
}
|
|
241
166
|
}
|
|
242
167
|
|
|
168
|
+
async function getMemberByContactId(contactId) {
|
|
169
|
+
if (!contactId) {
|
|
170
|
+
throw new Error('Contact ID is required');
|
|
171
|
+
}
|
|
172
|
+
try {
|
|
173
|
+
const members = await wixData
|
|
174
|
+
.query(COLLECTIONS.MEMBERS_DATA)
|
|
175
|
+
.eq('contactId', contactId)
|
|
176
|
+
.limit(2)
|
|
177
|
+
.find()
|
|
178
|
+
.then(res => res.items);
|
|
179
|
+
if (members.length > 1) {
|
|
180
|
+
throw new Error(
|
|
181
|
+
`[getMemberByContactId] Multiple members found with contactId ${contactId} membersIds are : [${members.map(member => member.memberId).join(', ')}]`
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
return members[0] || null;
|
|
185
|
+
} catch (error) {
|
|
186
|
+
throw new Error(
|
|
187
|
+
`[getMemberByContactId] Failed to retrieve member by contactId ${contactId} data: ${error.message}`
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Gets all members with aboutyoustatus as null
|
|
193
|
+
* @returns {Promise<import('wix-data').WixDataQueryResult>} - WixDataQueryResult of member data
|
|
194
|
+
*/
|
|
195
|
+
const getAllEmptyAboutYouMembers = async () => {
|
|
196
|
+
try {
|
|
197
|
+
const membersQuery = wixData
|
|
198
|
+
.query(COLLECTIONS.MEMBERS_DATA)
|
|
199
|
+
.isEmpty('aboutYourSelf')
|
|
200
|
+
.isNotEmpty('aboutYouHtml');
|
|
201
|
+
return await queryAllItems(membersQuery);
|
|
202
|
+
} catch (error) {
|
|
203
|
+
console.error('Error getting empty about you members:', error);
|
|
204
|
+
throw new Error(`Failed to get empty about you members: ${error.message}`);
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* updates member data
|
|
210
|
+
* @param {Object} memberToUpdate - The member data to update
|
|
211
|
+
* @returns {Promise<Object|null>} - Member data or null if not found
|
|
212
|
+
*/
|
|
213
|
+
async function updateMember(memberToUpdate) {
|
|
214
|
+
try {
|
|
215
|
+
const updatedMember = await wixData.update(COLLECTIONS.MEMBERS_DATA, memberToUpdate);
|
|
216
|
+
return updatedMember;
|
|
217
|
+
} catch (error) {
|
|
218
|
+
throw new Error(`Failed to update member data: ${error.message}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
243
221
|
/**
|
|
244
222
|
* Saves member registration data
|
|
245
223
|
* @param {Object} data - Member data to save
|
|
@@ -271,7 +249,7 @@ async function saveRegistrationData(data, id) {
|
|
|
271
249
|
|
|
272
250
|
await updateMemberContactInfo(data, existingMemberData);
|
|
273
251
|
|
|
274
|
-
const saveData = await
|
|
252
|
+
const saveData = await updateMember(data);
|
|
275
253
|
return {
|
|
276
254
|
type: 'success',
|
|
277
255
|
saveData,
|
|
@@ -318,12 +296,182 @@ async function urlExists(url, excludeMemberId) {
|
|
|
318
296
|
}
|
|
319
297
|
}
|
|
320
298
|
|
|
299
|
+
/**
|
|
300
|
+
* Checks URL uniqueness for a member
|
|
301
|
+
* @param {string} url - The URL to check
|
|
302
|
+
* @param {string} memberId - The member ID to exclude from the check
|
|
303
|
+
* @returns {Promise<Object>} Result object with isUnique boolean
|
|
304
|
+
*/
|
|
305
|
+
async function checkUrlUniqueness(url, memberId) {
|
|
306
|
+
if (!url || !memberId) {
|
|
307
|
+
throw new Error('Missing required parameters: url and memberId are required');
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
try {
|
|
311
|
+
const trimmedUrl = url.trim();
|
|
312
|
+
const exists = await urlExists(trimmedUrl, memberId);
|
|
313
|
+
|
|
314
|
+
return { isUnique: !exists };
|
|
315
|
+
} catch (error) {
|
|
316
|
+
console.error('Error checking URL uniqueness:', error);
|
|
317
|
+
throw new Error(`Failed to check URL uniqueness: ${error.message}`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Get all members with external profile images
|
|
322
|
+
* @returns {Promise<Array>} - Array of member IDs
|
|
323
|
+
*/
|
|
324
|
+
async function getAllMembersWithExternalImages() {
|
|
325
|
+
try {
|
|
326
|
+
const membersQuery = await wixData
|
|
327
|
+
.query(COLLECTIONS.MEMBERS_DATA)
|
|
328
|
+
.isNotEmpty('profileImage')
|
|
329
|
+
.ne('profileImage', null);
|
|
330
|
+
|
|
331
|
+
const allItems = await queryAllItems(membersQuery);
|
|
332
|
+
|
|
333
|
+
// Filter for external images (not starting with 'wix:')
|
|
334
|
+
const membersWithExternalImages = allItems.filter(
|
|
335
|
+
member => member.profileImage && !member.profileImage.startsWith('wix:')
|
|
336
|
+
);
|
|
337
|
+
|
|
338
|
+
return membersWithExternalImages;
|
|
339
|
+
} catch (error) {
|
|
340
|
+
console.error('Error getting members with external images:', error);
|
|
341
|
+
return [];
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
async function getMembersWithWixUrl() {
|
|
346
|
+
const membersQuery = wixData
|
|
347
|
+
.query(COLLECTIONS.MEMBERS_DATA)
|
|
348
|
+
.eq('isVisible', true)
|
|
349
|
+
.eq('showWixUrl', true)
|
|
350
|
+
.ne('action', MEMBER_ACTIONS.DROP)
|
|
351
|
+
.ne('memberships.membertype', MEMBERSHIPS_TYPES.PAC_STAFF)
|
|
352
|
+
.isNotEmpty('url')
|
|
353
|
+
.limit(1000);
|
|
354
|
+
let currentResults = await membersQuery.find();
|
|
355
|
+
let i = 0;
|
|
356
|
+
const allItems = currentResults.items;
|
|
357
|
+
while (currentResults.hasNext()) {
|
|
358
|
+
if (i % 50 === 0) console.log(`page ${i}`);
|
|
359
|
+
currentResults = await currentResults.next();
|
|
360
|
+
allItems.push(...currentResults.items);
|
|
361
|
+
i++;
|
|
362
|
+
}
|
|
363
|
+
console.log('i is ', i);
|
|
364
|
+
const filtered = allItems.filter(item => typeof item.url === 'string' && !item.url.includes('/'));
|
|
365
|
+
console.log('filtered is ', filtered.length);
|
|
366
|
+
return filtered;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Gets all members who need contactFormEmail migration (missing contactFormEmail field)
|
|
371
|
+
* @returns {Promise<Array>} - Array of member data
|
|
372
|
+
*/
|
|
373
|
+
const getAllMembersWithoutContactFormEmail = async () => {
|
|
374
|
+
try {
|
|
375
|
+
const membersQuery = wixData
|
|
376
|
+
.query(COLLECTIONS.MEMBERS_DATA)
|
|
377
|
+
.isEmpty('contactFormEmail')
|
|
378
|
+
.isNotEmpty('email')
|
|
379
|
+
.limit(1000);
|
|
380
|
+
|
|
381
|
+
const allItems = await queryAllItems(membersQuery);
|
|
382
|
+
return allItems;
|
|
383
|
+
} catch (error) {
|
|
384
|
+
console.error('Error getting members without contactFormEmail:', error);
|
|
385
|
+
throw new Error(`Failed to get members without contactFormEmail: ${error.message}`);
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
/* Gets all updated login emails from the updated emails database
|
|
390
|
+
* @returns {Promise<Array>} - Array of updated email data
|
|
391
|
+
*/
|
|
392
|
+
const getAllUpdatedLoginEmails = async () => {
|
|
393
|
+
try {
|
|
394
|
+
const updatedEmailsQuery = await wixData
|
|
395
|
+
.query(COLLECTIONS.UPDATED_LOGIN_EMAILS)
|
|
396
|
+
.isNotEmpty('memberId')
|
|
397
|
+
.isNotEmpty('loginEmail')
|
|
398
|
+
.limit(1000);
|
|
399
|
+
return await queryAllItems(updatedEmailsQuery);
|
|
400
|
+
} catch (error) {
|
|
401
|
+
console.error('Error getting updated login emails:', error);
|
|
402
|
+
throw new Error(`Failed to get updated login emails: ${error.message}`);
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
/**
|
|
406
|
+
* Gets members by their member IDs for email sync
|
|
407
|
+
* @param {Array} memberIds - Array of member IDs to fetch
|
|
408
|
+
* @returns {Promise<Array>} - Array of member data
|
|
409
|
+
*/
|
|
410
|
+
const getMembersByIds = async memberIds => {
|
|
411
|
+
try {
|
|
412
|
+
const membersQuery = wixData
|
|
413
|
+
.query(COLLECTIONS.MEMBERS_DATA)
|
|
414
|
+
.hasSome('memberId', memberIds)
|
|
415
|
+
.limit(1000);
|
|
416
|
+
|
|
417
|
+
return await queryAllItems(membersQuery);
|
|
418
|
+
} catch (error) {
|
|
419
|
+
console.error('Error getting members by IDs:', error);
|
|
420
|
+
throw new Error(`Failed to get members by IDs: ${error.message}`);
|
|
421
|
+
}
|
|
422
|
+
};
|
|
423
|
+
|
|
424
|
+
async function getSiteMemberId(data) {
|
|
425
|
+
try {
|
|
426
|
+
console.log('data', data);
|
|
427
|
+
const memberId = data?.pac?.cst_recno;
|
|
428
|
+
if (!memberId) {
|
|
429
|
+
const errorMessage = `Member ID is missing in passed data ${JSON.stringify(data)}`;
|
|
430
|
+
console.error(errorMessage);
|
|
431
|
+
throw new Error(errorMessage);
|
|
432
|
+
}
|
|
433
|
+
const queryMemberResult = await wixData
|
|
434
|
+
.query(COLLECTIONS.MEMBERS_DATA)
|
|
435
|
+
.eq('memberId', Number(memberId))
|
|
436
|
+
.find()
|
|
437
|
+
.then(res => res.items);
|
|
438
|
+
if (!queryMemberResult.length || queryMemberResult.length > 1) {
|
|
439
|
+
throw new Error(
|
|
440
|
+
`Invalid Members count found in DB for email ${data.email} members count is : [${
|
|
441
|
+
queryMemberResult.length
|
|
442
|
+
}] membersIds are : [${queryMemberResult.map(member => member.memberId).join(', ')}]`
|
|
443
|
+
);
|
|
444
|
+
}
|
|
445
|
+
let memberData = queryMemberResult[0];
|
|
446
|
+
console.log('memberData', memberData);
|
|
447
|
+
const isNewUser = !memberData.contactId;
|
|
448
|
+
if (isNewUser) {
|
|
449
|
+
const memberDataWithContactId = await createContactAndMemberIfNew(memberData);
|
|
450
|
+
console.log('memberDataWithContactId', memberDataWithContactId);
|
|
451
|
+
memberData = memberDataWithContactId;
|
|
452
|
+
}
|
|
453
|
+
return memberData;
|
|
454
|
+
} catch (error) {
|
|
455
|
+
console.error('Error in getSiteMemberId', error.message);
|
|
456
|
+
throw error;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
321
460
|
module.exports = {
|
|
322
461
|
findMemberByWixDataId,
|
|
323
462
|
createContactAndMemberIfNew,
|
|
324
|
-
validateMemberToken,
|
|
325
463
|
saveRegistrationData,
|
|
326
464
|
bulkSaveMembers,
|
|
327
465
|
findMemberById,
|
|
328
466
|
getMemberBySlug,
|
|
467
|
+
getMemberByContactId,
|
|
468
|
+
getAllEmptyAboutYouMembers,
|
|
469
|
+
updateMember,
|
|
470
|
+
getAllMembersWithExternalImages,
|
|
471
|
+
getMembersWithWixUrl,
|
|
472
|
+
getAllMembersWithoutContactFormEmail,
|
|
473
|
+
getAllUpdatedLoginEmails,
|
|
474
|
+
getMembersByIds,
|
|
475
|
+
getSiteMemberId,
|
|
476
|
+
checkUrlUniqueness,
|
|
329
477
|
};
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
const {
|
|
2
|
-
|
|
3
|
-
const { PAC_API_URL } = require('./daily-pull/consts');
|
|
1
|
+
const { PAC_API_URL } = require('./consts');
|
|
2
|
+
const { getSecret } = require('./utils');
|
|
4
3
|
|
|
5
4
|
const getHeaders = async () => {
|
|
6
|
-
const AUTH_TOKEN = await
|
|
5
|
+
const AUTH_TOKEN = await getSecret('members-data-api-key');
|
|
7
6
|
const headers = {
|
|
8
7
|
Authorization: `Bearer ${AUTH_TOKEN}`,
|
|
9
8
|
};
|