abmp-npm 1.9.6 → 1.9.8
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 +0 -2
- package/backend/contacts-methods.js +1 -1
- package/backend/daily-pull/bulk-process-methods.js +14 -3
- package/backend/daily-pull/consts.js +11 -0
- package/backend/daily-pull/process-member-methods.js +21 -8
- package/backend/daily-pull/sync-to-cms-methods.js +7 -1
- package/backend/data-hooks.js +1 -1
- package/backend/elevated-modules.js +2 -1
- package/backend/http-functions/httpFunctions.js +15 -1
- package/backend/index.js +1 -1
- package/backend/jobs.js +2 -1
- package/backend/login/index.js +7 -0
- package/backend/login/login-methods-factory.js +24 -0
- package/backend/{qa-login-methods.js → login/qa-login-methods.js} +15 -10
- package/backend/{sso-methods.js → login/sso-methods.js} +16 -19
- package/backend/members-data-methods.js +9 -12
- package/backend/tasks/tasks-configs.js +2 -2
- package/backend/utils.js +16 -5
- package/package.json +1 -1
- package/pages/LoadingPage.js +1 -1
- package/pages/QAPage.js +1 -1
- package/pages/SaveAlerts.js +13 -0
- package/pages/{selecBannerImages.js → SelectBannerImages.js} +2 -2
- package/pages/deleteConfirm.js +19 -0
- package/pages/index.js +3 -1
- package/public/Utils/homePage.js +2 -0
- package/public/consts.js +1 -1
- package/public/sso-auth-methods.js +1 -1
package/backend/consts.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
const PAC_API_URL = 'https://members.abmp.com/eweb/api/Wix';
|
|
2
2
|
const SSO_TOKEN_AUTH_API_URL = 'https://members.professionalassistcorp.com/';
|
|
3
|
-
const SSO_TOKEN_AUTH_API_KEY = 'testkey';
|
|
4
3
|
|
|
5
4
|
/**
|
|
6
5
|
* Valid configuration keys for getSiteConfigs function
|
|
@@ -41,5 +40,4 @@ module.exports = {
|
|
|
41
40
|
COMPILED_FILTERS_FIELDS,
|
|
42
41
|
MEMBERSHIPS_TYPES,
|
|
43
42
|
SSO_TOKEN_AUTH_API_URL,
|
|
44
|
-
SSO_TOKEN_AUTH_API_KEY,
|
|
45
43
|
};
|
|
@@ -20,7 +20,7 @@ async function updateContactInfo(contactId, updateInfoCallback, operationName) {
|
|
|
20
20
|
const currentInfo = contact.info;
|
|
21
21
|
const updatedInfo = updateInfoCallback(currentInfo);
|
|
22
22
|
|
|
23
|
-
await elevatedUpdateContact(contactId,
|
|
23
|
+
await elevatedUpdateContact(contactId, updatedInfo, contact.revision);
|
|
24
24
|
} catch (error) {
|
|
25
25
|
console.error(`Error in ${operationName}:`, error);
|
|
26
26
|
throw new Error(`Failed to ${operationName}: ${error.message}`);
|
|
@@ -5,11 +5,18 @@ const { changeWixMembersEmails } = require('./utils');
|
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Processes and saves multiple member records in bulk
|
|
8
|
+
* @param {Object} options - The options object
|
|
9
|
+
* @param {Array} options.memberDataList - Array of member data from API
|
|
10
|
+
* @param {number} options.currentPageNumber - Current page number being processed
|
|
11
|
+
* @param {boolean} [options.addInterests=true] - Whether to add interests to the member data
|
|
8
12
|
* @param {Array} memberDataList - Array of member data from API
|
|
9
|
-
* @param {number} currentPageNumber - Current page number being processed
|
|
10
13
|
* @returns {Promise<Object>} - Bulk save operation result with statistics
|
|
11
14
|
*/
|
|
12
|
-
const bulkProcessAndSaveMemberData = async (
|
|
15
|
+
const bulkProcessAndSaveMemberData = async ({
|
|
16
|
+
memberDataList,
|
|
17
|
+
currentPageNumber,
|
|
18
|
+
addInterests = true,
|
|
19
|
+
}) => {
|
|
13
20
|
if (!Array.isArray(memberDataList) || memberDataList.length === 0) {
|
|
14
21
|
throw new Error('Invalid member data list provided');
|
|
15
22
|
}
|
|
@@ -18,7 +25,11 @@ const bulkProcessAndSaveMemberData = async (memberDataList, currentPageNumber) =
|
|
|
18
25
|
|
|
19
26
|
try {
|
|
20
27
|
const processedMemberDataPromises = memberDataList.map(memberData =>
|
|
21
|
-
generateUpdatedMemberData(
|
|
28
|
+
generateUpdatedMemberData({
|
|
29
|
+
inputMemberData: memberData,
|
|
30
|
+
currentPageNumber,
|
|
31
|
+
addInterests,
|
|
32
|
+
})
|
|
22
33
|
);
|
|
23
34
|
|
|
24
35
|
const processedMemberDataList = await Promise.all(processedMemberDataPromises);
|
|
@@ -24,8 +24,19 @@ const DEFAULT_MEMBER_DISPLAY_SETTINGS = {
|
|
|
24
24
|
showWixUrl: true,
|
|
25
25
|
};
|
|
26
26
|
|
|
27
|
+
const PAC_ASSOCIATIONS = {
|
|
28
|
+
ABMP: 'ABMP',
|
|
29
|
+
ASCP: 'ASCP',
|
|
30
|
+
ANP: 'ANP',
|
|
31
|
+
AHP: 'AHP',
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const SITES_WITH_INTERESTS_TO_MIGRATE = [PAC_ASSOCIATIONS.ABMP];
|
|
35
|
+
|
|
27
36
|
module.exports = {
|
|
28
37
|
MEMBER_ACTIONS,
|
|
29
38
|
ADDRESS_VISIBILITY_OPTIONS,
|
|
30
39
|
DEFAULT_MEMBER_DISPLAY_SETTINGS,
|
|
40
|
+
PAC_ASSOCIATIONS,
|
|
41
|
+
SITES_WITH_INTERESTS_TO_MIGRATE,
|
|
31
42
|
};
|
|
@@ -42,7 +42,7 @@ const ensureUniqueUrl = async ({ url, memberId, fullName }) => {
|
|
|
42
42
|
excludeDropped: true,
|
|
43
43
|
excludeSearchedMember: true,
|
|
44
44
|
memberId,
|
|
45
|
-
|
|
45
|
+
normalizeSlugForComparison: true,
|
|
46
46
|
});
|
|
47
47
|
if (existingMember && existingMember.url) {
|
|
48
48
|
console.log(
|
|
@@ -60,11 +60,17 @@ const ensureUniqueUrl = async ({ url, memberId, fullName }) => {
|
|
|
60
60
|
|
|
61
61
|
/**
|
|
62
62
|
* Generates complete updated member data by combining existing and migration data
|
|
63
|
-
* @param {Object}
|
|
64
|
-
* @param {
|
|
63
|
+
* @param {Object} options - The options object
|
|
64
|
+
* @param {Object} options.inputMemberData - Raw member data from API
|
|
65
|
+
* @param {string} options.addInterests - Site association of the member
|
|
66
|
+
* @param {number} options.currentPageNumber - Current page number being processed
|
|
65
67
|
* @returns {Promise<Object|null>} - Complete updated member data or null if validation fails
|
|
66
68
|
*/
|
|
67
|
-
async function generateUpdatedMemberData(
|
|
69
|
+
async function generateUpdatedMemberData({
|
|
70
|
+
inputMemberData,
|
|
71
|
+
addInterests = true,
|
|
72
|
+
currentPageNumber,
|
|
73
|
+
}) {
|
|
68
74
|
if (!validateCoreMemberData(inputMemberData)) {
|
|
69
75
|
throw new Error(
|
|
70
76
|
'Invalid member data: memberid, email (valid string), and memberships (array) are required'
|
|
@@ -86,7 +92,11 @@ async function generateUpdatedMemberData(inputMemberData, currentPageNumber) {
|
|
|
86
92
|
|
|
87
93
|
// Only enrich with migration and address data for new members
|
|
88
94
|
if (!existingDbMember) {
|
|
89
|
-
enrichWithMigrationData(
|
|
95
|
+
enrichWithMigrationData({
|
|
96
|
+
memberDataToUpdate: updatedMemberData,
|
|
97
|
+
migrationData: inputMemberData.migrationData,
|
|
98
|
+
addInterests,
|
|
99
|
+
});
|
|
90
100
|
|
|
91
101
|
enrichWithAddressData(
|
|
92
102
|
updatedMemberData,
|
|
@@ -196,10 +206,13 @@ async function getNewMemberOnlyFields(inputMemberData, existingDbMember) {
|
|
|
196
206
|
}
|
|
197
207
|
/**
|
|
198
208
|
* Enriches member data with optional migration properties
|
|
199
|
-
* @param {Object}
|
|
209
|
+
* @param {Object} options - The options object
|
|
210
|
+
* @param {Object} options.memberDataToUpdate - Member data object to enhance
|
|
211
|
+
* @param {Object} options.migrationData - Migration data containing optional properties
|
|
212
|
+
* @param {boolean} [options.addInterests=true] - Whether to add interests to the member data
|
|
200
213
|
* @param {Object} migrationData - Migration data containing optional properties
|
|
201
214
|
*/
|
|
202
|
-
function enrichWithMigrationData(memberDataToUpdate, migrationData) {
|
|
215
|
+
function enrichWithMigrationData({ memberDataToUpdate, migrationData, addInterests = true }) {
|
|
203
216
|
if (!migrationData) return;
|
|
204
217
|
|
|
205
218
|
memberDataToUpdate.addressInfo = migrationData.addressinfo;
|
|
@@ -209,7 +222,7 @@ function enrichWithMigrationData(memberDataToUpdate, migrationData) {
|
|
|
209
222
|
memberDataToUpdate.showWebsite = true;
|
|
210
223
|
}
|
|
211
224
|
|
|
212
|
-
if (migrationData.interests) {
|
|
225
|
+
if (addInterests && migrationData.interests) {
|
|
213
226
|
memberDataToUpdate.areasOfPractices = processInterests(migrationData.interests);
|
|
214
227
|
}
|
|
215
228
|
}
|
|
@@ -6,6 +6,7 @@ const { TASKS_NAMES } = require('../tasks/consts');
|
|
|
6
6
|
const { getSiteConfigs } = require('../utils');
|
|
7
7
|
|
|
8
8
|
const { bulkProcessAndSaveMemberData } = require('./bulk-process-methods');
|
|
9
|
+
const { SITES_WITH_INTERESTS_TO_MIGRATE } = require('./consts');
|
|
9
10
|
const { isUpdatedMember, isSiteAssociatedMember } = require('./utils');
|
|
10
11
|
|
|
11
12
|
async function syncMembersDataPerAction(action) {
|
|
@@ -79,6 +80,7 @@ async function synchronizeSinglePage(taskObject) {
|
|
|
79
80
|
getSiteConfigs(CONFIG_KEYS.SITE_ASSOCIATION),
|
|
80
81
|
fetchPACMembers(pageNumber, action),
|
|
81
82
|
]);
|
|
83
|
+
const addInterests = SITES_WITH_INTERESTS_TO_MIGRATE.includes(siteAssociation);
|
|
82
84
|
if (
|
|
83
85
|
!memberDataResponse ||
|
|
84
86
|
!memberDataResponse.results ||
|
|
@@ -98,7 +100,11 @@ async function synchronizeSinglePage(taskObject) {
|
|
|
98
100
|
message: `No to be updated, or members of association: '${siteAssociation}' found`,
|
|
99
101
|
};
|
|
100
102
|
}
|
|
101
|
-
const result = await bulkProcessAndSaveMemberData(
|
|
103
|
+
const result = await bulkProcessAndSaveMemberData({
|
|
104
|
+
memberDataList: toSyncMembers,
|
|
105
|
+
currentPageNumber: pageNumber,
|
|
106
|
+
addInterests,
|
|
107
|
+
});
|
|
102
108
|
|
|
103
109
|
return {
|
|
104
110
|
success: true,
|
package/backend/data-hooks.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const { taskManager, TASK_TYPE } = require('psdev-task-manager');
|
|
2
2
|
|
|
3
3
|
const { COMPILED_FILTERS_FIELDS } = require('./consts');
|
|
4
|
-
const { TASKS_NAMES } = require('./tasks');
|
|
4
|
+
const { TASKS_NAMES } = require('./tasks/consts');
|
|
5
5
|
|
|
6
6
|
const scheduleCompileFiltersTask = field =>
|
|
7
7
|
taskManager().schedule({
|
|
@@ -11,7 +11,8 @@ const wixData = {
|
|
|
11
11
|
remove: auth.elevate(items.remove),
|
|
12
12
|
get: auth.elevate(items.get),
|
|
13
13
|
truncate: auth.elevate(items.truncate),
|
|
14
|
+
bulkSave: auth.elevate(items.bulkSave),
|
|
15
|
+
search: auth.elevate(items.search),
|
|
14
16
|
//TODO: add other methods here as needed
|
|
15
17
|
};
|
|
16
|
-
|
|
17
18
|
module.exports = { wixData };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const { COLLECTIONS } = require('../../public/consts');
|
|
2
2
|
const { clearCollection } = require('../cms-data-methods');
|
|
3
|
-
const {
|
|
3
|
+
const { CONFIG_KEYS } = require('../consts');
|
|
4
|
+
const { getSecret, getSiteConfigs } = require('../utils');
|
|
4
5
|
|
|
5
6
|
const { migrateInterests } = require('./interests');
|
|
6
7
|
|
|
@@ -62,10 +63,23 @@ const createHTTPFunctionsHelpers = wixHTTPFunctionsMethods => {
|
|
|
62
63
|
return serverError(error);
|
|
63
64
|
}
|
|
64
65
|
};
|
|
66
|
+
const getSiteAssociationHandler = async _request => {
|
|
67
|
+
try {
|
|
68
|
+
const siteAssociation = await getSiteConfigs(CONFIG_KEYS.SITE_ASSOCIATION);
|
|
69
|
+
return ok({
|
|
70
|
+
...responseOptions,
|
|
71
|
+
body: { siteAssociation },
|
|
72
|
+
});
|
|
73
|
+
} catch (error) {
|
|
74
|
+
console.error('Error getting site association:', error);
|
|
75
|
+
return serverError(error);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
65
78
|
|
|
66
79
|
return {
|
|
67
80
|
post_migrateInterests: withAuth(migrateInterestsHandler),
|
|
68
81
|
delete_clearCollection: withAuth(clearCollectionHandler),
|
|
82
|
+
get_getSiteAssociation: withAuth(getSiteAssociationHandler),
|
|
69
83
|
};
|
|
70
84
|
};
|
|
71
85
|
|
package/backend/index.js
CHANGED
|
@@ -10,7 +10,7 @@ module.exports = {
|
|
|
10
10
|
...require('./members-data-methods'), //TODO: remove it once we finish NPM movement
|
|
11
11
|
...require('./cms-data-methods'), //TODO: remove it once we finish NPM movement
|
|
12
12
|
...require('./routers'),
|
|
13
|
-
...require('./
|
|
13
|
+
...require('./login'),
|
|
14
14
|
...require('./data-hooks'),
|
|
15
15
|
...require('./http-functions'),
|
|
16
16
|
};
|
package/backend/jobs.js
CHANGED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const { loginQAMember } = require('./qa-login-methods');
|
|
2
|
+
const { authenticateSSOToken } = require('./sso-methods');
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Creates login methods with injected generateSessionToken dependency
|
|
6
|
+
* @param {Function} generateSessionToken - The Velo generateSessionToken function to inject
|
|
7
|
+
* @returns {Object} Object containing loginQAMember and authenticateSSOToken methods
|
|
8
|
+
*/
|
|
9
|
+
const createLoginMethods = generateSessionToken => {
|
|
10
|
+
//There is no generateSessionToken SDK version, and the signOn of @wix/identity returns 403 error regardless that the permissions are valid
|
|
11
|
+
//Therefore, as a workaround we need to inject the Velo version of generateSessionToken to the login methods.
|
|
12
|
+
const injectGenerateSessionTokenToMethod =
|
|
13
|
+
method =>
|
|
14
|
+
async (...args) =>
|
|
15
|
+
await method(...args, generateSessionToken);
|
|
16
|
+
return {
|
|
17
|
+
loginQAMember: injectGenerateSessionTokenToMethod(loginQAMember),
|
|
18
|
+
authenticateSSOToken: injectGenerateSessionTokenToMethod(authenticateSSOToken),
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
module.exports = {
|
|
23
|
+
createLoginMethods,
|
|
24
|
+
};
|
|
@@ -1,18 +1,24 @@
|
|
|
1
|
-
const {
|
|
2
|
-
|
|
3
|
-
const { getMemberByEmail, getQAUsers } = require('./members-data-methods');
|
|
4
|
-
const { getSecret } = require('./utils');
|
|
1
|
+
const { getMemberByEmail, getQAUsers } = require('../members-data-methods');
|
|
2
|
+
const { getSecret } = require('../utils');
|
|
5
3
|
|
|
6
4
|
const validateQAUser = async userEmail => {
|
|
7
5
|
const qaUsers = await getQAUsers();
|
|
8
|
-
const
|
|
9
|
-
if (!
|
|
6
|
+
const matchingUserEmail = qaUsers.find(user => user.email === userEmail)?.email;
|
|
7
|
+
if (!matchingUserEmail) {
|
|
10
8
|
return { error: `Invalid user email: ${userEmail}` };
|
|
11
9
|
}
|
|
12
|
-
return { valid: true,
|
|
10
|
+
return { valid: true, email: matchingUserEmail };
|
|
13
11
|
};
|
|
14
12
|
|
|
15
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Login a QA user
|
|
15
|
+
* @param {Object} params - The parameters for the login
|
|
16
|
+
* @param {string} params.userEmail - The email of the user to login
|
|
17
|
+
* @param {string} params.secret - The secret of the user to login
|
|
18
|
+
* @param {Function} generateSessionToken - a dependency of the method, injected by the createLoginMethods function
|
|
19
|
+
* @returns {Promise<Object>} The result of the login
|
|
20
|
+
*/
|
|
21
|
+
const loginQAMember = async ({ userEmail, secret }, generateSessionToken) => {
|
|
16
22
|
try {
|
|
17
23
|
const userValidation = await validateQAUser(userEmail);
|
|
18
24
|
if (userValidation.error) {
|
|
@@ -24,8 +30,7 @@ const loginQAMember = async (userEmail, secret) => {
|
|
|
24
30
|
return { success: false, error: 'Invalid secret' };
|
|
25
31
|
}
|
|
26
32
|
|
|
27
|
-
|
|
28
|
-
const token = await authentication.generateSessionToken(userValidation.user, qaSecret);
|
|
33
|
+
const token = await generateSessionToken(userValidation.email, qaSecret);
|
|
29
34
|
|
|
30
35
|
const result = await getMemberCMSId(userEmail);
|
|
31
36
|
if (!result.success) {
|
|
@@ -1,20 +1,18 @@
|
|
|
1
1
|
const { createHmac } = require('crypto');
|
|
2
2
|
|
|
3
|
-
const { auth } = require('@wix/essentials');
|
|
4
|
-
const { authentication } = require('@wix/identity'); //importing from @wix/identity because @wix/members authentication do not have generateSessionToken method
|
|
5
|
-
const generateSessionToken = auth.elevate(authentication.signOn);
|
|
6
3
|
const { decode } = require('jwt-js-decode');
|
|
7
4
|
|
|
8
|
-
const { CONFIG_KEYS, SSO_TOKEN_AUTH_API_URL
|
|
9
|
-
const { MEMBER_ACTIONS } = require('
|
|
10
|
-
const { getCurrentMember } = require('
|
|
11
|
-
const { getMemberByContactId, getSiteMemberId } = require('
|
|
5
|
+
const { CONFIG_KEYS, SSO_TOKEN_AUTH_API_URL } = require('../consts');
|
|
6
|
+
const { MEMBER_ACTIONS } = require('../daily-pull/consts');
|
|
7
|
+
const { getCurrentMember } = require('../members-area-methods');
|
|
8
|
+
const { getMemberByContactId, getSiteMemberId } = require('../members-data-methods');
|
|
12
9
|
const {
|
|
13
10
|
formatDateToMonthYear,
|
|
14
11
|
getAddressDisplayOptions,
|
|
15
12
|
isStudent,
|
|
16
13
|
getSiteConfigs,
|
|
17
|
-
|
|
14
|
+
getSecret,
|
|
15
|
+
} = require('../utils');
|
|
18
16
|
|
|
19
17
|
/**
|
|
20
18
|
* Validates member token and retrieves member data
|
|
@@ -90,6 +88,7 @@ async function validateMemberToken(memberIdInput) {
|
|
|
90
88
|
}
|
|
91
89
|
}
|
|
92
90
|
async function checkAndFetchSSO(token) {
|
|
91
|
+
const SSO_TOKEN_AUTH_API_KEY = await getSecret('SSO_TOKEN_AUTH_API_KEY');
|
|
93
92
|
const signature = createHmac('sha256', SSO_TOKEN_AUTH_API_KEY).update(token).digest('hex');
|
|
94
93
|
const professionalassistcorpUrl = `${SSO_TOKEN_AUTH_API_URL}/eweb/SSOToken.ashx?token=${token}&Partner=Wix&Signature=${signature}`;
|
|
95
94
|
const options = {
|
|
@@ -109,16 +108,14 @@ async function checkAndFetchSSO(token) {
|
|
|
109
108
|
}
|
|
110
109
|
}
|
|
111
110
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
const authenticateSSOToken = async token => {
|
|
111
|
+
/**
|
|
112
|
+
* Authenticate an SSO token
|
|
113
|
+
* @param {Object} params - The parameters for the authentication
|
|
114
|
+
* @param {string} params.token - The token to authenticate
|
|
115
|
+
* @param {Function} generateSessionToken - a dependency of the method, injected by the createLoginMethods function
|
|
116
|
+
* @returns {Promise<Object>} The result of the authentication
|
|
117
|
+
*/
|
|
118
|
+
const authenticateSSOToken = async ({ token }, generateSessionToken) => {
|
|
122
119
|
const responseToken = await checkAndFetchSSO(token);
|
|
123
120
|
const isValidToken = Boolean(
|
|
124
121
|
responseToken && typeof responseToken === 'string' && responseToken?.trim()
|
|
@@ -138,7 +135,7 @@ const authenticateSSOToken = async token => {
|
|
|
138
135
|
const payload = jwt.payload;
|
|
139
136
|
const membersData = await getSiteMemberId(payload);
|
|
140
137
|
console.log('membersDataCollectionId', membersData._id);
|
|
141
|
-
const sessionToken = await
|
|
138
|
+
const sessionToken = await generateSessionToken(membersData.email);
|
|
142
139
|
const authObj = {
|
|
143
140
|
type: 'success',
|
|
144
141
|
memberId: membersData._id,
|
|
@@ -10,6 +10,7 @@ const {
|
|
|
10
10
|
normalizeUrlForComparison,
|
|
11
11
|
queryAllItems,
|
|
12
12
|
generateGeoHash,
|
|
13
|
+
searchAllItems,
|
|
13
14
|
} = require('./utils');
|
|
14
15
|
|
|
15
16
|
/**
|
|
@@ -108,7 +109,7 @@ async function findMemberById(memberId) {
|
|
|
108
109
|
* @param {boolean} options.excludeDropped - Whether to exclude dropped members (default: true)
|
|
109
110
|
* @param {boolean} options.excludeSearchedMember - Whether to exclude a specific member (default: false)
|
|
110
111
|
* @param {string|number} [options.memberId] - Member ID to exclude when excludeSearchedMember is true (optional)
|
|
111
|
-
* @param {boolean} [options.
|
|
112
|
+
* @param {boolean} [options.normalizeSlugForComparison=false] - Whether to normalize the slug for comparison (default: false)
|
|
112
113
|
* @returns {Promise<Object|null>} - Member data or null if not found
|
|
113
114
|
*/
|
|
114
115
|
async function getMemberBySlug({
|
|
@@ -116,12 +117,12 @@ async function getMemberBySlug({
|
|
|
116
117
|
excludeDropped = true,
|
|
117
118
|
excludeSearchedMember = false,
|
|
118
119
|
memberId = null,
|
|
119
|
-
|
|
120
|
+
normalizeSlugForComparison = false,
|
|
120
121
|
}) {
|
|
121
122
|
if (!slug) return null;
|
|
122
123
|
|
|
123
124
|
try {
|
|
124
|
-
let query = wixData.
|
|
125
|
+
let query = wixData.search(COLLECTIONS.MEMBERS_DATA).expression(slug);
|
|
125
126
|
|
|
126
127
|
if (excludeDropped) {
|
|
127
128
|
query = query.ne('action', 'drop');
|
|
@@ -130,17 +131,13 @@ async function getMemberBySlug({
|
|
|
130
131
|
if (excludeSearchedMember && memberId) {
|
|
131
132
|
query = query.ne('memberId', memberId);
|
|
132
133
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
membersList = await queryAllItems(query);
|
|
137
|
-
} else {
|
|
138
|
-
membersList = await query.find().then(res => res.items);
|
|
139
|
-
}
|
|
134
|
+
query = query.limit(1000);
|
|
135
|
+
const searchResult = await searchAllItems(query);
|
|
136
|
+
const membersList = searchResult.items.filter(item => item.url && item.url.includes(slug)); //replacement for contains
|
|
140
137
|
let matchingMembers = membersList.filter(
|
|
141
138
|
item => item.url && item.url.toLowerCase() === slug.toLowerCase()
|
|
142
139
|
);
|
|
143
|
-
if (
|
|
140
|
+
if (normalizeSlugForComparison) {
|
|
144
141
|
matchingMembers = membersList
|
|
145
142
|
.filter(
|
|
146
143
|
//remove trailing "-1", "-2", etc.
|
|
@@ -152,7 +149,7 @@ async function getMemberBySlug({
|
|
|
152
149
|
const queryResultMsg = `Multiple members found with same slug ${slug} membersIds are : [${matchingMembers
|
|
153
150
|
.map(member => member.memberId)
|
|
154
151
|
.join(', ')}]`;
|
|
155
|
-
if (!
|
|
152
|
+
if (!normalizeSlugForComparison) {
|
|
156
153
|
throw new Error(queryResultMsg);
|
|
157
154
|
} else {
|
|
158
155
|
console.log(queryResultMsg);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
const { MEMBER_ACTIONS } = require('../daily-pull/consts.js');
|
|
1
2
|
const {
|
|
2
|
-
MEMBER_ACTIONS,
|
|
3
3
|
synchronizeSinglePage,
|
|
4
4
|
syncMembersDataPerAction,
|
|
5
|
-
} = require('../daily-pull');
|
|
5
|
+
} = require('../daily-pull/sync-to-cms-methods');
|
|
6
6
|
|
|
7
7
|
const { TASKS_NAMES } = require('./consts');
|
|
8
8
|
const {
|
package/backend/utils.js
CHANGED
|
@@ -107,18 +107,28 @@ function getAddressesByStatus(addresses = [], addressDisplayOption = []) {
|
|
|
107
107
|
})
|
|
108
108
|
.filter(Boolean);
|
|
109
109
|
}
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
let oldResults = await query.find();
|
|
110
|
+
const getAllItems = async querySearchResult => {
|
|
111
|
+
let oldResults = querySearchResult;
|
|
113
112
|
console.log(`found items: ${oldResults.items.length}`);
|
|
114
113
|
const allItems = oldResults.items;
|
|
115
114
|
while (oldResults.hasNext()) {
|
|
116
115
|
oldResults = await oldResults.next();
|
|
117
116
|
allItems.push(...oldResults.items);
|
|
118
117
|
}
|
|
119
|
-
console.log(`all items: ${allItems.length}`);
|
|
118
|
+
console.log(`all items count : ${allItems.length}`);
|
|
120
119
|
return allItems;
|
|
121
120
|
};
|
|
121
|
+
const searchAllItems = async searchQuery => {
|
|
122
|
+
console.log('start search');
|
|
123
|
+
const searchResults = await searchQuery.run();
|
|
124
|
+
return getAllItems(searchResults);
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
const queryAllItems = async query => {
|
|
128
|
+
console.log('start query');
|
|
129
|
+
const queryResults = await query.find();
|
|
130
|
+
return getAllItems(queryResults);
|
|
131
|
+
};
|
|
122
132
|
/**
|
|
123
133
|
* Chunks large arrays into smaller chunks for processing
|
|
124
134
|
* @param {Array} array - Array to chunk
|
|
@@ -154,7 +164,7 @@ const normalizeUrlForComparison = url => {
|
|
|
154
164
|
};
|
|
155
165
|
|
|
156
166
|
async function getSecret(secretKey) {
|
|
157
|
-
return await elevatedGetSecretValue(secretKey).value;
|
|
167
|
+
return (await elevatedGetSecretValue(secretKey)).value;
|
|
158
168
|
}
|
|
159
169
|
|
|
160
170
|
async function getSiteBaseUrl() {
|
|
@@ -206,4 +216,5 @@ module.exports = {
|
|
|
206
216
|
formatDateOnly,
|
|
207
217
|
getAddressesByStatus,
|
|
208
218
|
isPAC_STAFF,
|
|
219
|
+
searchAllItems,
|
|
209
220
|
};
|
package/package.json
CHANGED
package/pages/LoadingPage.js
CHANGED
|
@@ -7,7 +7,7 @@ async function loadingPageOnReady(authenticateSSOToken) {
|
|
|
7
7
|
const renderingEnv = await rendering.env();
|
|
8
8
|
//This calls needs to triggered on client side, otherwise PAC API will return 401 error
|
|
9
9
|
if (renderingEnv === 'browser') {
|
|
10
|
-
//Need to pass
|
|
10
|
+
//Need to pass authenticateSSOToken to checkAndLogin so it will run as a web method not a public one.
|
|
11
11
|
await checkAndLogin(authenticateSSOToken).catch(error => {
|
|
12
12
|
wixWindow.openLightbox(LIGHTBOX_NAMES.LOGIN_ERROR_ALERT);
|
|
13
13
|
console.error(`Something went wrong while logging in: ${error}`);
|
package/pages/QAPage.js
CHANGED
|
@@ -10,7 +10,7 @@ async function qaPageOnReady({ $w: _$w, loginQAMember }) {
|
|
|
10
10
|
throw new Error('Missing required parameters: userEmail and/or secret');
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
const result = await loginQAMember(userEmail, secret);
|
|
13
|
+
const result = await loginQAMember({ userEmail, secret });
|
|
14
14
|
|
|
15
15
|
if (!result.success || !result.token) {
|
|
16
16
|
throw new Error(result.error || 'Login failed');
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const { lightbox } = require('@wix/site-window');
|
|
2
|
+
|
|
3
|
+
async function saveAlertsOnReady({ $w: _$w }) {
|
|
4
|
+
const receivedData = await lightbox.getContext();
|
|
5
|
+
_$w('#closeButton').onClick(() => lightbox.close());
|
|
6
|
+
_$w('#cancelButton').onClick(() => lightbox.close());
|
|
7
|
+
_$w('#leaveButton').link = receivedData?.membersExternalPortalUrl;
|
|
8
|
+
_$w('#leaveButton').target = '_blank';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
module.exports = {
|
|
12
|
+
saveAlertsOnReady,
|
|
13
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const {
|
|
1
|
+
const { lightbox } = require('@wix/site-window');
|
|
2
2
|
|
|
3
3
|
function selectBannerImagesOnReady({ $w: _$w }) {
|
|
4
4
|
_$w('#imageDataset').onReady(async () => {
|
|
@@ -37,7 +37,7 @@ function selectBannerImagesOnReady({ $w: _$w }) {
|
|
|
37
37
|
};
|
|
38
38
|
}
|
|
39
39
|
});
|
|
40
|
-
|
|
40
|
+
lightbox.close(selectedImage);
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
43
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const { lightbox } = require('@wix/site-window');
|
|
2
|
+
|
|
3
|
+
function deleteConfirmOnReady({ $w: _$w }) {
|
|
4
|
+
_$w('#delete').onClick(() => {
|
|
5
|
+
lightbox.close({
|
|
6
|
+
toDelete: true,
|
|
7
|
+
});
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
_$w('#cancel').onClick(() => {
|
|
11
|
+
lightbox.close({
|
|
12
|
+
toDelete: false,
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
module.exports = {
|
|
18
|
+
deleteConfirmOnReady,
|
|
19
|
+
};
|
package/pages/index.js
CHANGED
|
@@ -5,5 +5,7 @@ module.exports = {
|
|
|
5
5
|
...require('./personalDetails.js'),
|
|
6
6
|
...require('./QAPage.js'),
|
|
7
7
|
...require('./LoadingPage.js'),
|
|
8
|
-
...require('./
|
|
8
|
+
...require('./SelectBannerImages.js'),
|
|
9
|
+
...require('./deleteConfirm.js'),
|
|
10
|
+
...require('./SaveAlerts.js'),
|
|
9
11
|
};
|
package/public/Utils/homePage.js
CHANGED
|
@@ -127,6 +127,8 @@ const createHomepageUtils = (_$w, filterProfiles) => {
|
|
|
127
127
|
|
|
128
128
|
paginateSearchResults(searchResults, pagination);
|
|
129
129
|
await updateUrlParams(filter, pagination);
|
|
130
|
+
|
|
131
|
+
_$w('#resultsStateBox').scrollTo();
|
|
130
132
|
}
|
|
131
133
|
|
|
132
134
|
async function onChangeMultiCheckbox({
|
package/public/consts.js
CHANGED
|
@@ -12,7 +12,7 @@ const COLLECTIONS = {
|
|
|
12
12
|
INTERESTS: 'interests',
|
|
13
13
|
STATE_CITY_MAP: 'City',
|
|
14
14
|
UPDATED_LOGIN_EMAILS: 'updatedLoginEmails',
|
|
15
|
-
|
|
15
|
+
QA_USERS: 'QA_Users', //Make QA users configurable per site
|
|
16
16
|
};
|
|
17
17
|
|
|
18
18
|
/**
|
|
@@ -9,7 +9,7 @@ const checkAndLogin = async authenticateSSOToken => {
|
|
|
9
9
|
const token = query['token']?.trim();
|
|
10
10
|
try {
|
|
11
11
|
if (token) {
|
|
12
|
-
const authObj = await authenticateSSOToken(token);
|
|
12
|
+
const authObj = await authenticateSSOToken({ token });
|
|
13
13
|
console.log('authObj', authObj);
|
|
14
14
|
if (authObj.type == 'success') {
|
|
15
15
|
console.log('success');
|