From d39d5271c5eddfb75cfd9ecd63c0b06a90959ae8 Mon Sep 17 00:00:00 2001 From: dylan Date: Thu, 2 Jan 2020 15:03:16 +0000 Subject: [PATCH 1/8] MAS-129 Daily email all fields no branding --- .../ContentControllerTests.cs | 2 +- lambda/MAS/Controllers/MailController.cs | 2 +- lambda/MAS/Models/DailyEmail.cs | 48 +++++++++++++++++++ lambda/MAS/Models/Item.cs | 4 +- lambda/MAS/Services/MailService.cs | 20 ++------ lambda/MAS/Services/S3Service.cs | 2 +- 6 files changed, 59 insertions(+), 19 deletions(-) create mode 100644 lambda/MAS/Models/DailyEmail.cs diff --git a/lambda/MAS.Tests/IntergrationTests/ContentControllerTests.cs b/lambda/MAS.Tests/IntergrationTests/ContentControllerTests.cs index 9a9bd3d2..102363b9 100644 --- a/lambda/MAS.Tests/IntergrationTests/ContentControllerTests.cs +++ b/lambda/MAS.Tests/IntergrationTests/ContentControllerTests.cs @@ -43,7 +43,7 @@ public async Task PutCMSItemSavesItemIntoS3() Key = "mas_evidence_types:Safety%20alerts", Title = "Safety alerts" }, - UKMiComment = "UKMI Comment", + Comment = "SPS Comment", ResourceLinks = "

Link 1

\r\n

Link 2

" }; diff --git a/lambda/MAS/Controllers/MailController.cs b/lambda/MAS/Controllers/MailController.cs index d9ea13a4..5521597e 100644 --- a/lambda/MAS/Controllers/MailController.cs +++ b/lambda/MAS/Controllers/MailController.cs @@ -25,7 +25,7 @@ public async Task PutMailAsync() { var items = await _contentService.GetItemsAsync(); - var body = _mailService.CreateEmailBody(items); + var body = _mailService.CreateDailyEmailBody(items); var subject = "MAS Email"; var previewText = "This MAS email was created " + DateTime.Now.ToShortDateString(); diff --git a/lambda/MAS/Models/DailyEmail.cs b/lambda/MAS/Models/DailyEmail.cs new file mode 100644 index 00000000..56513417 --- /dev/null +++ b/lambda/MAS/Models/DailyEmail.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MAS.Models +{ + public class DailyEmail + { + public List Items { get; set; } + public List> GroupedItems + { + get + { + return Items.GroupBy(x => x.EvidenceType).ToList(); + } + } + + public string HTML + { + get + { + var body = new StringBuilder(); + + foreach (var group in GroupedItems) + { + var speciality = group.Single().EvidenceType.Title; + body.Append("" + speciality + ""); + + foreach(var item in group) + { + body.Append("
"); + body.Append(item.Source.Title); + body.Append("
"); + body.Append(item.Title); + body.Append("
"); + body.Append(item.ShortSummary); + body.Append("
"); + body.Append("SPS Comment"); + } + } + + return body.ToString(); + } + } + } +} diff --git a/lambda/MAS/Models/Item.cs b/lambda/MAS/Models/Item.cs index a0d21231..a3ac21fe 100644 --- a/lambda/MAS/Models/Item.cs +++ b/lambda/MAS/Models/Item.cs @@ -7,6 +7,8 @@ public class Item { [JsonProperty("_id"), Required, JsonRequired] public string Id { get; set; } + [JsonProperty("slug")] + public string Slug { get; set; } [Required, JsonRequired] public string Title { get; set; } [Required, JsonRequired] @@ -14,7 +16,7 @@ public class Item [Required, JsonRequired] public EvidenceType EvidenceType { get; set; } public string ShortSummary { get; set; } - public string UKMiComment { get; set; } + public string Comment { get; set; } public string ResourceLinks { get; set; } } } diff --git a/lambda/MAS/Services/MailService.cs b/lambda/MAS/Services/MailService.cs index e495acf0..680c2332 100644 --- a/lambda/MAS/Services/MailService.cs +++ b/lambda/MAS/Services/MailService.cs @@ -9,13 +9,14 @@ using System.Collections.Generic; using System.Text; using System.Threading.Tasks; +using System.Linq; namespace MAS.Services { public interface IMailService { Task CreateAndSendCampaignAsync(string subject, string previewText, string body); - string CreateEmailBody(IEnumerable item); + string CreateDailyEmailBody(IEnumerable item); } public class MailService: IMailService @@ -74,21 +75,10 @@ public async Task CreateAndSendCampaignAsync(string subject, string prev } - public string CreateEmailBody(IEnumerable items) + public string CreateDailyEmailBody(IEnumerable items) { - var body = new StringBuilder(); - - foreach (var item in items) - { - body.Append(item.Source.Title); - body.Append("
"); - body.Append(item.Title); - body.Append("
"); - body.Append(item.ShortSummary); - body.Append("


