@adobe/spacecat-shared-data-access 4.15.2 → 4.16.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,15 @@
1
+ ## [@adobe/spacecat-shared-data-access-v4.16.0](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-data-access-v4.15.3...@adobe/spacecat-shared-data-access-v4.16.0) (2026-07-31)
2
+
3
+ ### Features
4
+
5
+ * **data-access:** expose deployedAt on FixEntity (SITES-47997/48823) ([#1857](https://github.com/adobe/spacecat-shared/issues/1857)) ([512d991](https://github.com/adobe/spacecat-shared/commit/512d991aaee98cad2387807193852937cede6ddd))
6
+
7
+ ## [@adobe/spacecat-shared-data-access-v4.15.3](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-data-access-v4.15.2...@adobe/spacecat-shared-data-access-v4.15.3) (2026-07-29)
8
+
9
+ ### Bug Fixes
10
+
11
+ * bound cdnlogsFilter value length and entry counts ([#1855](https://github.com/adobe/spacecat-shared/issues/1855)) ([ec88c22](https://github.com/adobe/spacecat-shared/commit/ec88c2202f8c3fabd75c3a35be21589a8f7bf29d))
12
+
1
13
  ## [@adobe/spacecat-shared-data-access-v4.15.2](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-data-access-v4.15.1...@adobe/spacecat-shared-data-access-v4.15.2) (2026-07-29)
2
14
 
3
15
  ### Bug Fixes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adobe/spacecat-shared-data-access",
3
- "version": "4.15.2",
3
+ "version": "4.16.0",
4
4
  "description": "Shared modules of the Spacecat Services - Data Access",
5
5
  "type": "module",
6
6
  "engines": {
@@ -33,6 +33,14 @@ const schema = new SchemaBuilder(FixEntity, FixEntityCollection)
33
33
  type: 'string',
34
34
  validate: (value) => !value || isIsoDate(value),
35
35
  })
36
+ // SITES-47997/48823 — the DEPLOYED moment (written/confirmed to author),
37
+ // distinct from executedAt (apply executed) and publishedAt (live). Maps to
38
+ // the fix_entities.deployed_at column; stamped by mystique on the -> DEPLOYED
39
+ // transition. Optional (null for rows created before the column).
40
+ .addAttribute('deployedAt', {
41
+ type: 'string',
42
+ validate: (value) => !value || isIsoDate(value),
43
+ })
36
44
  .addAttribute('publishedAt', {
37
45
  type: 'string',
38
46
  validate: (value) => !value || isIsoDate(value),
@@ -20,6 +20,8 @@ export interface FixEntity extends BaseModel {
20
20
  setChangeDetails(value: object): this;
21
21
  getExecutedAt(): string;
22
22
  setExecutedAt(value: string): this;
23
+ getDeployedAt(): string;
24
+ setDeployedAt(value: string): this;
23
25
  getExecutedBy(): string;
24
26
  setExecutedBy(value: string): this;
25
27
  getOpportunity(): Promise<Opportunity>;
@@ -85,12 +85,22 @@ export const CDN_LOGS_FILTER_KEYS = [
85
85
  'cdn_provider',
86
86
  ];
87
87
 
88
- const CDN_LOGS_FILTER_SCHEMA = Joi.array().items(
88
+ // Bounds on the filter values. `value` entries become Athena regex patterns
89
+ // downstream; SQL injection is already prevented by escaping in the audit worker,
90
+ // but capping length/count limits regex abuse (ReDoS) and stored size.
91
+ const CDN_LOGS_FILTER_MAX_ENTRIES = 50;
92
+ const CDN_LOGS_FILTER_MAX_VALUES = 100;
93
+ const CDN_LOGS_FILTER_MAX_VALUE_LENGTH = 500;
94
+
95
+ const CDN_LOGS_FILTER_SCHEMA = Joi.array().max(CDN_LOGS_FILTER_MAX_ENTRIES).items(
89
96
  Joi.object({
90
97
  // Athena folds column identifiers to lowercase; normalize before matching
91
98
  // the allowlist so a stored 'X_forwarded_host' is accepted as the same column.
92
99
  key: Joi.string().lowercase().valid(...CDN_LOGS_FILTER_KEYS).required(),
93
- value: Joi.array().items(Joi.string()).required(),
100
+ value: Joi.array()
101
+ .max(CDN_LOGS_FILTER_MAX_VALUES)
102
+ .items(Joi.string().max(CDN_LOGS_FILTER_MAX_VALUE_LENGTH))
103
+ .required(),
94
104
  type: Joi.string().valid('include', 'exclude').optional(),
95
105
  }),
96
106
  );