diff --git a/packages/spacecat-shared-data-access/docs/schema.json b/packages/spacecat-shared-data-access/docs/schema.json index 0b6d638f4..772caccea 100644 --- a/packages/spacecat-shared-data-access/docs/schema.json +++ b/packages/spacecat-shared-data-access/docs/schema.json @@ -34,6 +34,10 @@ "AttributeName": "isLive", "AttributeType": "B" }, + { + "AttributeName": "isLiveToggledAt", + "AttributeType": "S" + }, { "AttributeName": "deliveryType", "AttributeType": "S" diff --git a/packages/spacecat-shared-data-access/src/dto/site.js b/packages/spacecat-shared-data-access/src/dto/site.js index 008cae0f3..d7db5454c 100644 --- a/packages/spacecat-shared-data-access/src/dto/site.js +++ b/packages/spacecat-shared-data-access/src/dto/site.js @@ -29,6 +29,7 @@ export const SiteDto = { gitHubURL: site.getGitHubURL() || '', imsOrgId: site.getImsOrgId() || '', isLive: site.isLive(), + isLiveToggledAt: site.getIsLiveToggledAt(), createdAt: site.getCreatedAt(), updatedAt: site.getUpdatedAt(), GSI1PK: 'ALL_SITES', @@ -48,6 +49,7 @@ export const SiteDto = { gitHubURL: dynamoItem.gitHubURL, imsOrgId: dynamoItem.imsOrgId, isLive: dynamoItem.isLive, + isLiveToggledAt: dynamoItem.isLiveToggledAt, createdAt: dynamoItem.createdAt, updatedAt: dynamoItem.updatedAt, auditConfig: dynamoItem.auditConfig, diff --git a/packages/spacecat-shared-data-access/src/index.d.ts b/packages/spacecat-shared-data-access/src/index.d.ts index 79533fbac..3864ff1ce 100644 --- a/packages/spacecat-shared-data-access/src/index.d.ts +++ b/packages/spacecat-shared-data-access/src/index.d.ts @@ -185,6 +185,12 @@ export interface Site { */ isLive: () => boolean; + /** + * The timestamp when the site was last toggled to live or non-live. + * @returns {string} The timestamp when the site was last toggled to live or non-live. + */ + getIsLiveToggledAt: () => string; + /** * Updates the list of audits for the site. * @param {Audit[]} audits The new list of audits. diff --git a/packages/spacecat-shared-data-access/src/models/site.js b/packages/spacecat-shared-data-access/src/models/site.js index 4280b5bae..447de2826 100644 --- a/packages/spacecat-shared-data-access/src/models/site.js +++ b/packages/spacecat-shared-data-access/src/models/site.js @@ -39,6 +39,7 @@ const Site = (data = {}) => { self.getGitHubURL = () => self.state.gitHubURL; self.getImsOrgId = () => self.state.imsOrgId; self.isLive = () => self.state.isLive; + self.getIsLiveToggledAt = () => self.state.isLiveToggledAt; // TODO: updating the baseURL is not supported yet, it will require a transact write // on dynamodb (put then delete) since baseURL is part of the primary key, something like: @@ -143,6 +144,7 @@ const Site = (data = {}) => { */ self.toggleLive = () => { self.state.isLive = !self.state.isLive; + self.state.isLiveToggledAt = new Date().toISOString(); return self; }; 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 b525890c3..fbd95fdff 100644 --- a/packages/spacecat-shared-data-access/test/it/db.test.js +++ b/packages/spacecat-shared-data-access/test/it/db.test.js @@ -37,6 +37,7 @@ function checkSite(site) { expect(isIsoDate(site.getUpdatedAt())).to.be.true; expect(site.getAudits()).to.be.an('array'); expect(site.isLive()).to.be.a('boolean'); + expect(isIsoDate(site.getIsLiveToggledAt())).to.be.true; const auditConfig = site.getAuditConfig(); expect(auditConfig).to.be.an('object'); @@ -192,6 +193,8 @@ describe('DynamoDB Integration Test', async () => { baseURL: 'https://newexample.com', gitHubURL: 'https://github.com/some-org/test-repo', imsOrgId: 'newOrg123', + isLive: true, + isLiveToggledAt: new Date().toISOString(), audits: [], auditConfig: { auditsDisabled: false, diff --git a/packages/spacecat-shared-data-access/test/it/generateSampleData.js b/packages/spacecat-shared-data-access/test/it/generateSampleData.js index cc3265098..acea6c555 100644 --- a/packages/spacecat-shared-data-access/test/it/generateSampleData.js +++ b/packages/spacecat-shared-data-access/test/it/generateSampleData.js @@ -167,6 +167,7 @@ export default async function generateSampleData( gitHubURL: `https://github.com/org-${i}/test-repo`, imsOrgId: `${i}-1234@AdobeOrg`, isLive: true, + isLiveToggledAt: nowIso, GSI1PK: config.pkAllSites, createdAt: nowIso, updatedAt: nowIso, diff --git a/packages/spacecat-shared-data-access/test/unit/models/site.test.js b/packages/spacecat-shared-data-access/test/unit/models/site.test.js index 9aea9a94f..fac32d63e 100644 --- a/packages/spacecat-shared-data-access/test/unit/models/site.test.js +++ b/packages/spacecat-shared-data-access/test/unit/models/site.test.js @@ -12,6 +12,7 @@ /* eslint-env mocha */ +import { isIsoDate } from '@adobe/spacecat-shared-utils'; import { expect } from 'chai'; import { createSite } from '../../../src/models/site.js'; import { sleep } from '../util.js'; @@ -167,6 +168,7 @@ describe('Site Model Tests', () => { site.toggleLive(); expect(site.isLive()).to.be.true; + expect(isIsoDate(site.getIsLiveToggledAt())).to.be.true; }); });