"); - } - - return body.ToString(); + var vm = new DailyEmail() { Items = items.ToList() }; + return vm.HTML; } } } diff --git a/lambda/MAS/Services/S3Service.cs b/lambda/MAS/Services/S3Service.cs index 6459eeb3..110314f7 100644 --- a/lambda/MAS/Services/S3Service.cs +++ b/lambda/MAS/Services/S3Service.cs @@ -67,7 +67,7 @@ private string CreateContentBody(Item item) contentBody.Append(Environment.NewLine); contentBody.Append("UKMI Comment: "); - contentBody.Append(item.UKMiComment); + contentBody.Append(item.Comment); contentBody.Append(Environment.NewLine); if (item.ResourceLinks != null) From fa92be8b65f0d6f2ff5f4a336e0946db50cef822 Mon Sep 17 00:00:00 2001 From: dylan Date: Thu, 2 Jan 2020 15:06:08 +0000 Subject: [PATCH 2/8] MAS-129 Fix test --- ...ontentControllerTests.PutCMSItemSavesItemIntoS3.approved.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambda/MAS.Tests/IntergrationTests/ContentControllerTests.PutCMSItemSavesItemIntoS3.approved.txt b/lambda/MAS.Tests/IntergrationTests/ContentControllerTests.PutCMSItemSavesItemIntoS3.approved.txt index 09046c0a..d9851094 100644 --- a/lambda/MAS.Tests/IntergrationTests/ContentControllerTests.PutCMSItemSavesItemIntoS3.approved.txt +++ b/lambda/MAS.Tests/IntergrationTests/ContentControllerTests.PutCMSItemSavesItemIntoS3.approved.txt @@ -2,6 +2,6 @@ Title: Some title Short Summary: Wonder drug Source: The Journal of Medicine Evidence Type: Safety alerts -UKMI Comment: UKMI Comment +UKMI Comment: SPS Comment Resource Links:

Link 1

Link 2

