Skip to content

Commit 1fdd5bb

Browse files
authored
Merge pull request #1832 from CVEProject/dr_1829
Resolves issue #1829, Allows registry org partner active/inactive dates to be edited directly.
2 parents a640c34 + f34ddc9 commit 1fdd5bb

3 files changed

Lines changed: 99 additions & 37 deletions

File tree

src/repositories/baseOrgRepository.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ const BaseOrg = require('../model/baseorg')
1212
const getConstants = require('../constants').getConstants
1313
const {
1414
handleShortNameUpdate,
15-
automateProgramDataDates,
1615
processJointApprovalAndMerge,
1716
createAuditLogEntry,
1817
handleAuthorityModelChange
@@ -970,7 +969,6 @@ class BaseOrgRepository extends BaseRepository {
970969
}
971970

972971
handleShortNameUpdate(incomingOrg, registryOrg, legacyOrg, registryObjectRaw, legacyObjectRaw)
973-
automateProgramDataDates(registryObjectRaw, registryOrg)
974972

975973
const requestingUser = requestingUserUUID ? await userRepo.findUserByUUID(requestingUserUUID, options) : null
976974
const requestingUsername = requestingUser ? requestingUser.username : null

src/repositories/baseOrgRepositoryHelpers.js

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -43,39 +43,6 @@ function handleShortNameUpdate (incomingOrg, registryOrg, legacyOrg, registryObj
4343
}
4444
}
4545

