From 3228595c73c07bec9419bec5b8457fe773c090c6 Mon Sep 17 00:00:00 2001 From: fabrizzio-dotCMS Date: Tue, 30 Jan 2024 17:10:30 -0600 Subject: [PATCH 01/11] #25736 the postman is set to create the CT taking into account the announcementDate as publish date --- .../Announcements.postman_collection.json | 156 +++++++++++++----- 1 file changed, 112 insertions(+), 44 deletions(-) diff --git a/dotCMS/src/curl-test/Announcements.postman_collection.json b/dotCMS/src/curl-test/Announcements.postman_collection.json index 5bfbd87a86b8..2cee5a23f735 100644 --- a/dotCMS/src/curl-test/Announcements.postman_collection.json +++ b/dotCMS/src/curl-test/Announcements.postman_collection.json @@ -62,7 +62,7 @@ ], "body": { "mode": "raw", - "raw": "{\n\t\"clazz\": \"com.dotcms.contenttype.model.type.SimpleContentType\",\n\t\"description\": \"DotCMS Announcements\",\n\t\"defaultType\": false,\n\t\"system\": false,\n\t\"folder\": \"SYSTEM_FOLDER\",\n\t\"name\": \"Announcement\",\n\t\"variable\": \"Announcement\",\n\t\"host\": \"SYSTEM_HOST\",\n\t\"fixed\": false,\n \"icon\": \"Announcement\",\n \"sortOrder\": 0,\n\t\"fields\": [\n\t\t{\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.TextField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"TEXT\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": true,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 1,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"title\",\n\t\t\t\"variable\": \"title\",\n\t\t\t\"fixed\": true\n\t\t},\n {\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.SelectField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"TEXT\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": true,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 2,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"type\",\n\t\t\t\"variable\": \"type1\",\n \"values\": \"Announcement \\n Release \\n Comment\",\n\t\t\t\"fixed\": true\n\t\t},\n {\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.TextField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"TEXT\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": true,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 3,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"Url\",\n\t\t\t\"variable\": \"url\",\n\t\t\t\"fixed\": true\n\t\t},\n {\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.DateTimeField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"DATE\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": false,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 4,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"announcementDate\",\n\t\t\t\"variable\": \"announcementDate\",\n\t\t\t\"fixed\": true\n\t\t},\n {\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.TextField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"TEXT\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": true,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 5,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"description\",\n\t\t\t\"variable\": \"description\",\n\t\t\t\"fixed\": true\n\t\t}\n\t],\n \"workflow\":[\"d61a59e1-a49c-46f2-a929-db2b4bfa88b2\"]\n}" + "raw": "{\n\t\"clazz\": \"com.dotcms.contenttype.model.type.SimpleContentType\",\n\t\"description\": \"DotCMS Announcements\",\n\t\"defaultType\": false,\n\t\"system\": false,\n\t\"folder\": \"SYSTEM_FOLDER\",\n\t\"name\": \"Announcement\",\n\t\"variable\": \"Announcement\",\n\t\"host\": \"SYSTEM_HOST\",\n\t\"fixed\": false,\n \"icon\": \"Announcement\",\n \"sortOrder\": 0,\n\t\"fields\": [\n\t\t{\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.TextField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"TEXT\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": true,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 1,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"title\",\n\t\t\t\"variable\": \"title\",\n\t\t\t\"fixed\": true\n\t\t},\n {\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.SelectField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"TEXT\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": true,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 2,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"type\",\n\t\t\t\"variable\": \"type1\",\n \"values\": \"Announcement \\n Release \\n Comment\",\n\t\t\t\"fixed\": true\n\t\t},\n {\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.TextField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"TEXT\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": true,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 3,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"Url\",\n\t\t\t\"variable\": \"url\",\n\t\t\t\"fixed\": true\n\t\t},\n {\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.DateTimeField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"DATE\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": false,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 4,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"announcementDate\",\n\t\t\t\"variable\": \"announcementDate\",\n\t\t\t\"fixed\": true\n\t\t},\n {\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.TextField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"TEXT\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": true,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 5,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"description\",\n\t\t\t\"variable\": \"description\",\n\t\t\t\"fixed\": true\n\t\t}\n\t],\n \"publishDateVar\": \"announcementDate\",\n \"workflow\":[\"d61a59e1-a49c-46f2-a929-db2b4bfa88b2\"]\n}" }, "url": { "raw": "{{serverURL}}/api/v1/contenttype", @@ -93,6 +93,31 @@ ], "type": "text/javascript" } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "function formatDate(date) {", + " const year = date.getFullYear();", + " const month = String(date.getMonth() + 1).padStart(2, '0'); // Months are zero-based", + " const day = String(date.getDate()).padStart(2, '0');", + " const hours = String(date.getHours()).padStart(2, '0');", + " const minutes = String(date.getMinutes()).padStart(2, '0');", + " const seconds = String(date.getSeconds()).padStart(2, '0');", + "", + " return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;", + "}", + "//Set the content to be published wihtin 40 seconds ", + "const announcementDate = new Date();", + "//announcementDate.setSeconds(announcementDate.getSeconds() + 10);", + "const formattedAnnouncementDate = formatDate(announcementDate);", + "", + "console.log(formattedAnnouncementDate);", + "pm.collectionVariables.set(\"announcementDate\", announcementDate);" + ], + "type": "text/javascript" + } } ], "request": { @@ -124,7 +149,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"contentlets\": [\n {\n \"contentType\": \"{{contentTypeId}}\", \n \"title\": \"Test Announcement 1\",\n \"type1\":\"Announcement\",\n \"announcementDate\":\"2024-01-08\",\n \"url\":\"https://www.dotcms.com\",\n \"description\": \"Test Announcement 1\"\n },{\n \"contentType\": \"{{contentTypeId}}\", \n \"title\": \"Test Announcement 2\",\n \"type1\":\"Announcement\",\n \"announcementDate\":\"2024-01-08\",\n \"url\":\"https://www.dotcms.com\",\n \"description\": \"Test Announcement 2\"\n },{\n \"contentType\": \"{{contentTypeId}}\", \n \"title\": \"Test Announcement 3\",\n \"type1\":\"Announcement\",\n \"announcementDate\":\"2024-01-08\",\n \"url\":\"https://www.dotcms.com\",\n \"description\": \"Test Announcement 3\"\n },{\n \"contentType\": \"{{contentTypeId}}\", \n \"title\": \"Test Announcement 4\",\n \"type1\":\"Announcement\",\n \"announcementDate\":\"2024-01-08\",\n \"url\":\"https://www.dotcms.com\",\n \"description\": \"Test Announcement 4\"\n }\n ] \n}", + "raw": "{\n \"contentlets\": [\n {\n \"contentType\": \"{{contentTypeId}}\", \n \"title\": \"Test Announcement 1\",\n \"type1\":\"Announcement\",\n \"announcementDate\":\"{{announcementDate}}\",\n \"url\":\"https://www.dotcms.com\",\n \"description\": \"Test Announcement 1\"\n },{\n \"contentType\": \"{{contentTypeId}}\", \n \"title\": \"Test Announcement 2\",\n \"type1\":\"Announcement\",\n \"announcementDate\":\"{{announcementDate}}\",\n \"url\":\"https://www.dotcms.com\",\n \"description\": \"Test Announcement 2\"\n },{\n \"contentType\": \"{{contentTypeId}}\", \n \"title\": \"Test Announcement 3\",\n \"type1\":\"Announcement\",\n \"announcementDate\":\"{{announcementDate}}\",\n \"url\":\"https://www.dotcms.com\",\n \"description\": \"Test Announcement 3\"\n },{\n \"contentType\": \"{{contentTypeId}}\", \n \"title\": \"Test Announcement 4\",\n \"type1\":\"Announcement\",\n \"announcementDate\":\"{{announcementDate}}\",\n \"url\":\"https://www.dotcms.com\",\n \"description\": \"Test Announcement 4\"\n }\n ] \n}", "options": { "raw": { "language": "json" @@ -162,60 +187,99 @@ " pm.response.to.have.status(200); ", "});", "", - "/*pm.test(\"Validate Announcements\", function() { ", + "pm.test(\"Validate Announcements\", function() { ", " pm.expect(jsonData.entity.length).to.eql(4); ", " ", " let a4 = jsonData.entity.find(item => item.title === 'Test Announcement 4');", - " pm.expect(a4,'Announcement #4 should be present').not.undefined;", - " pm.expect(a4.announcementDate,'Announcement #4 should have a date').not.undefined;", - " pm.expect(a4.announcementDateAsISO8601,'Announcement #4 should have a announcementDateAsISO8601').not.undefined;", - " pm.expect(a4.identifier,'Announcement #4 should have an identifier').not.undefined;", - " pm.expect(a4.inode,'Announcement #4 should have an inode').not.undefined;", - " pm.expect(a4.languageCode,'Announcement #4 should have a langCode').eql('en-us');", - " pm.expect(a4.languageId,'Announcement #4 should have a languageId').eql(1);", - " pm.expect(a4.type,'Announcement #4 should have a type').eql('Announcement');", - " pm.expect(a4.url,'Announcement #4 should have a url').eql('https://www.dotcms.com');", - " pm.expect(a4.modDate,'Announcement #4 should have a modDate').not.undefined;", + " pm.expect(a4,'Annopuncement #4 should be present').not.undefined;", + " pm.expect(a4.announcementDate,'Annopuncement #4 should have a date').not.undefined;", + " pm.expect(a4.announcementDateAsISO8601,'Annopuncement #4 should have a announcementDateAsISO8601').not.undefined;", + " pm.expect(a4.identifier,'Annopuncement #4 should have an identifier').not.undefined;", + " pm.expect(a4.inode,'Annopuncement #4 should have an inode').not.undefined;", + " pm.expect(a4.languageCode,'Annopuncement #4 should have a langCode').eql('en-us');", + " pm.expect(a4.languageId,'Annopuncement #4 should have a languageId').eql(1);", + " pm.expect(a4.type,'Annopuncement #4 should have a type').eql('Announcement');", + " pm.expect(a4.url,'Annopuncement #4 should have a url').eql('https://www.dotcms.com');", + " pm.expect(a4.modDate,'Annopuncement #4 should have a modDate').not.undefined;", "", "", " let a3 = jsonData.entity.find(item => item.title === 'Test Announcement 3');", - " pm.expect(a3,'Announcement #3 should be present').not.undefined;", - " pm.expect(a3.announcementDate,'Announcement #3 should have a date').not.undefined;", - " pm.expect(a3.announcementDateAsISO8601,'Announcement #3 should have a announcementDateAsISO8601').not.undefined;", - " pm.expect(a3.identifier,'Announcement #3 should have an identifier').not.undefined;", - " pm.expect(a3.inode,'Announcement #3 should have an inode').not.undefined;", - " pm.expect(a3.languageCode,'Announcement #3 should have a langCode').eql('en-us');", - " pm.expect(a3.languageId,'Announcement #3 should have a languageId').eql(1);", - " pm.expect(a3.type,'Announcement #3 should have a type').eql('Announcement');", - " pm.expect(a3.url,'Announcement #3 should have a url').eql('https://www.dotcms.com');", - " pm.expect(a3.modDate,'Announcement #3 should have a modDate').not.undefined;", + " pm.expect(a3,'Annopuncement #3 should be present').not.undefined;", + " pm.expect(a3.announcementDate,'Annopuncement #3 should have a date').not.undefined;", + " pm.expect(a3.announcementDateAsISO8601,'Annopuncement #3 should have a announcementDateAsISO8601').not.undefined;", + " pm.expect(a3.identifier,'Annopuncement #3 should have an identifier').not.undefined;", + " pm.expect(a3.inode,'Annopuncement #3 should have an inode').not.undefined;", + " pm.expect(a3.languageCode,'Annopuncement #3 should have a langCode').eql('en-us');", + " pm.expect(a3.languageId,'Annopuncement #3 should have a languageId').eql(1);", + " pm.expect(a3.type,'Annopuncement #3 should have a type').eql('Announcement');", + " pm.expect(a3.url,'Annopuncement #3 should have a url').eql('https://www.dotcms.com');", + " pm.expect(a3.modDate,'Annopuncement #3 should have a modDate').not.undefined;", "", " let a2 = jsonData.entity.find(item => item.title === 'Test Announcement 2');", - " pm.expect(a2,'Announcement #2 should be present').not.undefined;", - " pm.expect(a2.announcementDate,'Announcement #2 should have a date').not.undefined;", - " pm.expect(a2.announcementDateAsISO8601,'Announcement #2 should have a announcementDateAsISO8601').not.undefined;", - " pm.expect(a2.identifier,'Announcement #2 should have an identifier').not.undefined;", - " pm.expect(a2.inode,'Announcement #2 should have an inode').not.undefined;", - " pm.expect(a2.languageCode,'Announcement #2 should have a langCode').eql('en-us');", - " pm.expect(a2.languageId,'Announcement #2 should have a languageId').eql(1);", - " pm.expect(a2.type,'Announcement #2 should have a type').eql('Announcement');", - " pm.expect(a2.url,'Announcement #2 should have a url').eql('https://www.dotcms.com');", - " pm.expect(a2.modDate,'Announcement #2 should have a modDate').not.undefined;", + " pm.expect(a2,'Annopuncement #2 should be present').not.undefined;", + " pm.expect(a2.announcementDate,'Annopuncement #2 should have a date').not.undefined;", + " pm.expect(a2.announcementDateAsISO8601,'Annopuncement #2 should have a announcementDateAsISO8601').not.undefined;", + " pm.expect(a2.identifier,'Annopuncement #2 should have an identifier').not.undefined;", + " pm.expect(a2.inode,'Annopuncement #2 should have an inode').not.undefined;", + " pm.expect(a2.languageCode,'Annopuncement #2 should have a langCode').eql('en-us');", + " pm.expect(a2.languageId,'Annopuncement #2 should have a languageId').eql(1);", + " pm.expect(a2.type,'Annopuncement #2 should have a type').eql('Announcement');", + " pm.expect(a2.url,'Annopuncement #2 should have a url').eql('https://www.dotcms.com');", + " pm.expect(a2.modDate,'Annopuncement #2 should have a modDate').not.undefined;", " ", " let a1 = jsonData.entity.find(item => item.title === 'Test Announcement 1');", - " pm.expect(a1,'Announcement #1 should be present').not.undefined;", - " pm.expect(a1.announcementDate,'Announcement #1 should have a date').not.undefined;", - " pm.expect(a1.announcementDateAsISO8601,'Announcement #1 should have a announcementDateAsISO8601').not.undefined;", - " pm.expect(a1.identifier,'Announcement #1 should have an identifier').not.undefined;", - " pm.expect(a1.inode,'Announcement #1 should have an inode').not.undefined;", - " pm.expect(a1.languageCode,'Announcement #1 should have a langCode').eql('en-us');", - " pm.expect(a1.languageId,'Announcement #1 should have a languageId').eql(1);", - " pm.expect(a1.type,'Announcement #1 should have a type').eql('Announcement');", - " pm.expect(a1.url,'Announcement #1 should have a url').eql('https://www.dotcms.com');", - " pm.expect(a1.modDate,'Announcement #1 should have a modDate').not.undefined;", + " pm.expect(a1,'Annopuncement #1 should be present').not.undefined;", + " pm.expect(a1.announcementDate,'Annopuncement #1 should have a date').not.undefined;", + " pm.expect(a1.announcementDateAsISO8601,'Annopuncement #1 should have a announcementDateAsISO8601').not.undefined;", + " pm.expect(a1.identifier,'Annopuncement #1 should have an identifier').not.undefined;", + " pm.expect(a1.inode,'Annopuncement #1 should have an inode').not.undefined;", + " pm.expect(a1.languageCode,'Annopuncement #1 should have a langCode').eql('en-us');", + " pm.expect(a1.languageId,'Annopuncement #1 should have a languageId').eql(1);", + " pm.expect(a1.type,'Annopuncement #1 should have a type').eql('Announcement');", + " pm.expect(a1.url,'Annopuncement #1 should have a url').eql('https://www.dotcms.com');", + " pm.expect(a1.modDate,'Annopuncement #1 should have a modDate').not.undefined;", "", " ", - "});*/" + "});" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "function doWait(){", + " // This should give enough time for the content to be published", + " setTimeout(function(){", + " console.log(\"Sleeping before request.\");", + " }, 20000);", + "}", + "", + "", + "", + "function sendRequest(){", + " const host = pm.environment.get(\"serverURL\");", + " pm.sendRequest({", + " url: host + '/api/v1/announcements',", + " method: 'GET',", + " header: {", + " 'content-type': 'application/json',", + " 'authorization': request.headers[\"authorization\"]", + " },", + "", + " }, function (err, res) { ", + " var data = res.json();", + " if(data == undefined || !Array.isArray(data.entity) || data.entity.length == 0 ){", + " doWait(); ", + " } ", + " console.log(data); ", + " }); ", + "}", + "", + "sendRequest();", + "", + "" ], "type": "text/javascript" } @@ -295,6 +359,10 @@ { "key": "contentTypeVar", "value": "" + }, + { + "key": "announcementDate", + "value": "" } ] } \ No newline at end of file From 9466a861a5c2fa73619a0048b05fbd57500b4c95 Mon Sep 17 00:00:00 2001 From: fabrizzio-dotCMS Date: Tue, 30 Jan 2024 17:45:30 -0600 Subject: [PATCH 02/11] #25736 megre latest from master --- .../Announcements.postman_collection.json | 82 +++++++++---------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/dotCMS/src/curl-test/Announcements.postman_collection.json b/dotCMS/src/curl-test/Announcements.postman_collection.json index 2cee5a23f735..6435908c51c5 100644 --- a/dotCMS/src/curl-test/Announcements.postman_collection.json +++ b/dotCMS/src/curl-test/Announcements.postman_collection.json @@ -188,56 +188,56 @@ "});", "", "pm.test(\"Validate Announcements\", function() { ", - " pm.expect(jsonData.entity.length).to.eql(4); ", + " pm.expect(jsonData.entity.length).to.be.at.least(4); ", " ", " let a4 = jsonData.entity.find(item => item.title === 'Test Announcement 4');", - " pm.expect(a4,'Annopuncement #4 should be present').not.undefined;", - " pm.expect(a4.announcementDate,'Annopuncement #4 should have a date').not.undefined;", - " pm.expect(a4.announcementDateAsISO8601,'Annopuncement #4 should have a announcementDateAsISO8601').not.undefined;", - " pm.expect(a4.identifier,'Annopuncement #4 should have an identifier').not.undefined;", - " pm.expect(a4.inode,'Annopuncement #4 should have an inode').not.undefined;", - " pm.expect(a4.languageCode,'Annopuncement #4 should have a langCode').eql('en-us');", - " pm.expect(a4.languageId,'Annopuncement #4 should have a languageId').eql(1);", - " pm.expect(a4.type,'Annopuncement #4 should have a type').eql('Announcement');", - " pm.expect(a4.url,'Annopuncement #4 should have a url').eql('https://www.dotcms.com');", - " pm.expect(a4.modDate,'Annopuncement #4 should have a modDate').not.undefined;", + " pm.expect(a4,'Announcement #4 should be present').not.undefined;", + " pm.expect(a4.announcementDate,'Announcement #4 should have a date').not.undefined;", + " pm.expect(a4.announcementDateAsISO8601,'Announcement #4 should have a announcementDateAsISO8601').not.undefined;", + " pm.expect(a4.identifier,'Announcement #4 should have an identifier').not.undefined;", + " pm.expect(a4.inode,'Announcement #4 should have an inode').not.undefined;", + " pm.expect(a4.languageCode,'Announcement #4 should have a langCode').eql('en-us');", + " pm.expect(a4.languageId,'Announcement #4 should have a languageId').eql(1);", + " pm.expect(a4.type,'Announcement #4 should have a type').eql('Announcement');", + " pm.expect(a4.url,'Announcement #4 should have a url').eql('https://www.dotcms.com');", + " pm.expect(a4.modDate,'Announcement #4 should have a modDate').not.undefined;", "", "", " let a3 = jsonData.entity.find(item => item.title === 'Test Announcement 3');", - " pm.expect(a3,'Annopuncement #3 should be present').not.undefined;", - " pm.expect(a3.announcementDate,'Annopuncement #3 should have a date').not.undefined;", - " pm.expect(a3.announcementDateAsISO8601,'Annopuncement #3 should have a announcementDateAsISO8601').not.undefined;", - " pm.expect(a3.identifier,'Annopuncement #3 should have an identifier').not.undefined;", - " pm.expect(a3.inode,'Annopuncement #3 should have an inode').not.undefined;", - " pm.expect(a3.languageCode,'Annopuncement #3 should have a langCode').eql('en-us');", - " pm.expect(a3.languageId,'Annopuncement #3 should have a languageId').eql(1);", - " pm.expect(a3.type,'Annopuncement #3 should have a type').eql('Announcement');", - " pm.expect(a3.url,'Annopuncement #3 should have a url').eql('https://www.dotcms.com');", - " pm.expect(a3.modDate,'Annopuncement #3 should have a modDate').not.undefined;", + " pm.expect(a3,'Announcement #3 should be present').not.undefined;", + " pm.expect(a3.announcementDate,'Announcement #3 should have a date').not.undefined;", + " pm.expect(a3.announcementDateAsISO8601,'Announcement #3 should have a announcementDateAsISO8601').not.undefined;", + " pm.expect(a3.identifier,'Announcement #3 should have an identifier').not.undefined;", + " pm.expect(a3.inode,'Announcement #3 should have an inode').not.undefined;", + " pm.expect(a3.languageCode,'Announcement #3 should have a langCode').eql('en-us');", + " pm.expect(a3.languageId,'Announcement #3 should have a languageId').eql(1);", + " pm.expect(a3.type,'Announcement #3 should have a type').eql('Announcement');", + " pm.expect(a3.url,'Announcement #3 should have a url').eql('https://www.dotcms.com');", + " pm.expect(a3.modDate,'Announcement #3 should have a modDate').not.undefined;", "", " let a2 = jsonData.entity.find(item => item.title === 'Test Announcement 2');", - " pm.expect(a2,'Annopuncement #2 should be present').not.undefined;", - " pm.expect(a2.announcementDate,'Annopuncement #2 should have a date').not.undefined;", - " pm.expect(a2.announcementDateAsISO8601,'Annopuncement #2 should have a announcementDateAsISO8601').not.undefined;", - " pm.expect(a2.identifier,'Annopuncement #2 should have an identifier').not.undefined;", - " pm.expect(a2.inode,'Annopuncement #2 should have an inode').not.undefined;", - " pm.expect(a2.languageCode,'Annopuncement #2 should have a langCode').eql('en-us');", - " pm.expect(a2.languageId,'Annopuncement #2 should have a languageId').eql(1);", - " pm.expect(a2.type,'Annopuncement #2 should have a type').eql('Announcement');", - " pm.expect(a2.url,'Annopuncement #2 should have a url').eql('https://www.dotcms.com');", - " pm.expect(a2.modDate,'Annopuncement #2 should have a modDate').not.undefined;", + " pm.expect(a2,'Announcement #2 should be present').not.undefined;", + " pm.expect(a2.announcementDate,'Announcement #2 should have a date').not.undefined;", + " pm.expect(a2.announcementDateAsISO8601,'Announcement #2 should have a announcementDateAsISO8601').not.undefined;", + " pm.expect(a2.identifier,'Announcement #2 should have an identifier').not.undefined;", + " pm.expect(a2.inode,'Announcement #2 should have an inode').not.undefined;", + " pm.expect(a2.languageCode,'Announcement #2 should have a langCode').eql('en-us');", + " pm.expect(a2.languageId,'Announcement #2 should have a languageId').eql(1);", + " pm.expect(a2.type,'Announcement #2 should have a type').eql('Announcement');", + " pm.expect(a2.url,'Announcement #2 should have a url').eql('https://www.dotcms.com');", + " pm.expect(a2.modDate,'Announcement #2 should have a modDate').not.undefined;", " ", " let a1 = jsonData.entity.find(item => item.title === 'Test Announcement 1');", - " pm.expect(a1,'Annopuncement #1 should be present').not.undefined;", - " pm.expect(a1.announcementDate,'Annopuncement #1 should have a date').not.undefined;", - " pm.expect(a1.announcementDateAsISO8601,'Annopuncement #1 should have a announcementDateAsISO8601').not.undefined;", - " pm.expect(a1.identifier,'Annopuncement #1 should have an identifier').not.undefined;", - " pm.expect(a1.inode,'Annopuncement #1 should have an inode').not.undefined;", - " pm.expect(a1.languageCode,'Annopuncement #1 should have a langCode').eql('en-us');", - " pm.expect(a1.languageId,'Annopuncement #1 should have a languageId').eql(1);", - " pm.expect(a1.type,'Annopuncement #1 should have a type').eql('Announcement');", - " pm.expect(a1.url,'Annopuncement #1 should have a url').eql('https://www.dotcms.com');", - " pm.expect(a1.modDate,'Annopuncement #1 should have a modDate').not.undefined;", + " pm.expect(a1,'Announcement #1 should be present').not.undefined;", + " pm.expect(a1.announcementDate,'Announcement #1 should have a date').not.undefined;", + " pm.expect(a1.announcementDateAsISO8601,'Announcement #1 should have a announcementDateAsISO8601').not.undefined;", + " pm.expect(a1.identifier,'Announcement #1 should have an identifier').not.undefined;", + " pm.expect(a1.inode,'Announcement #1 should have an inode').not.undefined;", + " pm.expect(a1.languageCode,'Announcement #1 should have a langCode').eql('en-us');", + " pm.expect(a1.languageId,'Announcement #1 should have a languageId').eql(1);", + " pm.expect(a1.type,'Announcement #1 should have a type').eql('Announcement');", + " pm.expect(a1.url,'Announcement #1 should have a url').eql('https://www.dotcms.com');", + " pm.expect(a1.modDate,'Announcement #1 should have a modDate').not.undefined;", "", " ", "});" From f2860afa8f40bcf9dbc733a9ff2d0854b3cd138d Mon Sep 17 00:00:00 2001 From: fabrizzio-dotCMS Date: Tue, 30 Jan 2024 21:36:47 -0600 Subject: [PATCH 03/11] #25736 allowing time for publishing to take effect --- .../Announcements.postman_collection.json | 54 ++++++++++++------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/dotCMS/src/curl-test/Announcements.postman_collection.json b/dotCMS/src/curl-test/Announcements.postman_collection.json index 6435908c51c5..b9866ee9872e 100644 --- a/dotCMS/src/curl-test/Announcements.postman_collection.json +++ b/dotCMS/src/curl-test/Announcements.postman_collection.json @@ -188,7 +188,7 @@ "});", "", "pm.test(\"Validate Announcements\", function() { ", - " pm.expect(jsonData.entity.length).to.be.at.least(4); ", + " pm.expect(jsonData.entity.length).to.be.at.least(4); ", " ", " let a4 = jsonData.entity.find(item => item.title === 'Test Announcement 4');", " pm.expect(a4,'Announcement #4 should be present').not.undefined;", @@ -253,31 +253,47 @@ " // This should give enough time for the content to be published", " setTimeout(function(){", " console.log(\"Sleeping before request.\");", - " }, 20000);", + " }, 24000);", "}", "", + "const MAX_CALL_COUNT = 5;", "", + "let callCount = 1;", "", - "function sendRequest(){", - " const host = pm.environment.get(\"serverURL\");", - " pm.sendRequest({", - " url: host + '/api/v1/announcements',", - " method: 'GET',", - " header: {", - " 'content-type': 'application/json',", - " 'authorization': request.headers[\"authorization\"]", - " },", + "function allowSomeTimeForPublish(){", + " console.log('allowing time for publish '+callCount);", + " if(callCount == MAX_CALL_COUNT){", + " console.log('Max have waited long enough giving it up.'); ", + " return;", + " }", + " //Lets wait a while to allow some time for publishing to take effect", + " doWait(); ", + " try{", + " const host = pm.environment.get(\"serverURL\");", + " pm.sendRequest({", + " url: host + '/api/v1/announcements',", + " method: 'GET',", + " header: {", + " 'content-type': 'application/json',", + " 'authorization': request.headers[\"authorization\"]", + " },", "", - " }, function (err, res) { ", - " var data = res.json();", - " if(data == undefined || !Array.isArray(data.entity) || data.entity.length == 0 ){", - " doWait(); ", - " } ", - " console.log(data); ", - " }); ", + " }, function (err, res) { ", + " var data = res.json();", + " if(data == undefined || !Array.isArray(data.entity) || data.entity.length == 0 ){", + " doWait(); ", + " allowSomeTimeForPublish(); ", + " } ", + " console.log(data); ", + " });", + " } finally {", + " callCount++; ", + " }", + " ", "}", "", - "sendRequest();", + "", + "allowSomeTimeForPublish();", "", "" ], From 3562c177bee1a050b585364c9b04b0b3242421ee Mon Sep 17 00:00:00 2001 From: fabrizzio-dotCMS Date: Wed, 31 Jan 2024 08:15:29 -0600 Subject: [PATCH 04/11] #25736 debugging postman failure --- .../Announcements.postman_collection.json | 34 +++++++++++++++---- .../RemoteAnnouncementsLoaderImpl.java | 4 ++- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/dotCMS/src/curl-test/Announcements.postman_collection.json b/dotCMS/src/curl-test/Announcements.postman_collection.json index b9866ee9872e..0a08de455f0e 100644 --- a/dotCMS/src/curl-test/Announcements.postman_collection.json +++ b/dotCMS/src/curl-test/Announcements.postman_collection.json @@ -13,14 +13,25 @@ "listen": "test", "script": { "exec": [ - "var jsonData = pm.response.json();", - "", - "pm.collectionVariables.set(\"contentTypeId\", jsonData.entity[0].id);", - "pm.collectionVariables.set(\"contentTypeVar\", jsonData.entity[0].variable);", "", "pm.test(\"Status code should be ok 200\", function () {", " pm.response.to.have.status(200);", - "});" + "});", + "", + "let jsonData = pm.response.json();", + "let contentTypeId = jsonData.entity[0].id;", + "let contentTypeVar = jsonData.entity[0].variable", + "", + "pm.collectionVariables.set(\"contentTypeId\", contentTypeId);", + "pm.collectionVariables.set(\"contentTypeVar\", contentTypeVar);", + "", + "pm.test(\"Variable is created\", function () {", + "", + " pm.expect(contentTypeId,'Announcement ct Id is set ').not.undefined; ", + " pm.expect(contentTypeVar,'Announcement ct Var is set ').not.undefined; ", + "", + "});", + "" ], "type": "text/javascript" } @@ -86,9 +97,18 @@ "listen": "test", "script": { "exec": [ - "var jsonData = pm.response.json();", + "const jsonData = pm.response.json();", "pm.test(\"Status code should be 200\", function() {", " pm.response.to.have.status(200);", + "});", + "", + "const contents = jsonData.entity.results;", + "", + "console.log(contents);", + "", + "pm.test(\"Announcements are created\", function() {", + " pm.expect(contents,'contents were created').not.undefined;", + " pm.expect(contents.length,'Verify contents length').to.be.at.least(4); ", "});" ], "type": "text/javascript" @@ -256,7 +276,7 @@ " }, 24000);", "}", "", - "const MAX_CALL_COUNT = 5;", + "const MAX_CALL_COUNT = 3;", "", "let callCount = 1;", "", diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java index b5803721b50c..d6af75e15200 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java @@ -60,6 +60,8 @@ public List loadAnnouncements(final Language language) { */ JsonNode loadRemoteAnnouncements(final Language language) { final String url = buildURL(language); + //Let's log the url to retrieve the announcements for debugging purposes on postman + Logger.info(AnnouncementsHelperImpl.class, String.format("loading announcements from [%s]", url)); try { final Client client = restClient(); final WebTarget webTarget = client.target(url); @@ -71,7 +73,7 @@ JsonNode loadRemoteAnnouncements(final Language language) { final JsonParser parser = factory.createParser(jsonString); return mapper.readTree(parser); } else { - Logger.debug(AnnouncementsHelperImpl.class, String.format(" failed to get announcements from [%s] with status: [%d] and entity: [%s] ", url, response.getStatus(), response.getEntity())); + Logger.info(AnnouncementsHelperImpl.class, String.format(" failed to get announcements from [%s] with status: [%d] and entity: [%s] ", url, response.getStatus(), response.getEntity())); throw new DotRuntimeException(String.format(" failed to get announcements from [%s] with status: [%d]", url, response.getStatus())); } From 55e9032d238136b85b43bb100215bcbf71fba586 Mon Sep 17 00:00:00 2001 From: fabrizzio-dotCMS Date: Wed, 31 Jan 2024 21:36:59 -0600 Subject: [PATCH 05/11] #25736 correcting announcements remote query --- .../Announcements.postman_collection.json | 12 ++--- .../v1/announcements/AnnouncementsHelper.java | 2 +- .../AnnouncementsHelperImpl.java | 54 ++++--------------- .../v1/announcements/AnnouncementsLoader.java | 3 +- .../announcements/AnnouncementsResource.java | 3 +- .../RemoteAnnouncementsLoaderImpl.java | 52 ++++-------------- .../announcements/AbstractAnnouncement.java | 4 +- .../announcements/AnnouncementsCache.java | 5 +- .../announcements/AnnouncementsCacheImpl.java | 24 ++++----- .../AnnouncementsHelperIntegrationTest.java | 29 +++++----- ...oteAnnouncementsLoaderIntegrationTest.java | 5 +- dotcms-postman/pom.xml | 2 +- 12 files changed, 58 insertions(+), 137 deletions(-) diff --git a/dotCMS/src/curl-test/Announcements.postman_collection.json b/dotCMS/src/curl-test/Announcements.postman_collection.json index 0a08de455f0e..5655f76822b1 100644 --- a/dotCMS/src/curl-test/Announcements.postman_collection.json +++ b/dotCMS/src/curl-test/Announcements.postman_collection.json @@ -215,8 +215,7 @@ " pm.expect(a4.announcementDate,'Announcement #4 should have a date').not.undefined;", " pm.expect(a4.announcementDateAsISO8601,'Announcement #4 should have a announcementDateAsISO8601').not.undefined;", " pm.expect(a4.identifier,'Announcement #4 should have an identifier').not.undefined;", - " pm.expect(a4.inode,'Announcement #4 should have an inode').not.undefined;", - " pm.expect(a4.languageCode,'Announcement #4 should have a langCode').eql('en-us');", + " pm.expect(a4.inode,'Announcement #4 should have an inode').not.undefined; ", " pm.expect(a4.languageId,'Announcement #4 should have a languageId').eql(1);", " pm.expect(a4.type,'Announcement #4 should have a type').eql('Announcement');", " pm.expect(a4.url,'Announcement #4 should have a url').eql('https://www.dotcms.com');", @@ -228,8 +227,7 @@ " pm.expect(a3.announcementDate,'Announcement #3 should have a date').not.undefined;", " pm.expect(a3.announcementDateAsISO8601,'Announcement #3 should have a announcementDateAsISO8601').not.undefined;", " pm.expect(a3.identifier,'Announcement #3 should have an identifier').not.undefined;", - " pm.expect(a3.inode,'Announcement #3 should have an inode').not.undefined;", - " pm.expect(a3.languageCode,'Announcement #3 should have a langCode').eql('en-us');", + " pm.expect(a3.inode,'Announcement #3 should have an inode').not.undefined; ", " pm.expect(a3.languageId,'Announcement #3 should have a languageId').eql(1);", " pm.expect(a3.type,'Announcement #3 should have a type').eql('Announcement');", " pm.expect(a3.url,'Announcement #3 should have a url').eql('https://www.dotcms.com');", @@ -240,8 +238,7 @@ " pm.expect(a2.announcementDate,'Announcement #2 should have a date').not.undefined;", " pm.expect(a2.announcementDateAsISO8601,'Announcement #2 should have a announcementDateAsISO8601').not.undefined;", " pm.expect(a2.identifier,'Announcement #2 should have an identifier').not.undefined;", - " pm.expect(a2.inode,'Announcement #2 should have an inode').not.undefined;", - " pm.expect(a2.languageCode,'Announcement #2 should have a langCode').eql('en-us');", + " pm.expect(a2.inode,'Announcement #2 should have an inode').not.undefined; ", " pm.expect(a2.languageId,'Announcement #2 should have a languageId').eql(1);", " pm.expect(a2.type,'Announcement #2 should have a type').eql('Announcement');", " pm.expect(a2.url,'Announcement #2 should have a url').eql('https://www.dotcms.com');", @@ -252,8 +249,7 @@ " pm.expect(a1.announcementDate,'Announcement #1 should have a date').not.undefined;", " pm.expect(a1.announcementDateAsISO8601,'Announcement #1 should have a announcementDateAsISO8601').not.undefined;", " pm.expect(a1.identifier,'Announcement #1 should have an identifier').not.undefined;", - " pm.expect(a1.inode,'Announcement #1 should have an inode').not.undefined;", - " pm.expect(a1.languageCode,'Announcement #1 should have a langCode').eql('en-us');", + " pm.expect(a1.inode,'Announcement #1 should have an inode').not.undefined; ", " pm.expect(a1.languageId,'Announcement #1 should have a languageId').eql(1);", " pm.expect(a1.type,'Announcement #1 should have a type').eql('Announcement');", " pm.expect(a1.url,'Announcement #1 should have a url').eql('https://www.dotcms.com');", diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsHelper.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsHelper.java index f5daae3ff107..4ac8c2e7ec7d 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsHelper.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsHelper.java @@ -15,7 +15,7 @@ public interface AnnouncementsHelper { Lazy.of(() -> Config.getIntProperty("ANNOUNCEMENTS_LIMIT", 5)); - List getAnnouncements(String languageIdOrCode, boolean refreshCache, + List getAnnouncements(boolean refreshCache, Integer limit, User user); } diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsHelperImpl.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsHelperImpl.java index 243ff5d8c6bb..4642bb21855d 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsHelperImpl.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsHelperImpl.java @@ -3,9 +3,6 @@ import com.dotcms.system.announcements.Announcement; import com.dotcms.system.announcements.AnnouncementsCache; import com.dotcms.system.announcements.AnnouncementsCacheImpl; -import com.dotmarketing.business.APILocator; -import com.dotmarketing.portlets.languagesmanager.business.LanguageAPI; -import com.dotmarketing.portlets.languagesmanager.model.Language; import com.dotmarketing.util.Logger; import com.liferay.portal.model.User; import java.util.List; @@ -15,75 +12,46 @@ */ public class AnnouncementsHelperImpl implements AnnouncementsHelper{ - private final LanguageAPI languageAPI; - private final AnnouncementsCache announcementsCache; private final AnnouncementsLoader loader; - public AnnouncementsHelperImpl() { - this(APILocator.getLanguageAPI(), new RemoteAnnouncementsLoaderImpl(), new AnnouncementsCacheImpl()); + this(new RemoteAnnouncementsLoaderImpl(), new AnnouncementsCacheImpl()); } /** * Constructor - * @param languageAPI LanguageAPI * @param announcementsCache AnnouncementsCache */ - public AnnouncementsHelperImpl(LanguageAPI languageAPI, AnnouncementsLoader loader, AnnouncementsCache announcementsCache) { - this.languageAPI = languageAPI; + public AnnouncementsHelperImpl(AnnouncementsLoader loader, AnnouncementsCache announcementsCache) { this.announcementsCache = announcementsCache; this.loader = loader; } - - /** - * Get the language by id or code, if not found fallback to default language - * @param languageIdOrCode String - * @return Language - */ - Language getLanguage(final String languageIdOrCode) { - Language language; - try { - final String[] split = languageIdOrCode.split("-"); - if(split.length > 1) { - language = languageAPI.getLanguage(split[0], split[1]); - } else { - language = languageAPI.getLanguage(languageIdOrCode); - } - } catch (Exception e) { - Logger.debug(AnnouncementsHelperImpl.class, String.format(" failed to get lang [%s] with message: [%s] fallback to default language", languageIdOrCode, e.getMessage())); - language = languageAPI.getDefaultLanguage(); - } - return language; - } - - /** * Get the announcements from the cache or from the remote server - * @param languageIdOrCode String + * * @param refreshCache boolean - * @param limit Integer - * @param user User + * @param limit Integer + * @param user User * @return List */ @Override - public List getAnnouncements( final String languageIdOrCode, final boolean refreshCache, final Integer limit, final User user) { + public List getAnnouncements(final boolean refreshCache, final Integer limit, final User user) { - Logger.debug(AnnouncementsHelperImpl.class,String.format("Getting announcements for language: %s refreshCache: %s limit: %d, user: %s ", languageIdOrCode, refreshCache, limit, user.getUserId())); - final Language language = getLanguage(languageIdOrCode); + Logger.debug(AnnouncementsHelperImpl.class,String.format("Getting announcements refreshCache: %s limit: %d, user: %s ", refreshCache, limit, user.getUserId())); final int limitValue = getLimit(limit); if(!refreshCache) { - Logger.debug(this, "Getting announcements from cache for language: " + language.getId() + " limit: " + limitValue); - final List announcements = announcementsCache.get(language); + Logger.debug(this, "Getting announcements from cache for limit: " + limitValue); + final List announcements = announcementsCache.get(); if (announcements != null && !announcements.isEmpty()) { return getSubList(limitValue, announcements); } } - final List announcements = loader.loadAnnouncements(language); + final List announcements = loader.loadAnnouncements(); if(!announcements.isEmpty()){ - announcementsCache.put(language, announcements); + announcementsCache.put(announcements); return getSubList(limitValue, announcements); } return List.of(); diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsLoader.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsLoader.java index 5676ab1ef000..ef4af87898c0 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsLoader.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsLoader.java @@ -11,9 +11,8 @@ public interface AnnouncementsLoader { /** * Load the announcements for the given language - * @param language Language * @return List */ - List loadAnnouncements(Language language); + List loadAnnouncements(); } diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsResource.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsResource.java index b18fb3ca63d4..8ba0018877d8 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsResource.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsResource.java @@ -62,7 +62,6 @@ public AnnouncementsResource() { @Produces({MediaType.APPLICATION_JSON, "application/javascript"}) public final ResponseEntityView> announcements(@Context final HttpServletRequest request, @Context final HttpServletResponse response, - @QueryParam("langIdOrCode") final String langIdOrCode, @QueryParam("refreshCache") final boolean refreshCache, @QueryParam("limit") final int limit ) { @@ -74,7 +73,7 @@ public final ResponseEntityView> announcements(@Context final .rejectWhenNoUser(true) .init(); final User user = initData.getUser(); - final List announcements = helper.getAnnouncements(langIdOrCode, refreshCache , limit, user); + final List announcements = helper.getAnnouncements(refreshCache , limit, user); return new ResponseEntityView<>(announcements); // 200 } diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java index d6af75e15200..dff3d8bb297b 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java @@ -31,35 +31,28 @@ */ public class RemoteAnnouncementsLoaderImpl implements AnnouncementsLoader{ - //The CT varN/ame used to retrieve the Announcements - static final LazyDOT_ANNOUNCEMENT_CT = - Lazy.of(()-> Config.getStringProperty("DOT_ANNOUNCEMENT_CT", "Announcement")); - //This is the url to the dotCMS instance set to provide and feed all consumers with announcements static final Lazy ANNOUNCEMENTS_BASE_URL = Lazy.of(() -> Config.getStringProperty("ANNOUNCEMENTS_BASE_URL", "https://www.dotcms.com")); - //The query pattern to retrieve the Announcements - static final String ANNOUNCEMENTS_QUERY_PATTERN = "%s/api/content/render/false/query/+contentType:%s +languageId:%d +deleted:false +live:true/orderBy/%s.announcementDate desc"; + static final String ANNOUNCEMENTS_QUERY_PATTERN = "/api/content/render/false/query/+contentType:Announcement%20+(conhost:8a7d5e23-da1e-420a-b4f0-471e7da8ea2d%20conhost:SYSTEM_HOST)%20+languageId:1%20+deleted:false%20+working:true%20+variant:default/orderby/Announcement.announcementDate%20desc"; /** * Load the announcements from the remote dotCMS instance - * @param language Language * @return List */ @Override - public List loadAnnouncements(final Language language) { - final JsonNode jsonNode = loadRemoteAnnouncements(language); + public List loadAnnouncements() { + final JsonNode jsonNode = loadRemoteAnnouncements(); return toAnnouncements(jsonNode); } /** * Load the announcements from the remote dotCMS instance - * @param language Language * @return JsonNode */ - JsonNode loadRemoteAnnouncements(final Language language) { - final String url = buildURL(language); + JsonNode loadRemoteAnnouncements() { + final String url = buildURL(); //Let's log the url to retrieve the announcements for debugging purposes on postman Logger.info(AnnouncementsHelperImpl.class, String.format("loading announcements from [%s]", url)); try { @@ -73,7 +66,7 @@ JsonNode loadRemoteAnnouncements(final Language language) { final JsonParser parser = factory.createParser(jsonString); return mapper.readTree(parser); } else { - Logger.info(AnnouncementsHelperImpl.class, String.format(" failed to get announcements from [%s] with status: [%d] and entity: [%s] ", url, response.getStatus(), response.getEntity())); + Logger.debug(AnnouncementsHelperImpl.class, String.format(" failed to get announcements from [%s] with status: [%d] and entity: [%s] ", url, response.getStatus(), response.getEntity())); throw new DotRuntimeException(String.format(" failed to get announcements from [%s] with status: [%d]", url, response.getStatus())); } @@ -85,12 +78,10 @@ JsonNode loadRemoteAnnouncements(final Language language) { /** * Build the url to retrieve the announcements - * @param language Language * @return String */ - String buildURL(Language language) { - final String raw = String.format(ANNOUNCEMENTS_QUERY_PATTERN, ANNOUNCEMENTS_BASE_URL.get(), - DOT_ANNOUNCEMENT_CT.get(), language.getId(), DOT_ANNOUNCEMENT_CT.get()); + String buildURL() { + final String raw = ANNOUNCEMENTS_BASE_URL.get() + ANNOUNCEMENTS_QUERY_PATTERN; //clean up double slashes in the url return raw.replaceAll("(? */ - List toAnnouncements(final JsonNode root) { + List toAnnouncements(final JsonNode root) { final ImmutableList.Builder announcements = ImmutableList.builder(); final JsonNode nodes = root.get("contentlets"); @@ -149,9 +123,6 @@ List toAnnouncements(final JsonNode root) { final LocalDateTime date = LocalDateTime.parse(dateString, formatter); final LocalDateTime modDate = LocalDateTime.parse(modDateString, formatter); - final Language language = getLanguage(langId); - - announcements.add( Announcement.builder() .identifier(identifier) @@ -161,8 +132,7 @@ List toAnnouncements(final JsonNode root) { .announcementDateAsISO8601(date.toString()) .type(type) .url(url) - .languageId(language.getId()) - .languageCode(language.getIsoCode()) + .languageId(langId) .modDate(modDate.toInstant(java.time.ZoneOffset.UTC)) .modDateAsISO8601(modDate.toString()) .description(description) @@ -174,4 +144,4 @@ List toAnnouncements(final JsonNode root) { } -} +} \ No newline at end of file diff --git a/dotCMS/src/main/java/com/dotcms/system/announcements/AbstractAnnouncement.java b/dotCMS/src/main/java/com/dotcms/system/announcements/AbstractAnnouncement.java index 2b79983f4b38..b6351018ff33 100644 --- a/dotCMS/src/main/java/com/dotcms/system/announcements/AbstractAnnouncement.java +++ b/dotCMS/src/main/java/com/dotcms/system/announcements/AbstractAnnouncement.java @@ -14,9 +14,7 @@ public interface AbstractAnnouncement { String inode(); - String languageCode(); - - long languageId(); + String languageId(); String type(); diff --git a/dotCMS/src/main/java/com/dotcms/system/announcements/AnnouncementsCache.java b/dotCMS/src/main/java/com/dotcms/system/announcements/AnnouncementsCache.java index 6bc97bd1f4a4..b280ebeebfc4 100644 --- a/dotCMS/src/main/java/com/dotcms/system/announcements/AnnouncementsCache.java +++ b/dotCMS/src/main/java/com/dotcms/system/announcements/AnnouncementsCache.java @@ -1,14 +1,13 @@ package com.dotcms.system.announcements; -import com.dotmarketing.portlets.languagesmanager.model.Language; import java.util.List; public interface AnnouncementsCache { void clearCache(); - void put(Language language, List announcements); + void put(List announcements); - List get(Language language); + List get(); } diff --git a/dotCMS/src/main/java/com/dotcms/system/announcements/AnnouncementsCacheImpl.java b/dotCMS/src/main/java/com/dotcms/system/announcements/AnnouncementsCacheImpl.java index 3426f49f5ee7..1f1d9f7754df 100644 --- a/dotCMS/src/main/java/com/dotcms/system/announcements/AnnouncementsCacheImpl.java +++ b/dotCMS/src/main/java/com/dotcms/system/announcements/AnnouncementsCacheImpl.java @@ -5,7 +5,6 @@ import com.dotcms.business.SystemCache; import com.dotcms.cache.Expirable; import com.dotmarketing.business.CacheLocator; -import com.dotmarketing.portlets.languagesmanager.model.Language; import com.dotmarketing.util.Config; import com.google.common.annotations.VisibleForTesting; import io.vavr.Lazy; @@ -18,7 +17,7 @@ public class AnnouncementsCacheImpl implements AnnouncementsCache { static final Lazy ANNOUNCEMENTS_TTL = Lazy.of(() -> Config.getIntProperty("ANNOUNCEMENTS_TTL", 3600 )); - static final String ANNOUNCEMENTS = "announcements::%s"; + static final String ANNOUNCEMENTS_KEY = "dot::announcements"; private final SystemCache systemCache; public AnnouncementsCacheImpl() { @@ -28,32 +27,27 @@ public AnnouncementsCacheImpl() { @Override public void clearCache() { - systemCache.clearCache(); - } - - private String hashKey(Language language) { - return String.format(ANNOUNCEMENTS, language.getIsoCode()); + systemCache.remove(ANNOUNCEMENTS_KEY); } @Override - public void put(final Language language, final List announcements) { - this.put(language, announcements, ANNOUNCEMENTS_TTL.get()); + public void put(final List announcements) { + this.put(announcements, ANNOUNCEMENTS_TTL.get()); } @VisibleForTesting - public void put(final Language language, final List announcements , final long ttl) { - systemCache.put(hashKey(language), new CacheEntryImpl(announcements,ttl)); + public void put(final List announcements , final long ttl) { + systemCache.put(ANNOUNCEMENTS_KEY, new CacheEntryImpl(announcements,ttl)); } @SuppressWarnings("unchecked") @Override - public List get(final Language language) { - final String key = String.format(ANNOUNCEMENTS, language.getIsoCode()); - final Object object = systemCache.get(key); + public List get() { + final Object object = systemCache.get(ANNOUNCEMENTS_KEY); if (object instanceof Expirable) { final CacheEntryImpl entry = (CacheEntryImpl) object; if (entry.isExpired()) { - systemCache.remove(key); + systemCache.remove(ANNOUNCEMENTS_KEY); return List.of(); } return entry.getAnnouncements(); diff --git a/dotcms-integration/src/test/java/com/dotcms/rest/api/v1/announcements/AnnouncementsHelperIntegrationTest.java b/dotcms-integration/src/test/java/com/dotcms/rest/api/v1/announcements/AnnouncementsHelperIntegrationTest.java index 668c40a34a3d..5d8a279bced2 100644 --- a/dotcms-integration/src/test/java/com/dotcms/rest/api/v1/announcements/AnnouncementsHelperIntegrationTest.java +++ b/dotcms-integration/src/test/java/com/dotcms/rest/api/v1/announcements/AnnouncementsHelperIntegrationTest.java @@ -69,10 +69,10 @@ public void testGetAnnouncements() { //Since we don't have a running dotCMS instance during Integration Testing, we need to mock the loader final AnnouncementsLoader loader = new RemoteAnnouncementsLoaderImpl(){ @Override - public List loadAnnouncements(final Language language) { + public List loadAnnouncements() { try { loadCount.incrementAndGet(); - final JsonNode jsonNode = generateJson(seed, language); + final JsonNode jsonNode = generateJson(seed); return toAnnouncements(jsonNode); }catch (JsonProcessingException e) { fail(e.getMessage()); @@ -82,26 +82,26 @@ public List loadAnnouncements(final Language language) { }; final User user = APILocator.systemUser(); final AnnouncementsCacheImpl cache = new AnnouncementsCacheImpl(); - AnnouncementsHelperImpl announcementsHelper = new AnnouncementsHelperImpl(APILocator.getLanguageAPI(), loader, cache); - final List announcements = announcementsHelper.getAnnouncements(language.getIsoCode(), false, -1, user); + AnnouncementsHelperImpl announcementsHelper = new AnnouncementsHelperImpl(loader, cache); + final List announcements = announcementsHelper.getAnnouncements(false, -1, user); Assert.assertNotNull(announcements); Assert.assertEquals((int)AnnouncementsHelper.ANNOUNCEMENTS_LIMIT.get(), announcements.size()); - final List cached = cache.get(language); + final List cached = cache.get(); Assert.assertNotNull(cached); Assert.assertEquals(seed, cached.size()); Assert.assertEquals(1, loadCount.get()); //Try another call but this time loadCount should be 1 again since we are using the cache - final List announcements2 = announcementsHelper.getAnnouncements(language.getIsoCode(), false, -1, user); + final List announcements2 = announcementsHelper.getAnnouncements(false, -1, user); Assert.assertNotNull(announcements2); Assert.assertEquals((int)AnnouncementsHelper.ANNOUNCEMENTS_LIMIT.get(), announcements2.size()); Assert.assertEquals(1, loadCount.get()); - final List announcements3 = announcementsHelper.getAnnouncements(language.getIsoCode(), true, -1, user); + final List announcements3 = announcementsHelper.getAnnouncements(true, -1, user); Assert.assertNotNull(announcements3); Assert.assertEquals(2, loadCount.get()); - final List announcements4 = announcementsHelper.getAnnouncements(language.getIsoCode(), false, 5, user); + final List announcements4 = announcementsHelper.getAnnouncements(false, 5, user); Assert.assertNotNull(announcements4); Assert.assertEquals(5, announcements4.size()); } @@ -115,7 +115,7 @@ public List loadAnnouncements(final Language language) { * @return JsonNode * @throws JsonProcessingException */ - public JsonNode generateJson(final int n, final Language lang) throws JsonProcessingException { + public JsonNode generateJson(final int n) throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); ArrayNode contentletsArray = objectMapper.createArrayNode(); @@ -144,7 +144,7 @@ public JsonNode generateJson(final int n, final Language lang) throws JsonProce contentletObject.put("live", true); contentletObject.put("owner", "dotcms.org.1"); contentletObject.put("identifier", java.util.UUID.randomUUID().toString()); - contentletObject.put("languageId", lang.getId()); + contentletObject.put("languageId",1); contentletObject.put("type1", "Announcement"); contentletObject.put("url", url); contentletObject.put("titleImage", "TITLE_IMAGE_NOT_FOUND"); @@ -173,23 +173,22 @@ public JsonNode generateJson(final int n, final Language lang) throws JsonProce */ @Test public void testAnnouncementCache() throws JsonProcessingException, InterruptedException { - final Language language = new LanguageDataGen().nextPersisted(); //Create a cache AnnouncementsCacheImpl cache = new AnnouncementsCacheImpl(); //Seed the cache RemoteAnnouncementsLoaderImpl loader = new RemoteAnnouncementsLoaderImpl(); - final JsonNode jsonNode = generateJson(100, language); + final JsonNode jsonNode = generateJson(100); final List announcements = loader.toAnnouncements(jsonNode); //Here we are using a TTL of 10 seconds - cache.put(language, announcements, 10); + cache.put( announcements, 10); //Get the cache and verify that it contains 100 elements - final List cached = cache.get(language); + final List cached = cache.get(); Assert.assertNotNull(cached); Assert.assertEquals(100, cached.size()); //Wait for the cache to expire sleeping for 11 seconds Thread.sleep(TimeUnit.SECONDS.toMillis(11)); //Get the cache again - final List cached2 = cache.get(language); + final List cached2 = cache.get(); Assert.assertNotNull(cached2); //Verify that the cache is empty Assert.assertEquals(0, cached2.size()); diff --git a/dotcms-integration/src/test/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderIntegrationTest.java b/dotcms-integration/src/test/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderIntegrationTest.java index 4aacbadf0bb2..00e16428d876 100644 --- a/dotcms-integration/src/test/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderIntegrationTest.java +++ b/dotcms-integration/src/test/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderIntegrationTest.java @@ -37,9 +37,8 @@ public static void prepare() throws Exception { */ @Test public void testAnnouncementRemoteURL() throws JsonProcessingException { - String expected = "https://www.dotcms.com/api/content/render/false/query/+contentType:Announcement +languageId:1 +deleted:false +live:true/orderBy/Announcement.announcementDate desc"; - final Language defaultLanguage = APILocator.getLanguageAPI().getDefaultLanguage(); - final String builtURL = loader.buildURL(defaultLanguage); + String expected = "https://www.dotcms.com/api/content/render/false/query/+contentType:Announcement%20+(conhost:8a7d5e23-da1e-420a-b4f0-471e7da8ea2d%20conhost:SYSTEM_HOST)%20+languageId:1%20+deleted:false%20+working:true%20+variant:default/orderby/Announcement.announcementDate%20desc"; + final String builtURL = loader.buildURL(); Assert.assertEquals(expected, builtURL); } diff --git a/dotcms-postman/pom.xml b/dotcms-postman/pom.xml index 8e7558f5a3e8..8ba790fdc294 100644 --- a/dotcms-postman/pom.xml +++ b/dotcms-postman/pom.xml @@ -79,7 +79,7 @@ false 600 true - + http://localhost:8080 15 obfuscate_me From 9f5d8e59fe8f4b9323632064a1fa987857ab53d9 Mon Sep 17 00:00:00 2001 From: fabrizzio-dotCMS Date: Wed, 31 Jan 2024 21:41:51 -0600 Subject: [PATCH 06/11] #25736 code clean up --- .../rest/api/v1/announcements/AnnouncementsHelperImpl.java | 4 ++-- .../v1/announcements/RemoteAnnouncementsLoaderImpl.java | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsHelperImpl.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsHelperImpl.java index 4642bb21855d..80f20c9a65c6 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsHelperImpl.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/AnnouncementsHelperImpl.java @@ -33,8 +33,8 @@ public AnnouncementsHelperImpl(AnnouncementsLoader loader, AnnouncementsCache an * Get the announcements from the cache or from the remote server * * @param refreshCache boolean - * @param limit Integer - * @param user User + * @param limit Integer + * @param user User * @return List */ @Override diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java index dff3d8bb297b..37b117734036 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java @@ -3,10 +3,7 @@ import com.dotcms.content.business.json.ContentletJsonHelper; import com.dotcms.rest.RestClientBuilder; import com.dotcms.system.announcements.Announcement; -import com.dotmarketing.business.APILocator; import com.dotmarketing.exception.DotRuntimeException; -import com.dotmarketing.portlets.languagesmanager.business.LanguageAPI; -import com.dotmarketing.portlets.languagesmanager.model.Language; import com.dotmarketing.util.Config; import com.dotmarketing.util.Logger; import com.fasterxml.jackson.core.JsonFactory; @@ -35,7 +32,7 @@ public class RemoteAnnouncementsLoaderImpl implements AnnouncementsLoader{ static final Lazy ANNOUNCEMENTS_BASE_URL = Lazy.of(() -> Config.getStringProperty("ANNOUNCEMENTS_BASE_URL", "https://www.dotcms.com")); - static final String ANNOUNCEMENTS_QUERY_PATTERN = "/api/content/render/false/query/+contentType:Announcement%20+(conhost:8a7d5e23-da1e-420a-b4f0-471e7da8ea2d%20conhost:SYSTEM_HOST)%20+languageId:1%20+deleted:false%20+working:true%20+variant:default/orderby/Announcement.announcementDate%20desc"; + static final String ANNOUNCEMENTS_QUERY = "/api/content/render/false/query/+contentType:Announcement%20+(conhost:8a7d5e23-da1e-420a-b4f0-471e7da8ea2d%20conhost:SYSTEM_HOST)%20+languageId:1%20+deleted:false%20+working:true%20+variant:default/orderby/Announcement.announcementDate%20desc"; /** * Load the announcements from the remote dotCMS instance @@ -81,7 +78,7 @@ JsonNode loadRemoteAnnouncements() { * @return String */ String buildURL() { - final String raw = ANNOUNCEMENTS_BASE_URL.get() + ANNOUNCEMENTS_QUERY_PATTERN; + final String raw = ANNOUNCEMENTS_BASE_URL.get() + ANNOUNCEMENTS_QUERY; //clean up double slashes in the url return raw.replaceAll("(? Date: Thu, 1 Feb 2024 09:21:34 -0600 Subject: [PATCH 07/11] #25736 updating postman test --- .../Announcements.postman_collection.json | 81 +++++++++---------- 1 file changed, 36 insertions(+), 45 deletions(-) diff --git a/dotCMS/src/curl-test/Announcements.postman_collection.json b/dotCMS/src/curl-test/Announcements.postman_collection.json index 5655f76822b1..1e08e8c69a7f 100644 --- a/dotCMS/src/curl-test/Announcements.postman_collection.json +++ b/dotCMS/src/curl-test/Announcements.postman_collection.json @@ -73,7 +73,7 @@ ], "body": { "mode": "raw", - "raw": "{\n\t\"clazz\": \"com.dotcms.contenttype.model.type.SimpleContentType\",\n\t\"description\": \"DotCMS Announcements\",\n\t\"defaultType\": false,\n\t\"system\": false,\n\t\"folder\": \"SYSTEM_FOLDER\",\n\t\"name\": \"Announcement\",\n\t\"variable\": \"Announcement\",\n\t\"host\": \"SYSTEM_HOST\",\n\t\"fixed\": false,\n \"icon\": \"Announcement\",\n \"sortOrder\": 0,\n\t\"fields\": [\n\t\t{\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.TextField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"TEXT\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": true,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 1,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"title\",\n\t\t\t\"variable\": \"title\",\n\t\t\t\"fixed\": true\n\t\t},\n {\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.SelectField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"TEXT\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": true,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 2,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"type\",\n\t\t\t\"variable\": \"type1\",\n \"values\": \"Announcement \\n Release \\n Comment\",\n\t\t\t\"fixed\": true\n\t\t},\n {\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.TextField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"TEXT\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": true,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 3,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"Url\",\n\t\t\t\"variable\": \"url\",\n\t\t\t\"fixed\": true\n\t\t},\n {\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.DateTimeField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"DATE\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": false,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 4,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"announcementDate\",\n\t\t\t\"variable\": \"announcementDate\",\n\t\t\t\"fixed\": true\n\t\t},\n {\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.TextField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"TEXT\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": true,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 5,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"description\",\n\t\t\t\"variable\": \"description\",\n\t\t\t\"fixed\": true\n\t\t}\n\t],\n \"publishDateVar\": \"announcementDate\",\n \"workflow\":[\"d61a59e1-a49c-46f2-a929-db2b4bfa88b2\"]\n}" + "raw": "{\n\t\"clazz\": \"com.dotcms.contenttype.model.type.SimpleContentType\",\n\t\"description\": \"DotCMS Announcements\",\n\t\"defaultType\": false,\n\t\"system\": false,\n\t\"folder\": \"SYSTEM_FOLDER\",\n\t\"name\": \"Announcement\",\n\t\"variable\": \"Announcement\",\n\t\"host\": \"SYSTEM_HOST\",\n\t\"fixed\": false,\n \"icon\": \"Announcement\",\n \"sortOrder\": 0,\n\t\"fields\": [\n\t\t{\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.TextField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"TEXT\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": true,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 1,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"title\",\n\t\t\t\"variable\": \"title\",\n\t\t\t\"fixed\": true\n\t\t},\n {\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.SelectField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"TEXT\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": true,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 2,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"type\",\n\t\t\t\"variable\": \"type1\",\n \"values\": \"Announcement\\nRelease\\nComment\",\n\t\t\t\"fixed\": true\n\t\t},\n {\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.TextField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"TEXT\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": true,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 3,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"Url\",\n\t\t\t\"variable\": \"url\",\n\t\t\t\"fixed\": true\n\t\t},\n {\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.DateTimeField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"DATE\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": false,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 4,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"announcementDate\",\n\t\t\t\"variable\": \"announcementDate\",\n\t\t\t\"fixed\": true\n\t\t},\n {\n\t\t\t\"clazz\": \"com.dotcms.contenttype.model.field.TextField\",\n\t\t\t\"indexed\": true,\n\t\t\t\"dataType\": \"TEXT\",\n\t\t\t\"readOnly\": false,\n\t\t\t\"required\": true,\n\t\t\t\"searchable\": true,\n\t\t\t\"listed\": true,\n\t\t\t\"sortOrder\": 5,\n\t\t\t\"unique\": false,\n\t\t\t\"name\": \"description\",\n\t\t\t\"variable\": \"description\",\n\t\t\t\"fixed\": true\n\t\t}\n\t],\n \"publishDateVar\": \"announcementDate\",\n \"workflow\":[\"d61a59e1-a49c-46f2-a929-db2b4bfa88b2\"]\n}" }, "url": { "raw": "{{serverURL}}/api/v1/contenttype", @@ -108,7 +108,7 @@ "", "pm.test(\"Announcements are created\", function() {", " pm.expect(contents,'contents were created').not.undefined;", - " pm.expect(contents.length,'Verify contents length').to.be.at.least(4); ", + " pm.expect(contents.length,'Verify contents length').to.be.at.least(3); ", "});" ], "type": "text/javascript" @@ -169,7 +169,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"contentlets\": [\n {\n \"contentType\": \"{{contentTypeId}}\", \n \"title\": \"Test Announcement 1\",\n \"type1\":\"Announcement\",\n \"announcementDate\":\"{{announcementDate}}\",\n \"url\":\"https://www.dotcms.com\",\n \"description\": \"Test Announcement 1\"\n },{\n \"contentType\": \"{{contentTypeId}}\", \n \"title\": \"Test Announcement 2\",\n \"type1\":\"Announcement\",\n \"announcementDate\":\"{{announcementDate}}\",\n \"url\":\"https://www.dotcms.com\",\n \"description\": \"Test Announcement 2\"\n },{\n \"contentType\": \"{{contentTypeId}}\", \n \"title\": \"Test Announcement 3\",\n \"type1\":\"Announcement\",\n \"announcementDate\":\"{{announcementDate}}\",\n \"url\":\"https://www.dotcms.com\",\n \"description\": \"Test Announcement 3\"\n },{\n \"contentType\": \"{{contentTypeId}}\", \n \"title\": \"Test Announcement 4\",\n \"type1\":\"Announcement\",\n \"announcementDate\":\"{{announcementDate}}\",\n \"url\":\"https://www.dotcms.com\",\n \"description\": \"Test Announcement 4\"\n }\n ] \n}", + "raw": "{\n \"contentlets\": [\n {\n \"contentType\": \"{{contentTypeId}}\", \n \"title\": \"Test Announcement\",\n \"type1\":\"Announcement\",\n \"announcementDate\":\"{{announcementDate}}\",\n \"url\":\"https://www.dotcms.com/announcement\",\n \"description\": \"Test Announcement\"\n },{\n \"contentType\": \"{{contentTypeId}}\", \n \"title\": \"Test Release\",\n \"type1\":\"Release\",\n \"announcementDate\":\"{{announcementDate}}\",\n \"url\":\"https://www.dotcms.com/release\",\n \"description\": \"Test Release\"\n },{\n \"contentType\": \"{{contentTypeId}}\", \n \"title\": \"Test Comment\",\n \"type1\":\"Comment\",\n \"announcementDate\":\"{{announcementDate}}\",\n \"url\":\"https://www.dotcms.com/comment\",\n \"description\": \"Test Comment\"\n }\n ] \n}", "options": { "raw": { "language": "json" @@ -208,52 +208,43 @@ "});", "", "pm.test(\"Validate Announcements\", function() { ", - " pm.expect(jsonData.entity.length).to.be.at.least(4); ", + " pm.expect(jsonData.entity.length).to.be.at.least(3); ", " ", - " let a4 = jsonData.entity.find(item => item.title === 'Test Announcement 4');", - " pm.expect(a4,'Announcement #4 should be present').not.undefined;", - " pm.expect(a4.announcementDate,'Announcement #4 should have a date').not.undefined;", - " pm.expect(a4.announcementDateAsISO8601,'Announcement #4 should have a announcementDateAsISO8601').not.undefined;", - " pm.expect(a4.identifier,'Announcement #4 should have an identifier').not.undefined;", - " pm.expect(a4.inode,'Announcement #4 should have an inode').not.undefined; ", - " pm.expect(a4.languageId,'Announcement #4 should have a languageId').eql(1);", - " pm.expect(a4.type,'Announcement #4 should have a type').eql('Announcement');", - " pm.expect(a4.url,'Announcement #4 should have a url').eql('https://www.dotcms.com');", - " pm.expect(a4.modDate,'Announcement #4 should have a modDate').not.undefined;", + " let a3 = jsonData.entity.find(item => item.title === 'Test Comment');", + " pm.expect(a3,'Comment should be present').not.undefined;", + " pm.expect(a3.announcementDate,'Comment should have a date').not.undefined;", + " pm.expect(a3.announcementDateAsISO8601,'Comment should have a announcementDateAsISO8601').not.undefined;", + " pm.expect(a3.identifier,'Comment should have an identifier').not.undefined;", + " pm.expect(a3.inode,'Comment should have an inode').not.undefined; ", + " pm.expect(a3.languageId,'Comment should have a languageId').eql('1');", + " pm.expect(a3.type,'Comment should have a type').eql('Comment');", + " pm.expect(a3.description,'Comment should have a desc').eql('Test Comment');", + " pm.expect(a3.url,'Comment should have a url').eql('https://www.dotcms.com/comment');", + " pm.expect(a3.modDate,'Comment should have a modDate').not.undefined;", "", - "", - " let a3 = jsonData.entity.find(item => item.title === 'Test Announcement 3');", - " pm.expect(a3,'Announcement #3 should be present').not.undefined;", - " pm.expect(a3.announcementDate,'Announcement #3 should have a date').not.undefined;", - " pm.expect(a3.announcementDateAsISO8601,'Announcement #3 should have a announcementDateAsISO8601').not.undefined;", - " pm.expect(a3.identifier,'Announcement #3 should have an identifier').not.undefined;", - " pm.expect(a3.inode,'Announcement #3 should have an inode').not.undefined; ", - " pm.expect(a3.languageId,'Announcement #3 should have a languageId').eql(1);", - " pm.expect(a3.type,'Announcement #3 should have a type').eql('Announcement');", - " pm.expect(a3.url,'Announcement #3 should have a url').eql('https://www.dotcms.com');", - " pm.expect(a3.modDate,'Announcement #3 should have a modDate').not.undefined;", - "", - " let a2 = jsonData.entity.find(item => item.title === 'Test Announcement 2');", - " pm.expect(a2,'Announcement #2 should be present').not.undefined;", - " pm.expect(a2.announcementDate,'Announcement #2 should have a date').not.undefined;", - " pm.expect(a2.announcementDateAsISO8601,'Announcement #2 should have a announcementDateAsISO8601').not.undefined;", - " pm.expect(a2.identifier,'Announcement #2 should have an identifier').not.undefined;", - " pm.expect(a2.inode,'Announcement #2 should have an inode').not.undefined; ", - " pm.expect(a2.languageId,'Announcement #2 should have a languageId').eql(1);", - " pm.expect(a2.type,'Announcement #2 should have a type').eql('Announcement');", - " pm.expect(a2.url,'Announcement #2 should have a url').eql('https://www.dotcms.com');", - " pm.expect(a2.modDate,'Announcement #2 should have a modDate').not.undefined;", + " let a2 = jsonData.entity.find(item => item.title === 'Test Release');", + " pm.expect(a2,'Release should be present').not.undefined;", + " pm.expect(a2.announcementDate,'Release should have a date').not.undefined;", + " pm.expect(a2.announcementDateAsISO8601,'Release should have a announcementDateAsISO8601').not.undefined;", + " pm.expect(a2.identifier,'Release should have an identifier').not.undefined;", + " pm.expect(a2.inode,'Release should have an inode').not.undefined; ", + " pm.expect(a2.languageId,'Release should have a languageId').eql('1');", + " pm.expect(a2.type,'Release should have a type').eql('Release');", + " pm.expect(a2.description,'Release should have a desc').eql('Test Release');", + " pm.expect(a2.url,'Release should have a url').eql('https://www.dotcms.com/release');", + " pm.expect(a2.modDate,'Release should have a modDate').not.undefined;", " ", - " let a1 = jsonData.entity.find(item => item.title === 'Test Announcement 1');", - " pm.expect(a1,'Announcement #1 should be present').not.undefined;", - " pm.expect(a1.announcementDate,'Announcement #1 should have a date').not.undefined;", - " pm.expect(a1.announcementDateAsISO8601,'Announcement #1 should have a announcementDateAsISO8601').not.undefined;", - " pm.expect(a1.identifier,'Announcement #1 should have an identifier').not.undefined;", + " let a1 = jsonData.entity.find(item => item.title === 'Test Announcement');", + " pm.expect(a1,'Announcement should be present').not.undefined;", + " pm.expect(a1.announcementDate,'Announcement should have a date').not.undefined;", + " pm.expect(a1.announcementDateAsISO8601,'Announcement should have a announcementDateAsISO8601').not.undefined;", + " pm.expect(a1.identifier,'Announcement should have an identifier').not.undefined;", " pm.expect(a1.inode,'Announcement #1 should have an inode').not.undefined; ", - " pm.expect(a1.languageId,'Announcement #1 should have a languageId').eql(1);", - " pm.expect(a1.type,'Announcement #1 should have a type').eql('Announcement');", - " pm.expect(a1.url,'Announcement #1 should have a url').eql('https://www.dotcms.com');", - " pm.expect(a1.modDate,'Announcement #1 should have a modDate').not.undefined;", + " pm.expect(a1.languageId,'Announcement #1 should have a languageId').eql('1');", + " pm.expect(a1.type,'Announcement should have a type').eql('Announcement');", + " pm.expect(a1.description,'Announcement should have a desc').eql('Test Announcement');", + " pm.expect(a1.url,'Announcement should have a url').eql('https://www.dotcms.com/announcement');", + " pm.expect(a1.modDate,'Announcement should have a modDate').not.undefined;", "", " ", "});" From 3e5bbed96f530e3931e600987f2d926096b5a6f8 Mon Sep 17 00:00:00 2001 From: fabrizzio-dotCMS Date: Thu, 1 Feb 2024 10:13:24 -0600 Subject: [PATCH 08/11] #25736 url query fix --- .../api/v1/announcements/RemoteAnnouncementsLoaderImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java index 37b117734036..9d4ff78b6488 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java @@ -32,7 +32,7 @@ public class RemoteAnnouncementsLoaderImpl implements AnnouncementsLoader{ static final Lazy ANNOUNCEMENTS_BASE_URL = Lazy.of(() -> Config.getStringProperty("ANNOUNCEMENTS_BASE_URL", "https://www.dotcms.com")); - static final String ANNOUNCEMENTS_QUERY = "/api/content/render/false/query/+contentType:Announcement%20+(conhost:8a7d5e23-da1e-420a-b4f0-471e7da8ea2d%20conhost:SYSTEM_HOST)%20+languageId:1%20+deleted:false%20+working:true%20+variant:default/orderby/Announcement.announcementDate%20desc"; + static final String ANNOUNCEMENTS_QUERY = "/api/content/render/false/query/+contentType:Announcement%20+languageId:1%20+deleted:false%20+live:true%20/orderby/Announcement.announcementDate%20desc"; /** * Load the announcements from the remote dotCMS instance From 520c8720115997ff21d0659a24898b71933f862f Mon Sep 17 00:00:00 2001 From: fabrizzio-dotCMS Date: Thu, 1 Feb 2024 10:20:08 -0600 Subject: [PATCH 09/11] #25736 adjusting test --- .../announcements/RemoteAnnouncementsLoaderIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotcms-integration/src/test/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderIntegrationTest.java b/dotcms-integration/src/test/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderIntegrationTest.java index 00e16428d876..18225955adf3 100644 --- a/dotcms-integration/src/test/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderIntegrationTest.java +++ b/dotcms-integration/src/test/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderIntegrationTest.java @@ -37,7 +37,7 @@ public static void prepare() throws Exception { */ @Test public void testAnnouncementRemoteURL() throws JsonProcessingException { - String expected = "https://www.dotcms.com/api/content/render/false/query/+contentType:Announcement%20+(conhost:8a7d5e23-da1e-420a-b4f0-471e7da8ea2d%20conhost:SYSTEM_HOST)%20+languageId:1%20+deleted:false%20+working:true%20+variant:default/orderby/Announcement.announcementDate%20desc"; + String expected = "https://www.dotcms.com/api/content/render/false/query/+contentType:Announcement%20+languageId:1%20+deleted:false%20+live:true%20/orderby/Announcement.announcementDate%20desc"; final String builtURL = loader.buildURL(); Assert.assertEquals(expected, builtURL); } From c8bdc9ce8f0032a571efeac4c4ff4d66b1a91c7b Mon Sep 17 00:00:00 2001 From: fabrizzio-dotCMS Date: Thu, 1 Feb 2024 12:00:48 -0600 Subject: [PATCH 10/11] #25736 imrproved IT --- .../RemoteAnnouncementsLoaderImpl.java | 23 +++++++++- ...oteAnnouncementsLoaderIntegrationTest.java | 45 ++++++++++++++----- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java index 9d4ff78b6488..dc9cb84bde2d 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import io.vavr.Lazy; import io.vavr.control.Try; @@ -18,6 +19,7 @@ import java.time.format.DateTimeFormatterBuilder; import java.time.temporal.ChronoField; import java.util.List; +import java.util.function.Supplier; import javax.ws.rs.client.Client; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; @@ -29,11 +31,28 @@ public class RemoteAnnouncementsLoaderImpl implements AnnouncementsLoader{ //This is the url to the dotCMS instance set to provide and feed all consumers with announcements - static final Lazy ANNOUNCEMENTS_BASE_URL = + static final Lazy BASE_URL_LAZY_SUPPLIER = Lazy.of(() -> Config.getStringProperty("ANNOUNCEMENTS_BASE_URL", "https://www.dotcms.com")); static final String ANNOUNCEMENTS_QUERY = "/api/content/render/false/query/+contentType:Announcement%20+languageId:1%20+deleted:false%20+live:true%20/orderby/Announcement.announcementDate%20desc"; + Supplier baseURL = BASE_URL_LAZY_SUPPLIER; + + /** + * Default constructor + */ + public RemoteAnnouncementsLoaderImpl() { + } + + /** + * Constructor + * @param baseURL Supplier + */ + @VisibleForTesting + public RemoteAnnouncementsLoaderImpl(final Supplier baseURL) { + this.baseURL = baseURL; + } + /** * Load the announcements from the remote dotCMS instance * @return List @@ -78,7 +97,7 @@ JsonNode loadRemoteAnnouncements() { * @return String */ String buildURL() { - final String raw = ANNOUNCEMENTS_BASE_URL.get() + ANNOUNCEMENTS_QUERY; + final String raw = baseURL.get() + ANNOUNCEMENTS_QUERY; //clean up double slashes in the url return raw.replaceAll("(? DOTCMS_COM); + + final String prodURL = DOTCMS_COM + expected; + + final String builtURL2 = urlSupplied.buildURL(); + Assert.assertEquals(prodURL, builtURL2); + } /** @@ -49,9 +59,9 @@ public void testAnnouncementRemoteURL() throws JsonProcessingException { */ @Test public void testAnnouncementConversion() throws JsonProcessingException { - - ObjectMapper mapper = new ObjectMapper(); - JsonNode node = mapper.readTree(jsonString); + final RemoteAnnouncementsLoaderImpl loader = new RemoteAnnouncementsLoaderImpl(); + final ObjectMapper mapper = new ObjectMapper(); + final JsonNode node = mapper.readTree(jsonString); final List announcements = loader.toAnnouncements(node); Assert.assertNotNull(announcements); Assert.assertEquals(1, announcements.size()); @@ -140,4 +150,19 @@ public void testDateTimeFormatter() { } + /** + * Given scenario: We want to make sure we can hit the remote server and get a response + * Expected result: We test that the loader can hit prod and get a response back that's it no announcement validation is performed + */ + @Test + public void TestAnnouncementsLoader() { + + final RemoteAnnouncementsLoaderImpl urlSupplied = new RemoteAnnouncementsLoaderImpl( + () -> DOTCMS_COM); + + final List announcements = urlSupplied.loadAnnouncements(); + Assert.assertNotNull(announcements); + + } + } From c0740e7638bbc4e2ad3d5056bec199918f523cdf Mon Sep 17 00:00:00 2001 From: fabrizzio-dotCMS Date: Thu, 1 Feb 2024 18:59:45 -0600 Subject: [PATCH 11/11] #25736 log should be debug --- .../api/v1/announcements/RemoteAnnouncementsLoaderImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java index dc9cb84bde2d..a7eb29c74a01 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/announcements/RemoteAnnouncementsLoaderImpl.java @@ -70,7 +70,7 @@ public List loadAnnouncements() { JsonNode loadRemoteAnnouncements() { final String url = buildURL(); //Let's log the url to retrieve the announcements for debugging purposes on postman - Logger.info(AnnouncementsHelperImpl.class, String.format("loading announcements from [%s]", url)); + Logger.debug(AnnouncementsHelperImpl.class, String.format("loading announcements from [%s]", url)); try { final Client client = restClient(); final WebTarget webTarget = client.target(url);