@adobe/spacecat-shared-data-access 2.88.7 → 2.88.9

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,17 @@
1
+ # [@adobe/spacecat-shared-data-access-v2.88.9](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-data-access-v2.88.8...@adobe/spacecat-shared-data-access-v2.88.9) (2025-12-04)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * adding toc audit type ([#1214](https://github.com/adobe/spacecat-shared/issues/1214)) ([7dab7d7](https://github.com/adobe/spacecat-shared/commit/7dab7d7afdcd4b56a56c10b65a3dff0fefb52e4e))
7
+
8
+ # [@adobe/spacecat-shared-data-access-v2.88.8](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-data-access-v2.88.7...@adobe/spacecat-shared-data-access-v2.88.8) (2025-12-01)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * use correct model name ([#1199](https://github.com/adobe/spacecat-shared/issues/1199)) ([3f5fb03](https://github.com/adobe/spacecat-shared/commit/3f5fb036c961036367376617d04bc1a7181146b1)), closes [#pk](https://github.com/adobe/spacecat-shared/issues/pk) [#sk](https://github.com/adobe/spacecat-shared/issues/sk)
14
+
1
15
  # [@adobe/spacecat-shared-data-access-v2.88.7](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-data-access-v2.88.6...@adobe/spacecat-shared-data-access-v2.88.7) (2025-11-30)
2
16
 
3
17
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adobe/spacecat-shared-data-access",
3
- "version": "2.88.7",
3
+ "version": "2.88.9",
4
4
  "description": "Shared modules of the Spacecat Services - Data Access",
5
5
  "type": "module",