46-
/**
47-
* @function automateProgramDataDates
48-
* @description Automatically sets or removes `partner_active_date` and `partner_inactive_date` based on state transitions in the organization's program_data status.
49-
* @param {object} registryObjectRaw - The raw data payload mapped for the registry schema.
50-
* @param {object} registryOrg - The current registry organization Mongoose document.
51-
*/
52-
function automateProgramDataDates (registryObjectRaw, registryOrg) {
53-
if (registryObjectRaw.program_data && registryObjectRaw.program_data.status) {
54-
const incomingStatus = registryObjectRaw.program_data.status
55-
const currentStatus = registryOrg.program_data?.status || 'inactive'
56-
if (incomingStatus !== currentStatus) {
57-
if (incomingStatus === 'active') {
58-
registryObjectRaw.program_data.partner_active_date = new Date().toISOString().split('T')[0]
59-
if (registryObjectRaw.program_data.partner_inactive_date !== undefined) {
60-
delete registryObjectRaw.program_data.partner_inactive_date
61-
}
62-
} else if (incomingStatus === 'inactive') {
63-
registryObjectRaw.program_data.partner_inactive_date = new Date().toISOString().split('T')[0]
64-
if (registryObjectRaw.program_data.partner_active_date !== undefined) {
65-
delete registryObjectRaw.program_data.partner_active_date
66-
}
67-
}
68-
} else {
69-
if (registryOrg.program_data?.partner_active_date) {
70-
registryObjectRaw.program_data.partner_active_date = registryOrg.program_data.partner_active_date
71-
}
72-
if (registryOrg.program_data?.partner_inactive_date) {
73-
registryObjectRaw.program_data.partner_inactive_date = registryOrg.program_data.partner_inactive_date
74-
}
75-
}
76-
}
77-
}
78-
7946
/**
8047
* @function mergeAllowedFields
8148
* @description Deep merges new fields into a Mongoose document while strictly protecting explicitly defined system fields from being overwritten.
@@ -273,7 +240,6 @@ async function handleAuthorityModelChange (updatedRegistryOrg, originalRoles, op
273240
module.exports = {
274241
skipNulls,
275242
handleShortNameUpdate,
276-
automateProgramDataDates,
277243
mergeAllowedFields,
278244
manageReviewObject,
279245
processJointApprovalAndMerge,

test/integration-tests/registry-org/registryOrgCRUDTest.js

Lines changed: 99 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,13 +360,15 @@ describe('Testing /registryOrg endpoints', () => {
360360
})
361361
})
362362
it('Allows Secretariat to update program_data', async () => {
363+
const partnerActiveDate = '2024-01-15'
363364
await chai.request(app)
364365
.put('/api/registry/org/registry_org_test')
365366
.set(secretariatHeaders)
366367
.send({
367368
...createdOrg,
368369
program_data: {
369370
status: 'active',
371+
partner_active_date: partnerActiveDate,
370372
advisory_location_require_credentials: true,
371373
vulnerability_advisory_location_for_web_scraping: ['https://example.com/scraping']
372374
}
@@ -377,11 +379,107 @@ describe('Testing /registryOrg endpoints', () => {
377379
expect(res.body.updated).to.haveOwnProperty('program_data')
378380
expect(res.body.updated.program_data.status).to.equal('active')
379381
expect(res.body.updated.program_data).to.haveOwnProperty('partner_active_date')
380-
expect(res.body.updated.program_data).to.not.haveOwnProperty('partner_inactive_date')
382+
expect(res.body.updated.program_data.partner_active_date).to.equal(partnerActiveDate)
381383
expect(res.body.updated.program_data.advisory_location_require_credentials).to.be.true
382384
expect(res.body.updated.program_data.vulnerability_advisory_location_for_web_scraping).to.deep.equal(['https://example.com/scraping'])
383385
})
384386
})
387+
it('Allows Secretariat to edit partner_active_date without changing status', async () => {
388+
const partnerActiveDate = '2024-02-20'
389+
await chai.request(app)
390+
.put('/api/registry/org/registry_org_test')
391+
.set(secretariatHeaders)
392+
.send({
393+
...createdOrg,
394+
program_data: {
395+
status: 'active',
396+
partner_active_date: partnerActiveDate
397+
}
398+
})
399+
.then((res, err) => {
400+
expect(err).to.be.undefined
401+
expect(res).to.have.status(200)
402+
expect(res.body.updated).to.haveOwnProperty('program_data')
403+
expect(res.body.updated.program_data.status).to.equal('active')
404+
expect(res.body.updated.program_data.partner_active_date).to.equal(partnerActiveDate)
405+
})
406+
})
407+
it('Allows Secretariat to edit partner_inactive_date without changing status', async () => {
408+
const inactiveDateOrg = {
409+
...testRegistryOrg,
410+
short_name: 'registry_org_test_inactive_date',
411+
long_name: 'Registry Org Test Inactive Date'
412+
}
413+
const partnerInactiveDate = '2024-03-25'
414+
415+
const createRes = await chai.request(app)
416+
.post('/api/registry/org')
417+
.set(secretariatHeaders)
418+
.send(inactiveDateOrg)
419+
420+
expect(createRes).to.have.status(200)
421+
const createdInactiveDateOrg = { ...createRes.body.created }
422+
delete createdInactiveDateOrg.created
423+
delete createdInactiveDateOrg.last_updated
424+
delete createdInactiveDateOrg.users
425+
delete createdInactiveDateOrg.admins
426+
427+
await chai.request(app)
428+
.put(`/api/registry/org/${inactiveDateOrg.short_name}`)
429+
.set(secretariatHeaders)
430+
.send({
431+
...createdInactiveDateOrg,
432+
program_data: {
433+
status: 'inactive',
434+
partner_inactive_date: partnerInactiveDate
435+
}
436+
})
437+
.then((res, err) => {
438+
expect(err).to.be.undefined
439+
expect(res).to.have.status(200)
440+
expect(res.body.updated).to.haveOwnProperty('program_data')
441+
expect(res.body.updated.program_data.status).to.equal('inactive')
442+
expect(res.body.updated.program_data.partner_inactive_date).to.equal(partnerInactiveDate)
443+
})
444+
})
445+
it('Does not generate a partner_active_date when status changes without one provided', async () => {
446+
const statusOnlyOrg = {
447+
...testRegistryOrg,
448+
short_name: 'registry_org_test_status_only',
449+
long_name: 'Registry Org Test Status Only'
450+
}
451+
452+
const createRes = await chai.request(app)
453+
.post('/api/registry/org')
454+
.set(secretariatHeaders)
455+
.send(statusOnlyOrg)
456+
457+
expect(createRes).to.have.status(200)
458+
expect(createRes.body.created.program_data.status).to.equal('inactive')
459+
expect(createRes.body.created.program_data).to.not.haveOwnProperty('partner_active_date')
460+
const statusOnlyUpdateOrg = { ...createRes.body.created }
461+
delete statusOnlyUpdateOrg.created
462+
delete statusOnlyUpdateOrg.last_updated
463+
delete statusOnlyUpdateOrg.users
464+
delete statusOnlyUpdateOrg.admins
465+
466+
await chai.request(app)
467+
.put(`/api/registry/org/${statusOnlyOrg.short_name}`)
468+
.set(secretariatHeaders)
469+
.send({
470+
...statusOnlyUpdateOrg,
471+
program_data: {
472+
status: 'active'
473+
}
474+
})
475+
.then((res, err) => {
476+
expect(err).to.be.undefined
477+
expect(res).to.have.status(200)
478+
expect(res.body.updated).to.haveOwnProperty('program_data')
479+
expect(res.body.updated.program_data.status).to.equal('active')
480+
expect(res.body.updated.program_data).to.not.haveOwnProperty('partner_active_date')
481+
})
482+
})
385483
it('Updates a registry organization\'s short name and role simultaneously to verify read-after-write audit logic', async () => {
386484
// First create a temporary org
387485
const tempOrg = {

0 commit comments

Comments
 (0)