\ No newline at end of file From 9d7d7d607ed839a09b2dc872b7e4a2d4337d2f32 Mon Sep 17 00:00:00 2001 From: dylan Date: Thu, 2 Jan 2020 15:09:56 +0000 Subject: [PATCH 3/8] MAS-129 Change variable name --- lambda/MAS/Services/MailService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lambda/MAS/Services/MailService.cs b/lambda/MAS/Services/MailService.cs index 680c2332..3ae0b1c1 100644 --- a/lambda/MAS/Services/MailService.cs +++ b/lambda/MAS/Services/MailService.cs @@ -77,8 +77,8 @@ public async Task CreateAndSendCampaignAsync(string subject, string prev public string CreateDailyEmailBody(IEnumerable items) { - var vm = new DailyEmail() { Items = items.ToList() }; - return vm.HTML; + var dailyEmail = new DailyEmail() { Items = items.ToList() }; + return dailyEmail.HTML; } } } From 794ce4fa27ae227346fb82dba367295e7e03a621 Mon Sep 17 00:00:00 2001 From: dylan Date: Fri, 3 Jan 2020 12:46:39 +0000 Subject: [PATCH 4/8] MAS-129 Add speciality to Lambda --- cms/models/Item.js | 1 + cms/routes/api/items.js | 2 + lambda/MAS.Tests/Feeds/multiple-items.json | 52 ++++++++++++++++++++-- lambda/MAS/Models/Item.cs | 3 ++ lambda/MAS/Models/Speciality.cs | 14 ++++++ 5 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 lambda/MAS/Models/Speciality.cs diff --git a/cms/models/Item.js b/cms/models/Item.js index ed8a44e8..ba9d9521 100644 --- a/cms/models/Item.js +++ b/cms/models/Item.js @@ -153,6 +153,7 @@ Item.schema.post("save", async function(doc, next) { item = await keystone.list("Item").model.findById(doc._id) .populate("source") .populate("evidenceType") + .populate("speciality") .exec(); } catch(err) { diff --git a/cms/routes/api/items.js b/cms/routes/api/items.js index a6a3536a..989ce2e9 100644 --- a/cms/routes/api/items.js +++ b/cms/routes/api/items.js @@ -7,6 +7,7 @@ exports.single = function(req, res) { .findById(req.params.itemId) .populate("source") .populate("evidenceType") + .populate("speciality") .exec(function(err, item) { if (err) return res.err(err); @@ -25,6 +26,7 @@ exports.list = function(req, res) { .find() .populate("source") .populate("evidenceType") + .populate("speciality") .exec(function(err, items) { if (err) return res.json({ err: err }); diff --git a/lambda/MAS.Tests/Feeds/multiple-items.json b/lambda/MAS.Tests/Feeds/multiple-items.json index 7a9de604..b3c79e84 100644 --- a/lambda/MAS.Tests/Feeds/multiple-items.json +++ b/lambda/MAS.Tests/Feeds/multiple-items.json @@ -16,7 +16,18 @@ "publicationDate": "2019-11-25T13:48:36.000Z", "createdDate": "2019-10-22T15:05:05.927Z", "speciality": [ - "5daf1a5c8a34d485cb05b5ba" + { + "_id": "5e0e4331200a585f718e1ee5", + "key": "be1c2e2f-745e-4a82-b5aa-d4cef4d31a1b", + "title": "Anaesthesia and pain", + "__v": 0 + }, + { + _id: "5e0e4331200a58dead8e1ee8", + key: "53fc67a4-46d8-4171-9447-7fcf216c8749", + title: "Complementary and alternative therapies", + __v: 0 + } ], "evidenceType": { "_id": "5df7abf383138898ee1f67ef", @@ -44,7 +55,18 @@ "publicationDate": "2019-11-23T13:48:36.000Z", "createdDate": "2019-10-23T10:38:43.000Z", "speciality": [ - "5daf1a5c8a34d478fd05b5d4" + { + "_id": "5e0e4331200a585f718e1ee5", + "key": "be1c2e2f-745e-4a82-b5aa-d4cef4d31a1b", + "title": "Anaesthesia and pain", + "__v": 0 + }, + { + _id: "5e0e4331200a58dead8e1ee8", + key: "53fc67a4-46d8-4171-9447-7fcf216c8749", + title: "Complementary and alternative therapies", + __v: 0 + } ], "evidenceType": { "_id": "5df7abf383138898ee1f67ef", @@ -72,7 +94,18 @@ "publicationDate": "2019-10-23T00:00:00.000Z", "createdDate": "2019-10-23T10:56:40.000Z", "speciality": [ - "5daf1a5c8a34d4d6e505b5b9" + { + "_id": "5e0e4331200a585f718e1ee5", + "key": "be1c2e2f-745e-4a82-b5aa-d4cef4d31a1b", + "title": "Anaesthesia and pain", + "__v": 0 + }, + { + _id: "5e0e4331200a58dead8e1ee8", + key: "53fc67a4-46d8-4171-9447-7fcf216c8749", + title: "Complementary and alternative therapies", + __v: 0 + } ], "evidenceType": { "_id": "5df7abf383138898ee1f67ef", @@ -100,7 +133,18 @@ "publicationDate": "2019-10-28T00:00:00.000Z", "createdDate": "2019-10-28T11:07:11.000Z", "speciality": [ - "5daf1a5c8a34d485cb05b5ba" + { + "_id": "5e0e4331200a585f718e1ee5", + "key": "be1c2e2f-745e-4a82-b5aa-d4cef4d31a1b", + "title": "Anaesthesia and pain", + "__v": 0 + }, + { + _id: "5e0e4331200a58dead8e1ee8", + key: "53fc67a4-46d8-4171-9447-7fcf216c8749", + title: "Complementary and alternative therapies", + __v: 0 + } ], "evidenceType": { "_id": "5df7abf383138898ee1f67ef", diff --git a/lambda/MAS/Models/Item.cs b/lambda/MAS/Models/Item.cs index a3ac21fe..3a938465 100644 --- a/lambda/MAS/Models/Item.cs +++ b/lambda/MAS/Models/Item.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace MAS.Models @@ -15,6 +16,8 @@ public class Item public Source Source { get; set; } [Required, JsonRequired] public EvidenceType EvidenceType { get; set; } + [JsonProperty("speciality")] + public List Speciality { get; set; } public string ShortSummary { get; set; } public string Comment { get; set; } public string ResourceLinks { get; set; } diff --git a/lambda/MAS/Models/Speciality.cs b/lambda/MAS/Models/Speciality.cs new file mode 100644 index 00000000..37b04f15 --- /dev/null +++ b/lambda/MAS/Models/Speciality.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace MAS.Models +{ + public class Speciality + { + public string Title { get; set; } + + public string Key { get; set; } + } +} From 756da19bdc0cf7b936b20153e81d4ca0b7337b74 Mon Sep 17 00:00:00 2001 From: dylan Date: Fri, 3 Jan 2020 12:47:48 +0000 Subject: [PATCH 5/8] MAS-129 Add speciality field to MAD --- lambda/MAS/Models/DailyEmail.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lambda/MAS/Models/DailyEmail.cs b/lambda/MAS/Models/DailyEmail.cs index 56513417..8f37163a 100644 --- a/lambda/MAS/Models/DailyEmail.cs +++ b/lambda/MAS/Models/DailyEmail.cs @@ -9,7 +9,8 @@ namespace MAS.Models public class DailyEmail { public List Items { get; set; } - public List> GroupedItems + + public List> GroupedItems { get { @@ -17,6 +18,7 @@ public List> GroupedItems } } + public string HTML { get @@ -25,20 +27,27 @@ public string HTML foreach (var group in GroupedItems) { - var speciality = group.Single().EvidenceType.Title; - body.Append("" + speciality + ""); + var evidenceType = group.Single().EvidenceType.Title; + + body.Append("
"); + body.Append("" + evidenceType + ""); foreach(var item in group) { + body.Append("
"); + body.Append(item.Title); body.Append("
"); body.Append(item.Source.Title); body.Append("
"); - body.Append(item.Title); + body.Append(String.Join(" | ", item.Speciality.Select(x => x.Title))); body.Append("
"); body.Append(item.ShortSummary); body.Append("
"); body.Append("SPS Comment"); + body.Append("
"); } + + body.Append("
"); } return body.ToString(); From 6adbe1983dedac7b6a3dc8f5a6c42ae5d7210c1d Mon Sep 17 00:00:00 2001 From: dylan Date: Fri, 3 Jan 2020 13:33:29 +0000 Subject: [PATCH 6/8] MAS-129 DailyEmail refactor and tests --- lambda/MAS.Tests/UnitTests/DailyEmailTests.cs | 138 ++++++++++++++++++ lambda/MAS/Models/DailyEmail.cs | 6 +- 2 files changed, 141 insertions(+), 3 deletions(-) create mode 100644 lambda/MAS.Tests/UnitTests/DailyEmailTests.cs diff --git a/lambda/MAS.Tests/UnitTests/DailyEmailTests.cs b/lambda/MAS.Tests/UnitTests/DailyEmailTests.cs new file mode 100644 index 00000000..fbb1d11d --- /dev/null +++ b/lambda/MAS.Tests/UnitTests/DailyEmailTests.cs @@ -0,0 +1,138 @@ +using MAS.Models; +using MAS.Tests.Infrastructure; +using Shouldly; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Xunit; + +namespace MAS.Tests.UnitTests +{ + public class DailyEmailTests : TestBase + { + Item exampleItem = new Item() + { + Id = "123", + Title = "Some Title", + Slug = "abc", + ShortSummary = "Some short summary", + ResourceLinks = "", + Comment = "", + Speciality = new List + { + new Speciality() + { + Key = "1a", + Title = "Some speciality", + + } + }, + EvidenceType = new EvidenceType() + { + Key = "1b", + Title = "Some evidence type" + }, + Source = new Source() + { + Id = "1c", + Title = "Some source" + } + }; + Item exampleItem2 = new Item() + { + Id = "123", + Title = "Some Title", + Slug = "abc", + ShortSummary = "Some short summary", + ResourceLinks = "", + Comment = "", + Speciality = new List + { + new Speciality() + { + Key = "1a", + Title = "Some speciality 2", + + } + }, + EvidenceType = new EvidenceType() + { + Key = "1c", + Title = "Some evidence type 2" + }, + Source = new Source() + { + Id = "1c", + Title = "Some source" + } + }; + + [Fact] + public void CanCreateSingleItemEmail() + { + var email = new DailyEmail() + { + Items = new List() + { + exampleItem + } + }; + + var expectedHtml = "
Some evidence type
Some Title
Some source
Some speciality
Some short summary
SPS Comment
"; + email.HTML.ShouldBe(expectedHtml); + + } + + [Fact] + public void CanCreateEmailWithTwoItemsSharingEvidenceType() + { + var email = new DailyEmail() + { + Items = new List() + { + exampleItem, + exampleItem + } + }; + + var expectedHtml = "
Some evidence type
Some Title
Some source
Some speciality
Some short summary
SPS Comment
Some Title
Some source
Some speciality
Some short summary
SPS Comment
"; + email.HTML.ShouldBe(expectedHtml); + + } + + [Fact] + public void CanCreateEmailWithTwoItemsDifferentEvidenceType() + { + var email = new DailyEmail() + { + Items = new List() + { + exampleItem, + exampleItem2 + } + }; + + var expectedHtml = "
Some evidence type
Some Title
Some source
Some speciality
Some short summary
SPS Comment
Some evidence type 2
Some Title
Some source
Some speciality 2
Some short summary
SPS Comment
"; + email.HTML.ShouldBe(expectedHtml); + + } + + [Fact] + public void ItemsWithManySpecialitiesRenderCorrectly() + { + exampleItem.Speciality.Add(new Speciality() { Key = "abcd", Title = "Another speciality" }); + var email = new DailyEmail() + { + Items = new List() + { + exampleItem + } + }; + + var expectedHtml = "
Some evidence type
Some Title
Some source
Some speciality | Another speciality
Some short summary
SPS Comment
"; + email.HTML.ShouldBe(expectedHtml); + + } + } +} diff --git a/lambda/MAS/Models/DailyEmail.cs b/lambda/MAS/Models/DailyEmail.cs index 8f37163a..1eb8d1eb 100644 --- a/lambda/MAS/Models/DailyEmail.cs +++ b/lambda/MAS/Models/DailyEmail.cs @@ -10,11 +10,11 @@ public class DailyEmail { public List Items { get; set; } - public List> GroupedItems + public List> GroupedItems { get { - return Items.GroupBy(x => x.EvidenceType).ToList(); + return Items.GroupBy(x => x.EvidenceType.Title).ToList(); } } @@ -27,7 +27,7 @@ public string HTML foreach (var group in GroupedItems) { - var evidenceType = group.Single().EvidenceType.Title; + var evidenceType = group.Key; body.Append("
"); body.Append("" + evidenceType + ""); From f47eadcd22e1a0e4d720134fc13ce70940758820 Mon Sep 17 00:00:00 2001 From: dylan Date: Fri, 3 Jan 2020 17:26:20 +0000 Subject: [PATCH 7/8] MAS-121 Add merge tags to daily email --- lambda/MAS/Models/DailyEmail.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lambda/MAS/Models/DailyEmail.cs b/lambda/MAS/Models/DailyEmail.cs index 1eb8d1eb..5f7d56a5 100644 --- a/lambda/MAS/Models/DailyEmail.cs +++ b/lambda/MAS/Models/DailyEmail.cs @@ -27,13 +27,18 @@ public string HTML foreach (var group in GroupedItems) { - var evidenceType = group.Key; - + string specInEvidenceType = String.Join(',', group.SelectMany(x => x.Speciality.Select(y => y.Title))); + body.Append("*|INTERESTED:Daily specialities of interest:" + specInEvidenceType + "|*"); body.Append("
"); + + var evidenceType = group.Key; body.Append("" + evidenceType + ""); - foreach(var item in group) + foreach (var item in group) { + string itemSpecList = String.Join(',', item.Speciality.Select(x => x.Title)); + body.Append("*|INTERESTED:Daily specialities of interest:" + itemSpecList + "|*"); + body.Append("
"); body.Append(item.Title); body.Append("
"); @@ -45,9 +50,12 @@ public string HTML body.Append("
"); body.Append("SPS Comment"); body.Append("
"); + + body.Append("*|END:INTERESTED|*"); } body.Append("
"); + body.Append("*|END:INTERESTED|*"); } return body.ToString(); From 2f939bed19917e81acd9274c38762653fd044373 Mon Sep 17 00:00:00 2001 From: dylan Date: Mon, 13 Jan 2020 16:40:58 +0000 Subject: [PATCH 8/8] MAS-121 Add broader title to evidence type in item api Use JSONLD file to look up the key for the evidence type when we're exporting items via the single API endpoint --- cms/evidence-types.jsonld | 371 +++++++++++++++++++++++++++++++++++++ cms/models/EvidenceType.js | 36 +++- cms/routes/api/items.js | 24 ++- 3 files changed, 427 insertions(+), 4 deletions(-) create mode 100644 cms/evidence-types.jsonld diff --git a/cms/evidence-types.jsonld b/cms/evidence-types.jsonld new file mode 100644 index 00000000..9c9320b2 --- /dev/null +++ b/cms/evidence-types.jsonld @@ -0,0 +1,371 @@ +{ + "@graph" : [ { + "@id" : "mas_evidence_types:Audit%20reports", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Other%20evidence", + "prefLabel" : { + "@language" : "en", + "@value" : "Audit reports" + } + }, { + "@id" : "mas_evidence_types:CONCEPT-Evidence_type", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "prefLabel" : { + "@language" : "en", + "@value" : "Evidence type" + } + }, { + "@id" : "mas_evidence_types:CONCEPT-Guidance_and_advice", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:CONCEPT-Evidence_type", + "prefLabel" : { + "@language" : "en", + "@value" : "Guidance and advice" + } + }, { + "@id" : "mas_evidence_types:Care%20pathways", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Other%20evidence", + "prefLabel" : { + "@language" : "en", + "@value" : "Care pathways" + } + }, { + "@id" : "mas_evidence_types:Commissioning%20guides", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:CONCEPT-Guidance_and_advice", + "prefLabel" : { + "@language" : "en", + "@value" : "Commissioning guides" + } + }, { + "@id" : "mas_evidence_types:Drug%20best%20practice%20guidance", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:CONCEPT-Guidance_and_advice", + "prefLabel" : { + "@language" : "en", + "@value" : "Drug best practice guidance" + } + }, { + "@id" : "mas_evidence_types:Drug%20costs", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Other%20evidence", + "prefLabel" : { + "@language" : "en", + "@value" : "Drug costs" + } + }, { + "@id" : "mas_evidence_types:Drug%20horizon%20scanning", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Other%20evidence", + "prefLabel" : { + "@language" : "en", + "@value" : "Drug horizon scanning" + } + }, { + "@id" : "mas_evidence_types:Drug%20prescribing", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:CONCEPT-Guidance_and_advice", + "prefLabel" : { + "@language" : "en", + "@value" : "Drug prescribing" + } + }, { + "@id" : "mas_evidence_types:Drug%20regulatory%20and%20marketing", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Other%20evidence", + "prefLabel" : { + "@language" : "en", + "@value" : "Drug regulatory and marketing" + } + }, { + "@id" : "mas_evidence_types:Drug%2Fmedicines%20management", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Other%20evidence", + "prefLabel" : { + "@language" : "en", + "@value" : "Drug/medicines management" + } + }, { + "@id" : "mas_evidence_types:Effective%20practice%20examples", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Other%20evidence", + "prefLabel" : { + "@language" : "en", + "@value" : "Effective practice examples" + } + }, { + "@id" : "mas_evidence_types:Evidence%20summaries", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Evidence%20summary", + "prefLabel" : { + "@language" : "en", + "@value" : "Evidence summaries" + } + }, { + "@id" : "mas_evidence_types:Evidence%20summary", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:CONCEPT-Evidence_type", + "prefLabel" : { + "@language" : "en", + "@value" : "Evidence summary" + } + }, { + "@id" : "mas_evidence_types:Evidence%20updates", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Evidence%20summary", + "prefLabel" : { + "@language" : "en", + "@value" : "Evidence updates" + } + }, { + "@id" : "mas_evidence_types:Evidence-based%20management%20reports", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Other%20evidence", + "prefLabel" : { + "@language" : "en", + "@value" : "Evidence-based management reports" + } + }, { + "@id" : "mas_evidence_types:Eyes%20on%20evidence%20commentaries", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Evidence%20summary", + "prefLabel" : { + "@language" : "en", + "@value" : "Eyes on evidence commentaries" + } + }, { + "@id" : "mas_evidence_types:Guidance", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:CONCEPT-Guidance_and_advice", + "prefLabel" : { + "@language" : "en", + "@value" : "Guidance" + } + }, { + "@id" : "mas_evidence_types:Health%20technology%20assessments", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Systematic%20review", + "prefLabel" : { + "@language" : "en", + "@value" : "Health technology assessments" + } + }, { + "@id" : "mas_evidence_types:Implementation%20support%20tools", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Other%20evidence", + "prefLabel" : { + "@language" : "en", + "@value" : "Implementation support tools" + } + }, { + "@id" : "mas_evidence_types:Learning%20materials", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Other%20evidence", + "prefLabel" : { + "@language" : "en", + "@value" : "Learning materials" + } + }, { + "@id" : "mas_evidence_types:MAS_evidence_type", + "@type" : "http://www.w3.org/2004/02/skos/core#ConceptScheme", + "hasTopConcept" : "mas_evidence_types:CONCEPT-Evidence_type", + "prefLabel" : { + "@language" : "en", + "@value" : "MAS evidence type" + } + }, { + "@id" : "mas_evidence_types:Media%20and%20commentaries", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:CONCEPT-Evidence_type", + "prefLabel" : { + "@language" : "en", + "@value" : "Media and commentaries" + } + }, { + "@id" : "mas_evidence_types:Medicines%20Q%20%26%20A", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Evidence%20summary", + "prefLabel" : { + "@language" : "en", + "@value" : "Medicines Q & A" + } + }, { + "@id" : "mas_evidence_types:Medicines%20evidence%20commentaries", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Evidence%20summary", + "prefLabel" : { + "@language" : "en", + "@value" : "Medicines evidence commentaries" + } + }, { + "@id" : "mas_evidence_types:Ongoing%20or%20unpublished%20research", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Primary%20research", + "prefLabel" : { + "@language" : "en", + "@value" : "Ongoing or unpublished research" + } + }, { + "@id" : "mas_evidence_types:Other%20economic%20evaluations", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Other%20evidence", + "prefLabel" : { + "@language" : "en", + "@value" : "Other economic evaluations" + } + }, { + "@id" : "mas_evidence_types:Other%20evidence", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:CONCEPT-Evidence_type", + "prefLabel" : { + "@language" : "en", + "@value" : "Other evidence" + } + }, { + "@id" : "mas_evidence_types:Other%20primary%20research", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Primary%20research", + "prefLabel" : { + "@language" : "en", + "@value" : "Other primary research" + } + }, { + "@id" : "mas_evidence_types:Patient%20decision%20aids", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Other%20evidence", + "prefLabel" : { + "@language" : "en", + "@value" : "Patient decision aids" + } + }, { + "@id" : "mas_evidence_types:Patient%20information", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Other%20evidence", + "prefLabel" : { + "@language" : "en", + "@value" : "Patient information" + } + }, { + "@id" : "mas_evidence_types:Policy", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:CONCEPT-Evidence_type", + "prefLabel" : { + "@language" : "en", + "@value" : "Policy" + } + }, { + "@id" : "mas_evidence_types:Population%20intelligence", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Other%20evidence", + "prefLabel" : { + "@language" : "en", + "@value" : "Population intelligence" + } + }, { + "@id" : "mas_evidence_types:Population%20needs%20assessment", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Other%20evidence", + "prefLabel" : { + "@language" : "en", + "@value" : "Population needs assessment" + } + }, { + "@id" : "mas_evidence_types:Primary%20research", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:CONCEPT-Evidence_type", + "prefLabel" : { + "@language" : "en", + "@value" : "Primary research" + } + }, { + "@id" : "mas_evidence_types:Quality%20measures", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Other%20evidence", + "prefLabel" : { + "@language" : "en", + "@value" : "Quality measures" + } + }, { + "@id" : "mas_evidence_types:Randomised%20controlled%20trials", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Primary%20research", + "prefLabel" : { + "@language" : "en", + "@value" : "Randomised controlled trials" + } + }, { + "@id" : "mas_evidence_types:Safety%20alerts", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:CONCEPT-Evidence_type", + "prefLabel" : { + "@language" : "en", + "@value" : "Safety alerts" + } + }, { + "@id" : "mas_evidence_types:Systematic%20review", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:CONCEPT-Evidence_type", + "prefLabel" : { + "@language" : "en", + "@value" : "Systematic review" + } + }, { + "@id" : "mas_evidence_types:Systematic%20reviews", + "@type" : "http://www.w3.org/2004/02/skos/core#Concept", + "broader" : "mas_evidence_types:Systematic%20review", + "prefLabel" : { + "@language" : "en", + "@value" : "Systematic reviews" + } + }, { + "@id" : "urn:x-evn-master:mas_evidence_types", + "@type" : "owl:Ontology", + "status" : "metadata:UnderDevelopmentStatus", + "defaultNamespace" : "http://nice.org.uk/MAS/evidence_type/", + "newInstancesUserCannotModifyURI" : "0", + "comment" : "A list of evidence types includes in the Medicines Awareness Service", + "label" : "MAS evidence types", + "imports" : [ "http://topbraid.org/skos.shapes", "http://topbraid.org/imported" ] + } ], + "@context" : { + "prefLabel" : { + "@id" : "http://www.w3.org/2004/02/skos/core#prefLabel" + }, + "broader" : { + "@id" : "http://www.w3.org/2004/02/skos/core#broader", + "@type" : "@id" + }, + "imports" : { + "@id" : "http://www.w3.org/2002/07/owl#imports", + "@type" : "@id" + }, + "status" : { + "@id" : "http://topbraid.org/metadata#status", + "@type" : "@id" + }, + "label" : { + "@id" : "http://www.w3.org/2000/01/rdf-schema#label" + }, + "newInstancesUserCannotModifyURI" : { + "@id" : "http://topbraid.org/teamwork#newInstancesUserCannotModifyURI", + "@type" : "http://www.w3.org/2001/XMLSchema#boolean" + }, + "comment" : { + "@id" : "http://www.w3.org/2000/01/rdf-schema#comment" + }, + "defaultNamespace" : { + "@id" : "http://topbraid.org/swa#defaultNamespace" + }, + "hasTopConcept" : { + "@id" : "http://www.w3.org/2004/02/skos/core#hasTopConcept", + "@type" : "@id" + }, + "metadata" : "http://topbraid.org/metadata#", + "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "owl" : "http://www.w3.org/2002/07/owl#", + "teamwork" : "http://topbraid.org/teamwork#", + "mas_evidence_types" : "http://nice.org.uk/MAS/evidence_type/", + "rdfs" : "http://www.w3.org/2000/01/rdf-schema#" + } +} diff --git a/cms/models/EvidenceType.js b/cms/models/EvidenceType.js index 0a2e1697..80db1abf 100644 --- a/cms/models/EvidenceType.js +++ b/cms/models/EvidenceType.js @@ -1,4 +1,22 @@ -const keystone = require("keystone"); +const keystone = require("keystone"), + fs = require("fs"), + path = require("path"); + +// Load the JSONLD for evidence types on application load +// so we don't have to hit the file system again and again +let evidenceTypesJsonLd; +fs.readFile( + path.resolve(__dirname, "../evidence-types.jsonld"), + "UTF-8", + function(err, contents) { + if (err) { + loggger.error(err); + throw err; + } + + evidenceTypesJsonLd = JSON.parse(contents); + } +); const Types = keystone.Field.Types; @@ -12,7 +30,7 @@ const EvidenceType = new keystone.List("EvidenceType", { EvidenceType.add({ title: { type: String, required: true }, key: { type: String, required: true }, - oldEPiServerId: { label: "Old EPiServer ID", type: Types.Number, required: false } + oldEPiServerId: { label: "Old EPiServer ID", type: Types.Number, required: false }, }); EvidenceType.relationship({ @@ -21,6 +39,20 @@ EvidenceType.relationship({ refPath: "evidenceType" }); +EvidenceType.schema.virtual("broaderTitle").get(function() { + const key = this.key, + evidenceTypes = evidenceTypesJsonLd["@graph"], + concept = evidenceTypes.find(e => e["@id"] === key); + + // Assume only 2 levels + const broaderConcept = evidenceTypes.find(e => e["@id"] === concept.broader); + + if(broaderConcept.broader) + return broaderConcept.prefLabel["@value"]; + else + return concept.prefLabel["@value"]; +}); + EvidenceType.defaultColumns = "title, oldEPiServerId, key"; EvidenceType.register(); diff --git a/cms/routes/api/items.js b/cms/routes/api/items.js index 989ce2e9..2c3619d8 100644 --- a/cms/routes/api/items.js +++ b/cms/routes/api/items.js @@ -1,4 +1,5 @@ -var keystone = require("keystone"); +var keystone = require("keystone"), + _ = require("lodash"); var Items = keystone.list("Item"); @@ -13,7 +14,26 @@ exports.single = function(req, res) { if (!item) return res.notfound("Item not found"); - res.json(item); + const obj = _.pick(item, [ + "_id", + "updatedAt", + "createdAt", + "slug", + "shortSummary", + "source._id", + "source.title", + "url", + "title", + "comment", + "publicationDate", + "resourceLinks", + "speciality", + "evidenceType._id", + "evidenceType.title", + "evidenceType.key", + "evidenceType.broaderTitle"]); + + return res.json(obj); }); };