abmp-npm 2.0.53 → 2.0.55

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.
@@ -148,7 +148,9 @@ function buildMembersSearchQuery(data) {
148
148
  latitude: filter.latitude,
149
149
  longitude: filter.longitude,
150
150
  },
151
- findMainAddress(item.addressDisplayOption, item.addresses)
151
+ findMainAddress(item.addressDisplayOption, item.addresses, {
152
+ requireValidCoordinates: true,
153
+ })
152
154
  ),
153
155
  }));
154
156
  const resultWithDistances = {
@@ -16,7 +16,8 @@ async function ensureUniqueUrlsInBatch(memberDataList) {
16
16
  return memberDataList;
17
17
  }
18
18
 
19
- // Group members by their normalized base URL
19
+ // Group members by their normalized base URL (case-insensitive to avoid
20
+ // "John-12" and "john-12" being treated as different when slugs are matched case-insensitively)
20
21
  const urlGroups = new Map();
21
22
 
22
23
  memberDataList.forEach(member => {
@@ -24,16 +25,17 @@ async function ensureUniqueUrlsInBatch(memberDataList) {
24
25
  return;
25
26
  }
26
27
 
27
- // Extract the base URL (without any counter) for grouping
28
28
  const baseUrl = extractBaseUrl(member.url);
29
- if (!urlGroups.has(baseUrl)) {
30
- urlGroups.set(baseUrl, []);
29
+ const groupKey = baseUrl.toLowerCase();
30
+ if (!urlGroups.has(groupKey)) {
31
+ urlGroups.set(groupKey, []);
31
32
  }
32
- urlGroups.get(baseUrl).push(member);
33
+ urlGroups.get(groupKey).push(member);
33
34
  });
34
35
 
35
36
  // For each group, check database and assign unique URLs sequentially
36
- for (const [baseUrl, members] of urlGroups.entries()) {
37
+ for (const [groupKey, members] of urlGroups.entries()) {
38
+ const baseUrl = groupKey; // lowercase for consistent slug assignment
37
39
  if (members.length <= 1) {
38
40
  // Single member - still check DB to ensure it doesn't conflict with other pages
39
41
  const member = members[0];
@@ -1,6 +1,7 @@
1
1
  const { COLLECTIONS } = require('../public/consts');
2
2
 
3
3
  const { ensureUniqueUrlsInBatch } = require('./daily-pull/bulk-process-methods');
4
+ const { ensureUniqueUrl } = require('./daily-pull/process-member-methods');
4
5
  const { wixData } = require('./elevated-modules');
5
6
  const { bulkSaveMembers } = require('./members-data-methods');
6
7
  const { queryAllItems } = require('./utils');
@@ -27,4 +28,31 @@ async function copyContactIdToWixMemberId() {
27
28
  return await bulkSaveMembers(updatedMembers, COLLECTIONS.MEMBERS_DATA);
28
29
  }
29
30
 
30
- module.exports = { deduplicateURls, copyContactIdToWixMemberId };
31
+ async function createMissingUrls() {
32
+ const query = wixData.query(COLLECTIONS.MEMBERS_DATA).isEmpty('url');
33
+ const members = await queryAllItems(query);
34
+ console.log(
35
+ 'membersWithoutUrls info',
36
+ JSON.stringify({
37
+ count: members.length,
38
+ membersIds: members.map(m => m.memberId),
39
+ })
40
+ );
41
+
42
+ const membersWithGeneratedUrlsPromises = members.map(async member => ({
43
+ ...member,
44
+ url: await ensureUniqueUrl({
45
+ url: member.url,
46
+ memberId: member.memberId,
47
+ fullName: member.fullName,
48
+ }),
49
+ }));
50
+ const membersWithGeneratedUrls = await Promise.all(membersWithGeneratedUrlsPromises);
51
+ //recheck urls in same batch to avoid duplicates
52
+ const uniqueUrlsUpdatedMembers = await ensureUniqueUrlsInBatch(membersWithGeneratedUrls);
53
+ const urls = uniqueUrlsUpdatedMembers.map(m => m.url).filter(Boolean);
54
+ console.log('unique urls', [...new Set(urls)]);
55
+ return await bulkSaveMembers(uniqueUrlsUpdatedMembers, COLLECTIONS.MEMBERS_DATA);
56
+ }
57
+
58
+ module.exports = { deduplicateURls, copyContactIdToWixMemberId, createMissingUrls };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "abmp-npm",
3
- "version": "2.0.53",
3
+ "version": "2.0.55",
4
4
  "main": "index.js",
5
5
  "scripts": {
6
6
  "check-cycles": "madge --circular .",
@@ -66,20 +66,31 @@ function debouncedFunction({ func, debounceTimeout, timeoutType, args }) {
66
66
 
67
67
  const isValidLocation = location => location.latitude && location.longitude;
68
68
 
69
- function findMainAddress(addressDisplayOption = [], addresses = []) {
70
- const options = Array.isArray(addressDisplayOption) ? addressDisplayOption : [];
71
- const mainOpt = options.find(opt => opt.isMain);
69
+ /**
70
+ * @param {Array} addressDisplayOption
71
+ * @param {Array} addresses
72
+ * @param {Object|boolean} [options] - Optional. Pass { requireValidCoordinates: true } for home search/distance; omit or false for profile display.
73
+ */
74
+ function findMainAddress(addressDisplayOption = [], addresses = [], options = {}) {
75
+ const requireValidCoordinates =
76
+ typeof options === 'boolean' ? options : Boolean(options?.requireValidCoordinates);
77
+ const optionsArr = Array.isArray(addressDisplayOption) ? addressDisplayOption : [];
78
+ const mainOpt = optionsArr.find(opt => opt.isMain);
72
79
  if (mainOpt) {
73
80
  const mainAddr = addresses.find(
74
- addr => addr.key === mainOpt.key && addr.addressStatus !== ADDRESS_STATUS_TYPES.DONT_SHOW
81
+ addr =>
82
+ addr.key === mainOpt.key &&
83
+ addr.addressStatus !== ADDRESS_STATUS_TYPES.DONT_SHOW &&
84
+ (!requireValidCoordinates || isValidLocation(addr))
75
85
  );
76
- if (mainAddr && isValidLocation(mainAddr)) {
86
+ if (mainAddr) {
77
87
  return mainAddr;
78
88
  }
79
89
  }
80
- // 2) fallback: if there is any visible address, use it
81
90
  const visibleAddresses = addresses.filter(
82
- addr => addr.addressStatus !== ADDRESS_STATUS_TYPES.DONT_SHOW && isValidLocation(addr)
91
+ addr =>
92
+ addr.addressStatus !== ADDRESS_STATUS_TYPES.DONT_SHOW &&
93
+ (!requireValidCoordinates || isValidLocation(addr))
83
94
  );
84
95
  if (visibleAddresses.length) {
85
96
  return visibleAddresses[0];
@@ -107,8 +118,13 @@ function formatAddress(item) {
107
118
  return addressParts.filter(Boolean).join(', ');
108
119
  }
109
120
 
110
- function getMainAddress(addressDisplayOption = [], addresses = []) {
111
- const mainAddr = findMainAddress(addressDisplayOption, addresses);
121
+ /**
122
+ * @param {Array} addressDisplayOption
123
+ * @param {Array} addresses
124
+ * @param {Object|boolean} [options] - Optional. Pass { requireValidCoordinates: true } for home search/distance; omit or false for profile display.
125
+ */
126
+ function getMainAddress(addressDisplayOption = [], addresses = [], options = {}) {
127
+ const mainAddr = findMainAddress(addressDisplayOption, addresses, options);
112
128
  if (mainAddr) {
113
129
  return formatAddress(mainAddr);
114
130
  }