diff --git a/packages/spacecat-shared-data-access/src/index.d.ts b/packages/spacecat-shared-data-access/src/index.d.ts index e2ced738b..d1212d909 100644 --- a/packages/spacecat-shared-data-access/src/index.d.ts +++ b/packages/spacecat-shared-data-access/src/index.d.ts @@ -81,6 +81,9 @@ export interface DataAccess { baseUrl: string, auditType: string, ) => Promise; + getSiteByID: ( + siteId: string, + ) => Promise; addSite: ( siteData: object, ) => Promise; diff --git a/packages/spacecat-shared-data-access/src/service/sites/accessPatterns.js b/packages/spacecat-shared-data-access/src/service/sites/accessPatterns.js index fe589753b..ecfc898ec 100644 --- a/packages/spacecat-shared-data-access/src/service/sites/accessPatterns.js +++ b/packages/spacecat-shared-data-access/src/service/sites/accessPatterns.js @@ -42,16 +42,16 @@ export const getSites = async (dynamoClient, config) => { }; /** - * Retrieves a list of base URLs for all sites. + * Retrieves a list of site IDs of all sites. * * @param {DynamoDbClient} dynamoClient - The DynamoDB client. * @param {DataAccessConfig} config - The data access config. - * @returns {Promise>} A promise that resolves to an array of base URLs for all sites. + * @returns {Promise>} A promise that resolves to an array of site IDs of all sites. */ export const getSitesToAudit = async (dynamoClient, config) => { const sites = await getSites(dynamoClient, config); - return sites.map((site) => site.getBaseURL()); + return sites.map((site) => site.getId()); }; /** @@ -117,11 +117,7 @@ export const getSiteByBaseURL = async ( Limit: 1, }); - if (dynamoItems.length === 0) { - return null; - } - - return SiteDto.fromDynamoItem(dynamoItems[0]); + return dynamoItems.length > 0 ? SiteDto.fromDynamoItem(dynamoItems[0]) : null; }; /** @@ -209,6 +205,27 @@ export const getSiteByBaseURLWithLatestAudit = async ( auditType, ) => getSiteByBaseURLWithAuditInfo(dynamoClient, config, log, baseUrl, auditType, true); +/** + * Retrieves a site by its ID. + * + * @param {DynamoDbClient} dynamoClient - The DynamoDB client. + * @param {DataAccessConfig} config - The data access config. + * @param {Logger} log - The logger. + * @param {string} siteId - The ID of the site to retrieve. + * @returns {Promise|null>} A promise that resolves to the site object if found, + * otherwise null. + */ +export const getSiteByID = async ( + dynamoClient, + config, + log, + siteId, +) => { + const dynamoItem = await dynamoClient.getItem(config.tableNameSites, { id: siteId }); + + return isObject(dynamoItem) ? SiteDto.fromDynamoItem(dynamoItem) : null; +}; + /** * Adds a site. * diff --git a/packages/spacecat-shared-data-access/src/service/sites/index.js b/packages/spacecat-shared-data-access/src/service/sites/index.js index e0e357511..d1f6a9983 100644 --- a/packages/spacecat-shared-data-access/src/service/sites/index.js +++ b/packages/spacecat-shared-data-access/src/service/sites/index.js @@ -16,6 +16,7 @@ import { getSiteByBaseURLWithAuditInfo, getSiteByBaseURLWithAudits, getSiteByBaseURLWithLatestAudit, + getSiteByID, getSites, getSitesToAudit, getSitesWithLatestAudit, removeSite, @@ -44,6 +45,12 @@ export const siteFunctions = (dynamoClient, config, log) => ({ log, baseUrl, ), + getSiteByID: (siteId) => getSiteByID( + dynamoClient, + config, + log, + siteId, + ), getSiteByBaseURLWithAuditInfo: (baseUrl, auditType, latestOnly) => getSiteByBaseURLWithAuditInfo( dynamoClient, config, diff --git a/packages/spacecat-shared-data-access/test/it/db.test.js b/packages/spacecat-shared-data-access/test/it/db.test.js index 493d76f1d..3ba949b68 100644 --- a/packages/spacecat-shared-data-access/test/it/db.test.js +++ b/packages/spacecat-shared-data-access/test/it/db.test.js @@ -16,7 +16,7 @@ import chai from 'chai'; import chaiAsPromised from 'chai-as-promised'; import dynamoDbLocal from 'dynamo-db-local'; -import { isIsoDate, isValidUrl } from '@adobe/spacecat-shared-utils'; +import { isIsoDate } from '@adobe/spacecat-shared-utils'; import { sleep } from '../unit/util.js'; import { createDataAccess } from '../../src/service/index.js'; import { AUDIT_TYPE_LHS_MOBILE } from '../../src/models/audit.js'; @@ -105,9 +105,8 @@ describe('DynamoDB Integration Test', async () => { expect(sites.length).to.equal(NUMBER_OF_SITES); - sites.forEach((baseURL) => { - expect(baseURL).to.be.a('string'); - expect(isValidUrl(baseURL)).to.equal(true); + sites.forEach((siteId) => { + expect(siteId).to.be.a('string'); }); }); @@ -137,6 +136,16 @@ describe('DynamoDB Integration Test', async () => { checkSite(site); }); + it('gets site by ID', async () => { + const siteId = (await dataAccess.getSites())[0].getId(); + const site = await dataAccess.getSiteByID(siteId); + + expect(site).to.be.an('object'); + + checkSite(site); + expect(site.getId()).to.equal(siteId); + }); + it('adds a new site', async () => { const newSiteData = { baseURL: 'https://newexample.com', diff --git a/packages/spacecat-shared-data-access/test/unit/service/index.test.js b/packages/spacecat-shared-data-access/test/unit/service/index.test.js index 2c2f537ed..93293cb76 100644 --- a/packages/spacecat-shared-data-access/test/unit/service/index.test.js +++ b/packages/spacecat-shared-data-access/test/unit/service/index.test.js @@ -35,6 +35,7 @@ describe('Data Access Object Tests', () => { 'getSiteByBaseURLWithAuditInfo', 'getSiteByBaseURLWithAudits', 'getSiteByBaseURLWithLatestAudit', + 'getSiteByID', ]; let dao; diff --git a/packages/spacecat-shared-data-access/test/unit/service/sites/index.test.js b/packages/spacecat-shared-data-access/test/unit/service/sites/index.test.js index e442daa38..7e8d671ad 100644 --- a/packages/spacecat-shared-data-access/test/unit/service/sites/index.test.js +++ b/packages/spacecat-shared-data-access/test/unit/service/sites/index.test.js @@ -152,12 +152,34 @@ describe('Site Access Pattern Tests', () => { expect(result).to.be.an('array').that.is.empty; }); - it('calls getSiteByBaseURL and returns an array/object', async () => { + it('calls getSiteByBaseURL and returns null', async () => { const result = await exportedFunctions.getSiteByBaseURL(); expect(result).to.be.null; expect(mockDynamoClient.query.called).to.be.true; }); + it('calls getSiteByID and returns null', async () => { + const result = await exportedFunctions.getSiteByID(); + expect(result).to.be.null; + expect(mockDynamoClient.getItem.called).to.be.true; + }); + + it('calls getSiteByID and returns site', async () => { + const mockSiteData = { + id: 'site1', + baseURL: 'https://example.com', + }; + + mockDynamoClient.getItem.onFirstCall().resolves(mockSiteData); + + const result = await exportedFunctions.getSiteByID(); + + expect(result).to.be.an('object'); + expect(result.getId()).to.equal(mockSiteData.id); + expect(result.getBaseURL()).to.equal(mockSiteData.baseURL); + expect(mockDynamoClient.getItem.called).to.be.true; + }); + it('calls getSiteByBaseURLWithAuditInfo and returns an array/object', async () => { const result = await exportedFunctions.getSiteByBaseURLWithAuditInfo(); expect(result).to.be.null;