@adobe/spacecat-shared-data-access 4.6.0 → 4.7.0

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/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## [@adobe/spacecat-shared-data-access-v4.7.0](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-data-access-v4.6.0...@adobe/spacecat-shared-data-access-v4.7.0) (2026-07-13)
2
+
3
+ ### Features
4
+
5
+ * **data-access:** add TicketSuggestion bulk accessors allBySuggestionIds and allByTicketIds (SITES-44690) ([#1804](https://github.com/adobe/spacecat-shared/issues/1804)) ([99387f6](https://github.com/adobe/spacecat-shared/commit/99387f64423c822c0f377014d245549bed68cd40))
6
+
1
7
  ## [@adobe/spacecat-shared-data-access-v4.6.0](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-data-access-v4.5.0...@adobe/spacecat-shared-data-access-v4.6.0) (2026-07-12)
2
8
 
3
9
  ### Features
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adobe/spacecat-shared-data-access",
3
- "version": "4.6.0",
3
+ "version": "4.7.0",
4
4
  "description": "Shared modules of the Spacecat Services - Data Access",
5
5
  "type": "module",
6
6
  "engines": {
@@ -10,8 +10,12 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
 
13
+ import { DataAccessError } from '../../errors/index.js';
14
+ import { guardArray } from '../../util/guards.js';
13
15
  import BaseCollection from '../base/base.collection.js';
14
16
 
17
+ const IN_FILTER_CHUNK_SIZE = 50;
18
+
15
19
  /**
16
20
  * TicketSuggestionCollection — manages TicketSuggestion bridge records.
17
21
  *
@@ -24,6 +28,80 @@ import BaseCollection from '../base/base.collection.js';
24
28
  */
25
29
  class TicketSuggestionCollection extends BaseCollection {
26
30
  static COLLECTION_NAME = 'TicketSuggestionCollection';
31
+
32
+ /**
33
+ * Returns all bridge records whose suggestion_id is in the given array.
34
+ * Used for bulk pre-flight checks before ticket creation.
35
+ *
36
+ * @param {string[]} suggestionIds
37
+ * @returns {Promise<import('./ticket-suggestion.model.js').default[]>}
38
+ */
39
+ async allBySuggestionIds(suggestionIds) {
40
+ guardArray('suggestionIds', suggestionIds, 'TicketSuggestionCollection', 'string');
41
+
42
+ if (suggestionIds.length === 0) {
43
+ return [];
44
+ }
45
+
46
+ try {
47
+ const uniqueIds = [...new Set(suggestionIds)];
48
+ const chunks = [];
49
+ for (let i = 0; i < uniqueIds.length; i += IN_FILTER_CHUNK_SIZE) {
50
+ chunks.push(uniqueIds.slice(i, i + IN_FILTER_CHUNK_SIZE));
51
+ }
52
+
53
+ const results = await Promise.all(
54
+ chunks.map((chunk) => this.all(
55
+ {},
56
+ { where: (attrs, op) => op.in(attrs.suggestionId, chunk) },
57
+ )),
58
+ );
59
+
60
+ return results.flat();
61
+ } catch (error) {
62
+ if (error instanceof DataAccessError) {
63
+ throw error;
64
+ }
65
+ throw new DataAccessError('Failed to load ticket suggestions by suggestion IDs', this, error);
66
+ }
67
+ }
68
+
69
+ /**
70
+ * Returns all bridge records whose ticket_id is in the given array.
71
+ * Used to bulk-load suggestion mappings when listing tickets.
72
+ *
73
+ * @param {string[]} ticketIds
74
+ * @returns {Promise<import('./ticket-suggestion.model.js').default[]>}
75
+ */
76
+ async allByTicketIds(ticketIds) {
77
+ guardArray('ticketIds', ticketIds, 'TicketSuggestionCollection', 'string');
78
+
79
+ if (ticketIds.length === 0) {
80
+ return [];
81
+ }
82
+
83
+ try {
84
+ const uniqueIds = [...new Set(ticketIds)];
85
+ const chunks = [];
86
+ for (let i = 0; i < uniqueIds.length; i += IN_FILTER_CHUNK_SIZE) {
87
+ chunks.push(uniqueIds.slice(i, i + IN_FILTER_CHUNK_SIZE));
88
+ }
89
+
90
+ const results = await Promise.all(
91
+ chunks.map((chunk) => this.all(
92
+ {},
93
+ { where: (attrs, op) => op.in(attrs.ticketId, chunk) },
94
+ )),
95
+ );
96
+
97
+ return results.flat();
98
+ } catch (error) {
99
+ if (error instanceof DataAccessError) {
100
+ throw error;
101
+ }
102
+ throw new DataAccessError('Failed to load ticket suggestions by ticket IDs', this, error);
103
+ }
104
+ }
27
105
  }
28
106
 
29
107
  export default TicketSuggestionCollection;