From 8a413fd06677f4c7b11d9d1704e502a10e215f0d Mon Sep 17 00:00:00 2001 From: alinarublea Date: Wed, 17 Jan 2024 11:21:29 +0100 Subject: [PATCH] feat: data model for organizations --- .../src/dto/organization.js | 2 +- .../spacecat-shared-data-access/src/dto/site.js | 2 +- .../src/models/organization.js | 9 ++------- .../src/models/site.js | 9 ++------- .../src/models/site/config.js | 17 +++++++++++------ .../test/it/db.test.js | 15 +++------------ .../test/unit/models/organization.test.js | 10 ++++------ 7 files changed, 24 insertions(+), 40 deletions(-) diff --git a/packages/spacecat-shared-data-access/src/dto/organization.js b/packages/spacecat-shared-data-access/src/dto/organization.js index 133afde7..27fc9c26 100644 --- a/packages/spacecat-shared-data-access/src/dto/organization.js +++ b/packages/spacecat-shared-data-access/src/dto/organization.js @@ -10,7 +10,7 @@ * governing permissions and limitations under the License. */ -import Config from '../models/site/config.js'; +import { Config } from '../models/site/config.js'; import { createOrganization } from '../models/organization.js'; /** diff --git a/packages/spacecat-shared-data-access/src/dto/site.js b/packages/spacecat-shared-data-access/src/dto/site.js index 905874fb..700bf398 100644 --- a/packages/spacecat-shared-data-access/src/dto/site.js +++ b/packages/spacecat-shared-data-access/src/dto/site.js @@ -12,7 +12,7 @@ import { createSite } from '../models/site.js'; import AuditConfig from '../models/site/audit-config.js'; -import Config from '../models/site/config.js'; +import { Config } from '../models/site/config.js'; /** * Data transfer object for Site. diff --git a/packages/spacecat-shared-data-access/src/models/organization.js b/packages/spacecat-shared-data-access/src/models/organization.js index d12e5f44..9bd7ff6f 100644 --- a/packages/spacecat-shared-data-access/src/models/organization.js +++ b/packages/spacecat-shared-data-access/src/models/organization.js @@ -13,7 +13,7 @@ import { hasText, isObject } from '@adobe/spacecat-shared-utils'; import { Base } from './base.js'; -import Config from './site/config.js'; +import { Config, defaultConfig } from './site/config.js'; /** * Creates a new Organization. @@ -88,12 +88,7 @@ export const createOrganization = (data) => { const newState = { ...data }; if (!isObject(newState.config)) { - newState.config = { - slack: { - }, - alerts: { - }, - }; + newState.config = { ...defaultConfig }; } if (!hasText(newState.name)) { throw new Error('Org name must be provided'); diff --git a/packages/spacecat-shared-data-access/src/models/site.js b/packages/spacecat-shared-data-access/src/models/site.js index bd8ec601..f1b84996 100644 --- a/packages/spacecat-shared-data-access/src/models/site.js +++ b/packages/spacecat-shared-data-access/src/models/site.js @@ -14,7 +14,7 @@ import { isObject, isValidUrl } from '@adobe/spacecat-shared-utils'; import { Base } from './base.js'; import AuditConfig from './site/audit-config.js'; -import Config from './site/config.js'; +import { Config, defaultConfig } from './site/config.js'; export const DELIVERY_TYPES = { AEM_CS: 'aem_cs', @@ -183,12 +183,7 @@ export const createSite = (data) => { newState.auditConfig = AuditConfig(newState.auditConfig); if (!isObject(newState.config)) { - newState.config = { - slack: { - }, - alerts: [{ - }], - }; + newState.config = { ...defaultConfig }; } newState.config = Config(newState.config); diff --git a/packages/spacecat-shared-data-access/src/models/site/config.js b/packages/spacecat-shared-data-access/src/models/site/config.js index 660e7c7e..eebc0c6a 100644 --- a/packages/spacecat-shared-data-access/src/models/site/config.js +++ b/packages/spacecat-shared-data-access/src/models/site/config.js @@ -12,7 +12,7 @@ import Joi from 'joi'; -const configSchema = Joi.object({ +export const configSchema = Joi.object({ slack: Joi.object({ workspace: Joi.string(), channel: Joi.string(), @@ -23,7 +23,14 @@ const configSchema = Joi.object({ mentions: Joi.array().items(Joi.object({ slack: Joi.array().items(Joi.string()) })), })), }); -const Config = (data = {}) => { + +export const defaultConfig = { + slack: { + }, + alerts: [], +}; + +export const Config = (data = {}) => { const state = { slack: { channel: data?.slack?.channel, @@ -33,8 +40,8 @@ const Config = (data = {}) => { }; const self = { - alerts: () => state.alerts, - slack: () => state.slack, + alerts: state.alerts, + slack: state.slack, }; return Object.freeze(self); @@ -60,5 +67,3 @@ Config.toDynamoItem = (config) => { throw new Error(`Error validating config ${e.message}`); } }; - -export default 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 d37a570d..20fd4e09 100644 --- a/packages/spacecat-shared-data-access/test/it/db.test.js +++ b/packages/spacecat-shared-data-access/test/it/db.test.js @@ -21,6 +21,7 @@ import { isIsoDate } from '@adobe/spacecat-shared-utils'; import { v4 as uuidv4 } from 'uuid'; import { sleep } from '../unit/util.js'; import { createDataAccess } from '../../src/service/index.js'; +import { configSchema } from '../../src/models/site/config.js'; import { AUDIT_TYPE_LHS_MOBILE } from '../../src/models/audit.js'; import generateSampleData from './generateSampleData.js'; @@ -55,17 +56,7 @@ function checkOrganization(organization) { id: Joi.string(), name: Joi.string(), imsOrgId: Joi.string(), - config: Joi.object({ - slack: Joi.object({ - workspace: Joi.string(), - channel: Joi.string(), - }), - alerts: Joi.array().items(Joi.object({ - type: Joi.string(), - byOrg: Joi.boolean(), - mentions: Joi.array().items(Joi.object({ slack: Joi.string() })), - })), - }), + config: configSchema, }); schema.validate(organization); } @@ -171,7 +162,7 @@ describe('DynamoDB Integration Test', async () => { expect(newOrg.getName()).to.equal(newOrgData.name); expect(newOrg.getImsOrgId()).to.equal(newOrgData.imsOrgId); - expect(newOrg.getConfig()).to.be.an('object').that.is.empty; + expect(newOrg.getConfig()).to.be.an('object'); }); it('updates an existing org', async () => { diff --git a/packages/spacecat-shared-data-access/test/unit/models/organization.test.js b/packages/spacecat-shared-data-access/test/unit/models/organization.test.js index ca4d537f..0f55360c 100644 --- a/packages/spacecat-shared-data-access/test/unit/models/organization.test.js +++ b/packages/spacecat-shared-data-access/test/unit/models/organization.test.js @@ -37,7 +37,7 @@ describe('Organization Model Tests', () => { const config = org.getConfig(); expect(config).to.be.an('object'); - expect(config.alerts).to.be.an('object'); + expect(config.alerts).to.be.an('array'); expect(config.slack).to.be.an('object'); }); @@ -50,18 +50,16 @@ describe('Organization Model Tests', () => { alerts: [{ type: '404', byOrg: false, - mentions: [{ slack: 'slackId' }], + mentions: [{ slack: ['slackId'] }], }], }; - const org = createOrganization({ ...validData, conf }); + const org = createOrganization({ ...validData, config: conf }); const config = org.getConfig(); expect(config.slack).to.be.an('object'); - expect(config.alerts).to.be.an('object'); + expect(config.alerts).to.be.an('array'); expect(config.slack.workspace).to.equal('workspace'); expect(config.slack.channel).to.equal('channel'); - - expect(config.alerts).to.be.an('object'); }); });