Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion openapi/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,11 @@
"pattern": "^urn:uuid:"
}
}
},
"templateVersion": {
"title": "semver",
"type": "string",
"pattern": "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$"
}
}
}
Expand All @@ -153,7 +158,8 @@
},
"external": {
"id": "urn:uuid:f81d4fae-7dec-11d0-a765-123456781234"
}
},
"templateVersion": "1.0.0"
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@
"$ref": "../../../../models/definitions/external-id.json"
}
}
},
"templateVersion": {
"$ref": "../../../../models/definitions/semver.json"
}
}
}
Expand Down
3 changes: 2 additions & 1 deletion openapi/src/openapi-src.json
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@
},
"external": {
"id": "urn:uuid:f81d4fae-7dec-11d0-a765-123456781234"
}
},
"templateVersion": "1.0.0"
}
}
}
Expand Down
24 changes: 23 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@
"pino-std-serializers": "^6.2.2",
"q-expressions": "github:CriminalInjuriesCompensationAuthority/q-expressions",
"q-router": "github:CriminalInjuriesCompensationAuthority/q-router#v3.1.1",
"q-templates-application": "github:CriminalInjuriesCompensationAuthority/q-templates-application#v12.3.6",
"q-templates-application": "github:CriminalInjuriesCompensationAuthority/q-templates-application",
"q-templates-application-v12": "github:CriminalInjuriesCompensationAuthority/q-templates-application#v12.0.0",
"q-templates-application-v11": "github:CriminalInjuriesCompensationAuthority/q-templates-application#v11.0.0",
"semver": "^7.5.4",
"swagger-ui-express": "^4.6.3",
"uuid": "^3.3.2",
Expand Down
21 changes: 9 additions & 12 deletions questionnaire/questionnaire-service.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const VError = require('verror');
const router = require('q-router');
const uuidv4 = require('uuid/v4');
const ajvFormatsMobileUk = require('ajv-formats-mobile-uk');
const templates = require('./templates');
const getTemplate = require('./templates');
const questionnaireResource = require('./resources/questionnaire-resource');
const createQuestionnaireHelper = require('./questionnaire/questionnaire');
const isQuestionnaireCompatible = require('./utils/isQuestionnaireVersionCompatible');
Expand Down Expand Up @@ -62,18 +62,15 @@ function createQuestionnaireService({
return false;
}

async function createQuestionnaire(templateName, ownerData, originData, externalData) {
if (!(templateName in templates)) {
throw new VError(
{
name: 'ResourceNotFound'
},
`Template "${templateName}" does not exist`
);
}

async function createQuestionnaire(
templateName,
ownerData,
originData,
externalData,
templateVersion
) {
const uuidV4 = uuidv4();
const questionnaire = templates[templateName](uuidV4);
const questionnaire = getTemplate(templateName, templateVersion)(uuidV4);

if (!ownerData) {
throw new VError(
Expand Down
5 changes: 3 additions & 2 deletions questionnaire/routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ router.route('/').post(permissions('create:questionnaires'), async (req, res, ne
throw err;
}

const {templateName, owner, origin, external} = req.body.data.attributes;
const {templateName, owner, origin, external, templateVersion} = req.body.data.attributes;

const questionnaireService = createQuestionnaireService({
logger: req.log,
Expand All @@ -39,7 +39,8 @@ router.route('/').post(permissions('create:questionnaires'), async (req, res, ne
templateName,
owner,
origin,
external
external,
templateVersion
);

res.status(201).json(response);
Expand Down
48 changes: 38 additions & 10 deletions questionnaire/templates.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,44 @@
/* eslint-disable global-require */

'use strict';

const applicationTemplate = require('q-templates-application');
const VError = require('verror');

const registry = {
'sexual-assault': {
latest: require('q-templates-application'),
'12.0.0': require('q-templates-application-v12'),
'11.0.0': require('q-templates-application-v11')
}
};

const applicationTemplateAsJson = JSON.stringify(applicationTemplate);
function getTemplate(templateName, version = 'latest') {
const versions = registry[templateName];
if (!versions) {
throw new VError(
{
name: 'ResourceNotFound'
},
`Template "${templateName}" does not exist`
);
}

function getApplicationTemplateCopy() {
return JSON.parse(applicationTemplateAsJson);
}
const template = versions[version];
if (!template) {
throw new VError(
{
name: 'ResourceNotFound'
},
`Version "${version}" not found for template "${templateName}"`
);
}

module.exports = {
'sexual-assault': id => ({
const applicationTemplateAsJson = JSON.stringify(template);

return id => ({
id,
...getApplicationTemplateCopy()
})
};
...JSON.parse(applicationTemplateAsJson) // deep copy
});
}

module.exports = getTemplate;
73 changes: 73 additions & 0 deletions questionnaire/templates.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/* eslint-disable global-require */

'use strict';

const fakeUuid = 'some-id';
let getTemplates;

beforeEach(() => {
jest.resetModules();

jest.doMock('q-templates-application', () => ({
version: '12.3.3'
}));

jest.doMock('q-templates-application-v12', () => ({
version: '12.0.0'
}));

getTemplates = require('./templates');
});

describe('Templates', () => {
it('Should select a template', () => {
const templateName = 'sexual-assault';
const templateVersion = 'latest';
const questionnaire = getTemplates(templateName, templateVersion)(fakeUuid);

expect(questionnaire).toMatchObject({
id: 'some-id',
version: '12.3.3'
});
});

it('Should select a template with the desired version', () => {
const templateName = 'sexual-assault';
const templateVersion = '12.0.0';
const questionnaire = getTemplates(templateName, templateVersion)(fakeUuid);

expect(questionnaire).toMatchObject({
id: 'some-id',
version: '12.0.0'
});
});

it('Should select the latest template if no version is specified', () => {
const templateName = 'sexual-assault';
const templateVersion = undefined;
const questionnaire = getTemplates(templateName, templateVersion)(fakeUuid);

expect(questionnaire).toMatchObject({
id: 'some-id',
version: '12.3.3'
});
});

it('Should error if the templateName is not available', () => {
const templateName = 'not-a-template';
const templateVersion = undefined;

expect(() => {
getTemplates(templateName, templateVersion)(fakeUuid);
}).toThrow('Template "not-a-template" does not exist');
});

it('Should error if the templateVersion is not supported', () => {
const templateName = 'sexual-assault';
const templateVersion = '20.0.0';

expect(() => {
getTemplates(templateName, templateVersion)(fakeUuid);
}).toThrow('Version "20.0.0" not found for template "sexual-assault"');
});
});