abmp-npm 10.3.6 → 10.3.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/login/generate-member-session-token.js +27 -0
- package/backend/login/index.js +4 -3
- package/backend/login/qa-login-methods.js +4 -3
- package/backend/login/sso-methods.js +4 -3
- package/package.json +3 -3
- package/public/Utils/homePage.js +49 -17
- package/backend/login/login-methods-factory.js +0 -24
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const { auth } = require('@wix/essentials');
|
|
2
|
+
const { authentication } = require('@wix/identity');
|
|
3
|
+
|
|
4
|
+
const elevatedSignOn = auth.elevate(authentication.signOn);
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Creates a Wix member session token for SSO / QA login using @wix/identity signOn (elevated).
|
|
8
|
+
* @param {string} email - Member login email
|
|
9
|
+
* @returns {Promise<string>} Session token for authentication.applySessionToken on the client
|
|
10
|
+
*/
|
|
11
|
+
async function generateMemberSessionToken(email) {
|
|
12
|
+
const trimmedEmail = (email || '').trim();
|
|
13
|
+
if (!trimmedEmail) {
|
|
14
|
+
throw new Error('Email is required to generate a session token');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const response = await elevatedSignOn({ email: trimmedEmail });
|
|
18
|
+
const sessionToken = response?.sessionToken;
|
|
19
|
+
if (!sessionToken) {
|
|
20
|
+
throw new Error('Failed to generate session token: empty response from signOn');
|
|
21
|
+
}
|
|
22
|
+
return sessionToken;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
module.exports = {
|
|
26
|
+
generateMemberSessionToken,
|
|
27
|
+
};
|
package/backend/login/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
const {
|
|
2
|
-
const { validateMemberToken } = require('./sso-methods');
|
|
1
|
+
const { loginQAMember } = require('./qa-login-methods');
|
|
2
|
+
const { validateMemberToken, authenticateSSOToken } = require('./sso-methods');
|
|
3
3
|
|
|
4
4
|
module.exports = {
|
|
5
|
-
|
|
5
|
+
loginQAMember,
|
|
6
6
|
validateMemberToken,
|
|
7
|
+
authenticateSSOToken,
|
|
7
8
|
};
|
|
@@ -2,6 +2,8 @@ const { CONFIG_KEYS } = require('../consts');
|
|
|
2
2
|
const { prepareMemberForQALogin, getQAUsers } = require('../members-data-methods');
|
|
3
3
|
const { getSecret, getSiteConfigs } = require('../utils');
|
|
4
4
|
|
|
5
|
+
const { generateMemberSessionToken } = require('./generate-member-session-token');
|
|
6
|
+
|
|
5
7
|
const validateQAUser = async userEmail => {
|
|
6
8
|
const qaUsers = await getQAUsers();
|
|
7
9
|
const matchingUserEmail = qaUsers.find(user => user.email === userEmail)?.email;
|
|
@@ -16,10 +18,9 @@ const validateQAUser = async userEmail => {
|
|
|
16
18
|
* @param {Object} params - The parameters for the login
|
|
17
19
|
* @param {string} params.userEmail - The email of the user to login
|
|
18
20
|
* @param {string} params.secret - The secret of the user to login
|
|
19
|
-
* @param {Function} generateSessionToken - a dependency of the method, injected by the createLoginMethods function
|
|
20
21
|
* @returns {Promise<Object>} The result of the login
|
|
21
22
|
*/
|
|
22
|
-
const loginQAMember = async ({ userEmail, secret }
|
|
23
|
+
const loginQAMember = async ({ userEmail, secret }) => {
|
|
23
24
|
try {
|
|
24
25
|
const [qaSecret, allowAnyMember] = await Promise.all([
|
|
25
26
|
getSecret('ABMP_QA_SECRET'),
|
|
@@ -36,7 +37,7 @@ const loginQAMember = async ({ userEmail, secret }, generateSessionToken) => {
|
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
const memberData = await prepareMemberForQALogin(userEmail);
|
|
39
|
-
const token = await
|
|
40
|
+
const token = await generateMemberSessionToken(memberData.email);
|
|
40
41
|
return {
|
|
41
42
|
success: true,
|
|
42
43
|
token,
|
|
@@ -15,6 +15,8 @@ const {
|
|
|
15
15
|
getSecret,
|
|
16
16
|
} = require('../utils');
|
|
17
17
|
|
|
18
|
+
const { generateMemberSessionToken } = require('./generate-member-session-token');
|
|
19
|
+
|
|
18
20
|
/**
|
|
19
21
|
* Validates member token and retrieves member data
|
|
20
22
|
* @param {string} memberIdInput - The member ID to validate
|
|
@@ -112,10 +114,9 @@ async function checkAndFetchSSO(token) {
|
|
|
112
114
|
* Authenticate an SSO token
|
|
113
115
|
* @param {Object} params - The parameters for the authentication
|
|
114
116
|
* @param {string} params.token - The token to authenticate
|
|
115
|
-
* @param {Function} generateSessionToken - a dependency of the method, injected by the createLoginMethods function
|
|
116
117
|
* @returns {Promise<Object>} The result of the authentication
|
|
117
118
|
*/
|
|
118
|
-
const authenticateSSOToken = async ({ token }
|
|
119
|
+
const authenticateSSOToken = async ({ token }) => {
|
|
119
120
|
const responseToken = await checkAndFetchSSO(token);
|
|
120
121
|
const isValidToken = Boolean(
|
|
121
122
|
responseToken && typeof responseToken === 'string' && responseToken?.trim()
|
|
@@ -135,7 +136,7 @@ const authenticateSSOToken = async ({ token }, generateSessionToken) => {
|
|
|
135
136
|
const payload = jwt.payload;
|
|
136
137
|
const memberData = await prepareMemberForSSOLogin(payload);
|
|
137
138
|
console.log('memberDataCollectionId', memberData._id);
|
|
138
|
-
const sessionToken = await
|
|
139
|
+
const sessionToken = await generateMemberSessionToken(memberData.email);
|
|
139
140
|
const authObj = {
|
|
140
141
|
type: 'success',
|
|
141
142
|
memberId: memberData._id,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "abmp-npm",
|
|
3
|
-
"version": "10.3.
|
|
3
|
+
"version": "10.3.8",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"check-cycles": "madge --circular .",
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
"@wix/automations": "^1.0.261",
|
|
36
36
|
"@wix/crm": "^1.0.1061",
|
|
37
37
|
"@wix/data": "^1.0.349",
|
|
38
|
-
"@wix/essentials": "^0.
|
|
39
|
-
"@wix/identity": "^1.0.
|
|
38
|
+
"@wix/essentials": "^1.0.7",
|
|
39
|
+
"@wix/identity": "^1.0.195",
|
|
40
40
|
"@wix/media": "^1.0.213",
|
|
41
41
|
"@wix/members": "^1.0.365",
|
|
42
42
|
"@wix/secrets": "^1.0.62",
|
package/public/Utils/homePage.js
CHANGED
|
@@ -5,6 +5,43 @@ const { DEFAULT_FILTER } = require('../consts.js');
|
|
|
5
5
|
|
|
6
6
|
const { debouncedFunction } = require('./sharedUtils.js');
|
|
7
7
|
|
|
8
|
+
function isValidGeolocation(lat, lng) {
|
|
9
|
+
return Number.isFinite(lat) && Number.isFinite(lng) && (lat !== 0 || lng !== 0);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function applyGeolocationToFilter(filter, lat, lng, isSearchingNearby) {
|
|
13
|
+
return {
|
|
14
|
+
...filter,
|
|
15
|
+
postalcode: isSearchingNearby ? null : filter.postalcode,
|
|
16
|
+
state: isSearchingNearby ? [] : filter.state,
|
|
17
|
+
city: isSearchingNearby ? [] : filter.city,
|
|
18
|
+
stateSearch: isSearchingNearby ? '' : filter.stateSearch,
|
|
19
|
+
citySearch: isSearchingNearby ? '' : filter.citySearch,
|
|
20
|
+
latitude: lat,
|
|
21
|
+
longitude: lng,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const GEOLOCATION_TIMEOUT_MS = 10000;
|
|
26
|
+
|
|
27
|
+
function getCurrentGeolocationWithTimeout(timeoutMs = GEOLOCATION_TIMEOUT_MS) {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const timer = setTimeout(() => {
|
|
30
|
+
reject(new Error(`Geolocation timed out after ${timeoutMs}ms`));
|
|
31
|
+
}, timeoutMs);
|
|
32
|
+
wixWindow
|
|
33
|
+
.getCurrentGeolocation()
|
|
34
|
+
.then(location => {
|
|
35
|
+
clearTimeout(timer);
|
|
36
|
+
resolve(location);
|
|
37
|
+
})
|
|
38
|
+
.catch(error => {
|
|
39
|
+
clearTimeout(timer);
|
|
40
|
+
reject(error);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
8
45
|
const createHomepageUtils = (_$w, filterProfiles) => {
|
|
9
46
|
const getFiltersSelectors = filterName => ({
|
|
10
47
|
checkBoxContainerSelector: _$w(`#${filterName}CheckBoxContainer`),
|
|
@@ -362,29 +399,24 @@ const createHomepageUtils = (_$w, filterProfiles) => {
|
|
|
362
399
|
});
|
|
363
400
|
}
|
|
364
401
|
async function getAndSetUserLocation(isSearchingNearby, filter) {
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
},
|
|
402
|
+
const { latitude: existingLat, longitude: existingLng } = filter;
|
|
403
|
+
if (isValidGeolocation(existingLat, existingLng)) {
|
|
404
|
+
return {
|
|
405
|
+
success: true,
|
|
406
|
+
filter: applyGeolocationToFilter(filter, existingLat, existingLng, isSearchingNearby),
|
|
371
407
|
};
|
|
372
|
-
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
try {
|
|
411
|
+
const location = await getCurrentGeolocationWithTimeout();
|
|
373
412
|
|
|
374
413
|
console.log('location inside getAndSetUserLocation', location);
|
|
375
414
|
const userLat = location.coords?.latitude ?? 0;
|
|
376
415
|
const userLong = location.coords?.longitude ?? 0;
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
state: isSearchingNearby ? [] : filter.state,
|
|
381
|
-
city: isSearchingNearby ? [] : filter.city,
|
|
382
|
-
stateSearch: isSearchingNearby ? '' : filter.stateSearch,
|
|
383
|
-
citySearch: isSearchingNearby ? '' : filter.citySearch,
|
|
384
|
-
latitude: userLat,
|
|
385
|
-
longitude: userLong,
|
|
416
|
+
return {
|
|
417
|
+
success: true,
|
|
418
|
+
filter: applyGeolocationToFilter(filter, userLat, userLong, isSearchingNearby),
|
|
386
419
|
};
|
|
387
|
-
return { success: true, filter };
|
|
388
420
|
} catch (error) {
|
|
389
421
|
console.warn('Failed to get user location in getAndSetUserLocation', error);
|
|
390
422
|
return { success: false, filter };
|
|
@@ -1,24 +0,0 @@
|
|
|
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
|
-
};
|