6
6
  "engines": {
@@ -79,6 +79,7 @@ class Audit extends BaseModel {
79
79
  LLMO_REFERRAL_TRAFFIC: 'llmo-referral-traffic',
80
80
  PAGE_INTENT: 'page-intent',
81
81
  NO_CTA_ABOVE_THE_FOLD: 'no-cta-above-the-fold',
82
+ TOC: 'toc',
82
83
  };
83
84
 
84
85
  static AUDIT_TYPE_PROPERTIES = {
@@ -11,17 +11,74 @@
11
11
  */
12
12
 
13
13
  import { DataAccessError } from '../../errors/index.js';
14
- import { collectionNameToEntityName } from '../../util/util.js';
15
- import { ENTITY_DEFINITIONS } from './entity-definitions.js';
14
+ import { collectionNameToEntityName, decapitalize } from '../../util/util.js';
15
+
16
+ import ApiKeyCollection from '../api-key/api-key.collection.js';
17
+ import AsyncJobCollection from '../async-job/async-job.collection.js';
18
+ import AuditCollection from '../audit/audit.collection.js';
19
+ import ConfigurationCollection from '../configuration/configuration.collection.js';
20
+ import ExperimentCollection from '../experiment/experiment.collection.js';
21
+ import EntitlementCollection from '../entitlement/entitlement.collection.js';
22
+ import FixEntityCollection from '../fix-entity/fix-entity.collection.js';
23
+ import FixEntitySuggestionCollection from '../fix-entity-suggestion/fix-entity-suggestion.collection.js';
24
+ import ImportJobCollection from '../import-job/import-job.collection.js';
25
+ import ImportUrlCollection from '../import-url/import-url.collection.js';
26
+ import KeyEventCollection from '../key-event/key-event.collection.js';
27
+ import LatestAuditCollection from '../latest-audit/latest-audit.collection.js';
28
+ import OpportunityCollection from '../opportunity/opportunity.collection.js';
29
+ import OrganizationCollection from '../organization/organization.collection.js';
30
+ import ProjectCollection from '../project/project.collection.js';
31
+ import ScrapeJobCollection from '../scrape-job/scrape-job.collection.js';
32
+ import ScrapeUrlCollection from '../scrape-url/scrape-url.collection.js';
33
+ import SiteCandidateCollection from '../site-candidate/site-candidate.collection.js';
34
+ import SiteCollection from '../site/site.collection.js';
35
+ import SiteEnrollmentCollection from '../site-enrollment/site-enrollment.collection.js';
36
+ import SiteTopFormCollection from '../site-top-form/site-top-form.collection.js';
37
+ import SiteTopPageCollection from '../site-top-page/site-top-page.collection.js';
38
+ import SuggestionCollection from '../suggestion/suggestion.collection.js';
39
+ import PageIntentCollection from '../page-intent/page-intent.collection.js';
40
+ import ReportCollection from '../report/report.collection.js';
41
+ import TrialUserCollection from '../trial-user/trial-user.collection.js';
42
+ import TrialUserActivityCollection from '../trial-user-activity/trial-user-activity.collection.js';
43
+ import PageCitabilityCollection from '../page-citability/page-citability.collection.js';
44
+
45
+ import ApiKeySchema from '../api-key/api-key.schema.js';
46
+ import AsyncJobSchema from '../async-job/async-job.schema.js';
47
+ import AuditSchema from '../audit/audit.schema.js';
48
+ import ConfigurationSchema from '../configuration/configuration.schema.js';
49
+ import EntitlementSchema from '../entitlement/entitlement.schema.js';
50
+ import FixEntitySchema from '../fix-entity/fix-entity.schema.js';
51
+ import FixEntitySuggestionSchema from '../fix-entity-suggestion/fix-entity-suggestion.schema.js';
52
+ import ExperimentSchema from '../experiment/experiment.schema.js';
53
+ import ImportJobSchema from '../import-job/import-job.schema.js';
54
+ import ImportUrlSchema from '../import-url/import-url.schema.js';
55
+ import KeyEventSchema from '../key-event/key-event.schema.js';
56
+ import LatestAuditSchema from '../latest-audit/latest-audit.schema.js';
57
+ import OpportunitySchema from '../opportunity/opportunity.schema.js';
58
+ import OrganizationSchema from '../organization/organization.schema.js';
59
+ import ProjectSchema from '../project/project.schema.js';
60
+ import ScrapeJobSchema from '../scrape-job/scrape-job.schema.js';
61
+ import ScrapeUrlSchema from '../scrape-url/scrape-url.schema.js';
62
+ import SiteSchema from '../site/site.schema.js';
63
+ import SiteCandidateSchema from '../site-candidate/site-candidate.schema.js';
64
+ import SiteEnrollmentSchema from '../site-enrollment/site-enrollment.schema.js';
65
+ import SiteTopFormSchema from '../site-top-form/site-top-form.schema.js';
66
+ import SiteTopPageSchema from '../site-top-page/site-top-page.schema.js';
67
+ import SuggestionSchema from '../suggestion/suggestion.schema.js';
68
+ import PageIntentSchema from '../page-intent/page-intent.schema.js';
69
+ import ReportSchema from '../report/report.schema.js';
70
+ import TrialUserSchema from '../trial-user/trial-user.schema.js';
71
+ import TrialUserActivitySchema from '../trial-user-activity/trial-user-activity.schema.js';
72
+ import PageCitabilitySchema from '../page-citability/page-citability.schema.js';
16
73
 
17
74
  /**
18
75
  * EntityRegistry - A registry class responsible for managing entities, their schema and collection.
19
- * This implementation uses pure data structures (no static state) to be resilient
20
- * to bundler duplication.
21
76
  *
22
77
  * @class EntityRegistry
23
78
  */
24
79
  class EntityRegistry {
80
+ static entities = {};
81
+
25
82
  /**
26
83
  * Constructs an instance of EntityRegistry.
27
84
  * @constructor
@@ -42,7 +99,7 @@ class EntityRegistry {
42
99
  * @private
43
100
  */
44
101
  #initialize() {
45
- ENTITY_DEFINITIONS.forEach(({ schema, collection: Collection }) => {
102
+ Object.values(EntityRegistry.entities).forEach(({ collection: Collection, schema }) => {
46
103
  const collection = new Collection(this.service, this, schema, this.log);
47
104
  this.collections.set(Collection.COLLECTION_NAME, collection);
48
105
  });
@@ -70,6 +127,46 @@ class EntityRegistry {
70
127
  }
71
128
  return collections;
72
129
  }
130
+
131
+ static getEntities() {
132
+ return Object.keys(this.entities).reduce((acc, key) => {
133
+ acc[key] = this.entities[key].schema.toElectroDBSchema();
134
+ return acc;
135
+ }, {});
136
+ }
137
+
138
+ static registerEntity(schema, collection) {
139
+ this.entities[decapitalize(schema.getEntityName())] = { schema, collection };
140
+ }
73
141
  }
74
142
 
143
+ EntityRegistry.registerEntity(ApiKeySchema, ApiKeyCollection);
144
+ EntityRegistry.registerEntity(AsyncJobSchema, AsyncJobCollection);
145
+ EntityRegistry.registerEntity(AuditSchema, AuditCollection);
146
+ EntityRegistry.registerEntity(ConfigurationSchema, ConfigurationCollection);
147
+ EntityRegistry.registerEntity(EntitlementSchema, EntitlementCollection);
148
+ EntityRegistry.registerEntity(FixEntitySchema, FixEntityCollection);
149
+ EntityRegistry.registerEntity(FixEntitySuggestionSchema, FixEntitySuggestionCollection);
150
+ EntityRegistry.registerEntity(ExperimentSchema, ExperimentCollection);
151
+ EntityRegistry.registerEntity(ImportJobSchema, ImportJobCollection);
152
+ EntityRegistry.registerEntity(ImportUrlSchema, ImportUrlCollection);
153
+ EntityRegistry.registerEntity(KeyEventSchema, KeyEventCollection);
154
+ EntityRegistry.registerEntity(LatestAuditSchema, LatestAuditCollection);
155
+ EntityRegistry.registerEntity(OpportunitySchema, OpportunityCollection);
156
+ EntityRegistry.registerEntity(OrganizationSchema, OrganizationCollection);
157
+ EntityRegistry.registerEntity(ProjectSchema, ProjectCollection);
158
+ EntityRegistry.registerEntity(ScrapeJobSchema, ScrapeJobCollection);
159
+ EntityRegistry.registerEntity(ScrapeUrlSchema, ScrapeUrlCollection);
160
+ EntityRegistry.registerEntity(SiteSchema, SiteCollection);
161
+ EntityRegistry.registerEntity(SiteCandidateSchema, SiteCandidateCollection);
162
+ EntityRegistry.registerEntity(SiteEnrollmentSchema, SiteEnrollmentCollection);
163
+ EntityRegistry.registerEntity(SiteTopFormSchema, SiteTopFormCollection);
164
+ EntityRegistry.registerEntity(SiteTopPageSchema, SiteTopPageCollection);
165
+ EntityRegistry.registerEntity(SuggestionSchema, SuggestionCollection);
166
+ EntityRegistry.registerEntity(PageIntentSchema, PageIntentCollection);
167
+ EntityRegistry.registerEntity(ReportSchema, ReportCollection);
168
+ EntityRegistry.registerEntity(TrialUserSchema, TrialUserCollection);
169
+ EntityRegistry.registerEntity(TrialUserActivitySchema, TrialUserActivityCollection);
170
+ EntityRegistry.registerEntity(PageCitabilitySchema, PageCitabilityCollection);
171
+
75
172
  export default EntityRegistry;
@@ -27,7 +27,8 @@ class ConfigurationCollection extends BaseCollection {
27
27
  async create(data) {
28
28
  const latestConfiguration = await this.findLatest();
29
29
  const version = latestConfiguration ? incrementVersion(latestConfiguration.getVersion()) : 1;
30
- const sanitizedData = sanitizeIdAndAuditFields('Organization', data);
30
+ const sanitizedData = sanitizeIdAndAuditFields('Configuration', data);
31
+
31
32
  sanitizedData.version = version;
32
33
 
33
34
  return super.create(sanitizedData);
@@ -14,6 +14,8 @@ import { isNonEmptyObject } from '@adobe/spacecat-shared-utils';
14
14
  import crypto from 'crypto';
15
15
  import Joi from 'joi';
16
16
 
17
+ import { getLogger } from '../../util/logger-registry.js';
18
+
17
19
  export const IMPORT_TYPES = {
18
20
  LLMO_QUESTIONS_IMPORT_TYPE: 'llmo-prompts-ahrefs',
19
21
  ORGANIC_KEYWORDS: 'organic-keywords',
@@ -404,12 +406,13 @@ export const Config = (data = {}) => {
404
406
  try {
405
407
  configData = validateConfiguration(data);
406
408
  } catch (error) {
407
- // Log validation errors to console as this is called from schema getters
408
- // where we don't have access to the logger instance
409
- console.error('Site configuration validation failed, using provided data', {
410
- error: error.message,
411
- invalidConfig: data,
412
- });
409
+ const logger = getLogger();
410
+ if (logger && logger !== console) {
411
+ logger.error('Site configuration validation failed, using provided data', {
412
+ error: error.message,
413
+ invalidConfig: data,
414
+ });
415
+ }
413
416
  configData = { ...data };
414
417
  }
415
418
 
@@ -16,7 +16,7 @@ import { Service } from 'electrodb';
16
16
 
17
17
  import { instrumentAWSClient } from '@adobe/spacecat-shared-utils';
18
18
  import { EntityRegistry } from '../models/index.js';
19
- import { getEntitySchemas } from '../models/base/entity-definitions.js';
19
+ import { registerLogger } from '../util/logger-registry.js';
20
20
 
21
21
  export * from '../errors/index.js';
22
22
  export * from '../models/index.js';
@@ -56,7 +56,7 @@ const createElectroService = (client, config, log) => {
56
56
  /* c8 ignore end */
57
57
 
58
58
  return new Service(
59
- getEntitySchemas(),
59
+ EntityRegistry.getEntities(),
60
60
  {
61
61
  client,
62
62
  table,
@@ -74,6 +74,8 @@ const createElectroService = (client, config, log) => {
74
74
  * @returns {object} Data access collections for interacting with entities
75
75
  */
76
76
  export const createDataAccess = (config, log = console, client = undefined) => {
77
+ registerLogger(log);
78
+
77
79
  const rawClient = createRawClient(client);
78
80
  const electroService = createElectroService(rawClient, config, log);
79
81
  const entityRegistry = new EntityRegistry(electroService, log);
package/src/util/index.js CHANGED
@@ -21,3 +21,8 @@ export {
21
21
  guardSet,
22
22
  guardString,
23
23
  } from './guards.js';
24
+
25
+ export {
26
+ registerLogger,
27
+ getLogger,
28
+ } from './logger-registry.js';
@@ -0,0 +1,50 @@
1
+ /*
2
+ * Copyright 2025 Adobe. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+
13
+ class LoggerRegistry {
14
+ static #instance = null;
15
+
16
+ #logger = null;
17
+
18
+ static getInstance() {
19
+ if (!LoggerRegistry.#instance) {
20
+ LoggerRegistry.#instance = new LoggerRegistry();
21
+ }
22
+ return LoggerRegistry.#instance;
23
+ }
24
+
25
+ setLogger(logger) {
26
+ this.#logger = logger;
27
+ }
28
+
29
+ getLogger() {
30
+ return this.#logger || console;
31
+ }
32
+ }
33
+
34
+ /**
35
+ * Registers a logger instance for global access.
36
+ * This should be called during data access initialization.
37
+ * @param {Object} logger - Logger instance
38
+ */
39
+ export function registerLogger(logger) {
40
+ LoggerRegistry.getInstance().setLogger(logger);
41
+ }
42
+
43
+ /**
44
+ * Gets the currently registered logger instance.
45
+ * Falls back to console if no logger is registered.
46
+ * @returns {Object} Logger instance
47
+ */
48
+ export function getLogger() {
49
+ return LoggerRegistry.getInstance().getLogger();
50
+ }
@@ -1,122 +0,0 @@
1
- /*
2
- * Copyright 2025 Adobe. All rights reserved.
3
- * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
- * you may not use this file except in compliance with the License. You may obtain a copy
5
- * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
- *
7
- * Unless required by applicable law or agreed to in writing, software distributed under
8
- * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
- * OF ANY KIND, either express or implied. See the License for the specific language
10
- * governing permissions and limitations under the License.
11
- */
12
-
13
- import { decapitalize } from '../../util/util.js';
14
-
15
- // Import all schemas
16
- import ApiKeySchema from '../api-key/api-key.schema.js';
17
- import AsyncJobSchema from '../async-job/async-job.schema.js';
18
- import AuditSchema from '../audit/audit.schema.js';
19
- import ConfigurationSchema from '../configuration/configuration.schema.js';
20
- import EntitlementSchema from '../entitlement/entitlement.schema.js';
21
- import FixEntitySchema from '../fix-entity/fix-entity.schema.js';
22
- import FixEntitySuggestionSchema from '../fix-entity-suggestion/fix-entity-suggestion.schema.js';
23
- import ExperimentSchema from '../experiment/experiment.schema.js';
24
- import ImportJobSchema from '../import-job/import-job.schema.js';
25
- import ImportUrlSchema from '../import-url/import-url.schema.js';
26
- import KeyEventSchema from '../key-event/key-event.schema.js';
27
- import LatestAuditSchema from '../latest-audit/latest-audit.schema.js';
28
- import OpportunitySchema from '../opportunity/opportunity.schema.js';
29
- import OrganizationSchema from '../organization/organization.schema.js';
30
- import ProjectSchema from '../project/project.schema.js';
31
- import ScrapeJobSchema from '../scrape-job/scrape-job.schema.js';
32
- import ScrapeUrlSchema from '../scrape-url/scrape-url.schema.js';
33
- import SiteSchema from '../site/site.schema.js';
34
- import SiteCandidateSchema from '../site-candidate/site-candidate.schema.js';
35
- import SiteEnrollmentSchema from '../site-enrollment/site-enrollment.schema.js';
36
- import SiteTopFormSchema from '../site-top-form/site-top-form.schema.js';
37
- import SiteTopPageSchema from '../site-top-page/site-top-page.schema.js';
38
- import SuggestionSchema from '../suggestion/suggestion.schema.js';
39
- import PageIntentSchema from '../page-intent/page-intent.schema.js';
40
- import ReportSchema from '../report/report.schema.js';
41
- import TrialUserSchema from '../trial-user/trial-user.schema.js';
42
- import TrialUserActivitySchema from '../trial-user-activity/trial-user-activity.schema.js';
43
- import PageCitabilitySchema from '../page-citability/page-citability.schema.js';
44
-
45
- // Import all collections
46
- import ApiKeyCollection from '../api-key/api-key.collection.js';
47
- import AsyncJobCollection from '../async-job/async-job.collection.js';
48
- import AuditCollection from '../audit/audit.collection.js';
49
- import ConfigurationCollection from '../configuration/configuration.collection.js';
50
- import EntitlementCollection from '../entitlement/entitlement.collection.js';
51
- import FixEntityCollection from '../fix-entity/fix-entity.collection.js';
52
- import FixEntitySuggestionCollection from '../fix-entity-suggestion/fix-entity-suggestion.collection.js';
53
- import ExperimentCollection from '../experiment/experiment.collection.js';
54
- import ImportJobCollection from '../import-job/import-job.collection.js';
55
- import ImportUrlCollection from '../import-url/import-url.collection.js';
56
- import KeyEventCollection from '../key-event/key-event.collection.js';
57
- import LatestAuditCollection from '../latest-audit/latest-audit.collection.js';
58
- import OpportunityCollection from '../opportunity/opportunity.collection.js';
59
- import OrganizationCollection from '../organization/organization.collection.js';
60
- import ProjectCollection from '../project/project.collection.js';
61
- import ScrapeJobCollection from '../scrape-job/scrape-job.collection.js';
62
- import ScrapeUrlCollection from '../scrape-url/scrape-url.collection.js';
63
- import SiteCollection from '../site/site.collection.js';
64
- import SiteCandidateCollection from '../site-candidate/site-candidate.collection.js';
65
- import SiteEnrollmentCollection from '../site-enrollment/site-enrollment.collection.js';
66
- import SiteTopFormCollection from '../site-top-form/site-top-form.collection.js';
67
- import SiteTopPageCollection from '../site-top-page/site-top-page.collection.js';
68
- import SuggestionCollection from '../suggestion/suggestion.collection.js';
69
- import PageIntentCollection from '../page-intent/page-intent.collection.js';
70
- import ReportCollection from '../report/report.collection.js';
71
- import TrialUserCollection from '../trial-user/trial-user.collection.js';
72
- import TrialUserActivityCollection from '../trial-user-activity/trial-user-activity.collection.js';
73
- import PageCitabilityCollection from '../page-citability/page-citability.collection.js';
74
-
75
- /**
76
- * Central registry of all entity definitions.
77
- * This is a plain constant array with no side effects.
78
- * Each entry pairs a schema with its collection class.
79
- */
80
- export const ENTITY_DEFINITIONS = [
81
- { schema: ApiKeySchema, collection: ApiKeyCollection },
82
- { schema: AsyncJobSchema, collection: AsyncJobCollection },
83
- { schema: AuditSchema, collection: AuditCollection },
84
- { schema: ConfigurationSchema, collection: ConfigurationCollection },
85
- { schema: EntitlementSchema, collection: EntitlementCollection },
86
- { schema: FixEntitySchema, collection: FixEntityCollection },
87
- { schema: FixEntitySuggestionSchema, collection: FixEntitySuggestionCollection },
88
- { schema: ExperimentSchema, collection: ExperimentCollection },
89
- { schema: ImportJobSchema, collection: ImportJobCollection },
90
- { schema: ImportUrlSchema, collection: ImportUrlCollection },
91
- { schema: KeyEventSchema, collection: KeyEventCollection },
92
- { schema: LatestAuditSchema, collection: LatestAuditCollection },
93
- { schema: OpportunitySchema, collection: OpportunityCollection },
94
- { schema: OrganizationSchema, collection: OrganizationCollection },
95
- { schema: ProjectSchema, collection: ProjectCollection },
96
- { schema: ScrapeJobSchema, collection: ScrapeJobCollection },
97
- { schema: ScrapeUrlSchema, collection: ScrapeUrlCollection },
98
- { schema: SiteSchema, collection: SiteCollection },
99
- { schema: SiteCandidateSchema, collection: SiteCandidateCollection },
100
- { schema: SiteEnrollmentSchema, collection: SiteEnrollmentCollection },
101
- { schema: SiteTopFormSchema, collection: SiteTopFormCollection },
102
- { schema: SiteTopPageSchema, collection: SiteTopPageCollection },
103
- { schema: SuggestionSchema, collection: SuggestionCollection },
104
- { schema: PageIntentSchema, collection: PageIntentCollection },
105
- { schema: ReportSchema, collection: ReportCollection },
106
- { schema: TrialUserSchema, collection: TrialUserCollection },
107
- { schema: TrialUserActivitySchema, collection: TrialUserActivityCollection },
108
- { schema: PageCitabilitySchema, collection: PageCitabilityCollection },
109
- ];
110
-
111
- /**
112
- * Converts entity definitions to ElectroDB schema format.
113
- * This is a pure function with no side effects.
114
- *
115
- * @returns {Object} Map of entity names to ElectroDB schemas
116
- */
117
- export function getEntitySchemas() {
118
- return ENTITY_DEFINITIONS.reduce((acc, { schema }) => {
119
- acc[decapitalize(schema.getEntityName())] = schema.toElectroDBSchema();
120
- return acc;
121
- }, {});
122
- }