From fefc60564ccd016a5732c8d19f27663da280037e Mon Sep 17 00:00:00 2001 From: Mohammed Ezzedine Date: Sun, 24 Dec 2023 22:29:02 +0200 Subject: [PATCH] Add the ability to hide articles --- .../personalspace/article/api/ArticleApiModel.java | 1 + .../article/api/ArticleController.java | 7 ++++--- .../article/api/ArticleCreationApiRequest.java | 2 ++ .../article/api/ArticleUpdateApiRequest.java | 1 + .../personalspace/article/core/Article.java | 1 + .../article/core/ArticleCreationRequest.java | 2 ++ .../personalspace/article/core/ArticleService.java | 3 ++- .../article/core/ArticleUpdateRequest.java | 5 +++++ .../personalspace/article/infra/ArticleEntity.java | 1 + .../article/infra/ArticleStorageManager.java | 4 ++-- .../api/ArticleControllerIntegrationTest.java | 9 ++++++--- .../article/core/ArticleServiceTest.java | 14 ++++++++++---- .../ArticleStorageManagerIntegrationTest.java | 12 +++++++++--- .../article/api/all_articles_details_response.json | 3 ++- .../article/api/article_details_response.json | 3 ++- .../article/api/create_article_request.json | 3 ++- .../article/api/edit_article_request.json | 3 ++- 17 files changed, 54 insertions(+), 20 deletions(-) diff --git a/src/main/java/me/ezzedine/mohammed/personalspace/article/api/ArticleApiModel.java b/src/main/java/me/ezzedine/mohammed/personalspace/article/api/ArticleApiModel.java index 0956c8a..b06ac65 100644 --- a/src/main/java/me/ezzedine/mohammed/personalspace/article/api/ArticleApiModel.java +++ b/src/main/java/me/ezzedine/mohammed/personalspace/article/api/ArticleApiModel.java @@ -17,4 +17,5 @@ public class ArticleApiModel { private List keywords; private String createdDate; private String lastModifiedDate; + private Boolean hidden; } diff --git a/src/main/java/me/ezzedine/mohammed/personalspace/article/api/ArticleController.java b/src/main/java/me/ezzedine/mohammed/personalspace/article/api/ArticleController.java index 8e505ac..2eb88e5 100644 --- a/src/main/java/me/ezzedine/mohammed/personalspace/article/api/ArticleController.java +++ b/src/main/java/me/ezzedine/mohammed/personalspace/article/api/ArticleController.java @@ -64,13 +64,14 @@ public ResponseEntity editArticle(String id, ArticleUpdateApiRequest reque private static ArticleUpdateRequest toDomainModel(String id, ArticleUpdateApiRequest request) { return ArticleUpdateRequest.builder().id(id).title(request.getTitle()).description(request.getDescription()) .content(request.getContent()).categoryId(request.getCategoryId()).thumbnailImageUrl(request.getThumbnailImageUrl()) - .keywords(request.getKeywords()).build(); + .keywords(request.getKeywords()).hidden(request.getHidden()).build(); } private static ArticleApiModel toApiModel(Article article) { return ArticleApiModel.builder().id(article.getId()).title(article.getTitle()).description(article.getDescription()) .content(article.getContent()).categoryId(article.getCategoryId()).thumbnailImageUrl(article.getThumbnailImageUrl()) - .keywords(article.getKeywords()).createdDate(getDateAsString(article.getCreatedDate())).lastModifiedDate(getDateAsString(article.getLastModifiedDate())).build(); + .keywords(article.getKeywords()).createdDate(getDateAsString(article.getCreatedDate())) + .lastModifiedDate(getDateAsString(article.getLastModifiedDate())).hidden(article.isHidden()).build(); } private static String getDateAsString(LocalDateTime createdDate) { @@ -79,7 +80,7 @@ private static String getDateAsString(LocalDateTime createdDate) { private static ArticleCreationRequest toDomainModel(ArticleCreationApiRequest request) { return ArticleCreationRequest.builder().title(request.getTitle()).content(request.getContent()) - .description(request.getDescription()).categoryId(request.getCategoryId()) + .description(request.getDescription()).categoryId(request.getCategoryId()).hidden(request.getHidden()) .thumbnailImageUrl(request.getThumbnailImageUrl()).keywords(request.getKeywords()).build(); } } diff --git a/src/main/java/me/ezzedine/mohammed/personalspace/article/api/ArticleCreationApiRequest.java b/src/main/java/me/ezzedine/mohammed/personalspace/article/api/ArticleCreationApiRequest.java index d280d6e..dda836b 100644 --- a/src/main/java/me/ezzedine/mohammed/personalspace/article/api/ArticleCreationApiRequest.java +++ b/src/main/java/me/ezzedine/mohammed/personalspace/article/api/ArticleCreationApiRequest.java @@ -20,4 +20,6 @@ public class ArticleCreationApiRequest { private String thumbnailImageUrl; @NonNull private List keywords; + @NonNull + private Boolean hidden; } diff --git a/src/main/java/me/ezzedine/mohammed/personalspace/article/api/ArticleUpdateApiRequest.java b/src/main/java/me/ezzedine/mohammed/personalspace/article/api/ArticleUpdateApiRequest.java index 3c8b80a..e7be637 100644 --- a/src/main/java/me/ezzedine/mohammed/personalspace/article/api/ArticleUpdateApiRequest.java +++ b/src/main/java/me/ezzedine/mohammed/personalspace/article/api/ArticleUpdateApiRequest.java @@ -18,4 +18,5 @@ public class ArticleUpdateApiRequest { private String content; private String thumbnailImageUrl; private List keywords; + private Boolean hidden; } diff --git a/src/main/java/me/ezzedine/mohammed/personalspace/article/core/Article.java b/src/main/java/me/ezzedine/mohammed/personalspace/article/core/Article.java index e77ae04..b8c8ad7 100644 --- a/src/main/java/me/ezzedine/mohammed/personalspace/article/core/Article.java +++ b/src/main/java/me/ezzedine/mohammed/personalspace/article/core/Article.java @@ -24,6 +24,7 @@ public class Article { private String thumbnailImageUrl; @Builder.Default private List keywords = new ArrayList<>(); + private boolean hidden; private LocalDateTime createdDate; private LocalDateTime lastModifiedDate; private Long version; diff --git a/src/main/java/me/ezzedine/mohammed/personalspace/article/core/ArticleCreationRequest.java b/src/main/java/me/ezzedine/mohammed/personalspace/article/core/ArticleCreationRequest.java index 9e95322..979dcf6 100644 --- a/src/main/java/me/ezzedine/mohammed/personalspace/article/core/ArticleCreationRequest.java +++ b/src/main/java/me/ezzedine/mohammed/personalspace/article/core/ArticleCreationRequest.java @@ -20,4 +20,6 @@ public class ArticleCreationRequest { private String thumbnailImageUrl; @NonNull private List keywords; + @NonNull + private Boolean hidden; } diff --git a/src/main/java/me/ezzedine/mohammed/personalspace/article/core/ArticleService.java b/src/main/java/me/ezzedine/mohammed/personalspace/article/core/ArticleService.java index a96b7f5..658e9ca 100644 --- a/src/main/java/me/ezzedine/mohammed/personalspace/article/core/ArticleService.java +++ b/src/main/java/me/ezzedine/mohammed/personalspace/article/core/ArticleService.java @@ -50,6 +50,7 @@ public void edit(ArticleUpdateRequest request) throws ArticleNotFoundException, request.getContent().ifPresent(article::setContent); request.getThumbnailImageUrl().ifPresent(article::setThumbnailImageUrl); request.getKeywords().ifPresent(article::setKeywords); + request.getHidden().ifPresent(article::setHidden); storage.save(article); } @@ -62,7 +63,7 @@ private String saveArticleInStorage(ArticleCreationRequest request) { String articleId = idGenerator.generate(); Article article = Article.builder().id(articleId).content(request.getContent()).categoryId(request.getCategoryId()) .description(request.getDescription()).title(request.getTitle()).thumbnailImageUrl(request.getThumbnailImageUrl()) - .keywords(request.getKeywords()).build(); + .keywords(request.getKeywords()).hidden(request.getHidden()).build(); storage.save(article); return articleId; } diff --git a/src/main/java/me/ezzedine/mohammed/personalspace/article/core/ArticleUpdateRequest.java b/src/main/java/me/ezzedine/mohammed/personalspace/article/core/ArticleUpdateRequest.java index 9e63255..0bca600 100644 --- a/src/main/java/me/ezzedine/mohammed/personalspace/article/core/ArticleUpdateRequest.java +++ b/src/main/java/me/ezzedine/mohammed/personalspace/article/core/ArticleUpdateRequest.java @@ -16,6 +16,7 @@ public class ArticleUpdateRequest { private String content; private String thumbnailImageUrl; private List keywords; + private Boolean hidden; public Optional getTitle() { return Optional.ofNullable(title); @@ -40,4 +41,8 @@ public Optional getThumbnailImageUrl() { public Optional> getKeywords() { return Optional.ofNullable(keywords); } + + public Optional getHidden() { + return Optional.ofNullable(hidden); + } } diff --git a/src/main/java/me/ezzedine/mohammed/personalspace/article/infra/ArticleEntity.java b/src/main/java/me/ezzedine/mohammed/personalspace/article/infra/ArticleEntity.java index 66d28e0..3ad7bfd 100644 --- a/src/main/java/me/ezzedine/mohammed/personalspace/article/infra/ArticleEntity.java +++ b/src/main/java/me/ezzedine/mohammed/personalspace/article/infra/ArticleEntity.java @@ -25,6 +25,7 @@ public class ArticleEntity { private String categoryId; private String thumbnailImageUrl; private List keywords; + private boolean hidden; @CreatedDate private LocalDateTime createdDate; @LastModifiedDate diff --git a/src/main/java/me/ezzedine/mohammed/personalspace/article/infra/ArticleStorageManager.java b/src/main/java/me/ezzedine/mohammed/personalspace/article/infra/ArticleStorageManager.java index 4a400e4..042e5a6 100644 --- a/src/main/java/me/ezzedine/mohammed/personalspace/article/infra/ArticleStorageManager.java +++ b/src/main/java/me/ezzedine/mohammed/personalspace/article/infra/ArticleStorageManager.java @@ -43,7 +43,7 @@ private static ArticleEntity toEntity(Article article) { return ArticleEntity.builder().id(article.getId()).title(article.getTitle()).description(article.getDescription()) .content(article.getContent()).categoryId(article.getCategoryId()).thumbnailImageUrl(article.getThumbnailImageUrl()) .keywords(article.getKeywords()).version(article.getVersion()).createdDate(article.getCreatedDate()) - .lastModifiedDate(article.getLastModifiedDate()).build(); + .lastModifiedDate(article.getLastModifiedDate()).hidden(article.isHidden()).build(); } private static Article fromEntity(ArticleEntity articleEntity) { @@ -51,6 +51,6 @@ private static Article fromEntity(ArticleEntity articleEntity) { .description(articleEntity.getDescription()).categoryId(articleEntity.getCategoryId()) .thumbnailImageUrl(articleEntity.getThumbnailImageUrl()).keywords(articleEntity.getKeywords()) .createdDate(articleEntity.getCreatedDate()).lastModifiedDate(articleEntity.getLastModifiedDate()) - .version(articleEntity.getVersion()).build(); + .version(articleEntity.getVersion()).hidden(articleEntity.isHidden()).build(); } } diff --git a/src/test/java/me/ezzedine/mohammed/personalspace/article/api/ArticleControllerIntegrationTest.java b/src/test/java/me/ezzedine/mohammed/personalspace/article/api/ArticleControllerIntegrationTest.java index 41a9d3a..b47f8e5 100644 --- a/src/test/java/me/ezzedine/mohammed/personalspace/article/api/ArticleControllerIntegrationTest.java +++ b/src/test/java/me/ezzedine/mohammed/personalspace/article/api/ArticleControllerIntegrationTest.java @@ -46,6 +46,7 @@ class ArticleControllerIntegrationTest { public static final String KEYWORD = "keyword"; public static final String CREATED_DATE = "2023-12-24T12:33:42.411"; public static final String LAST_MODIFIED_DATE = "2023-12-24T12:34:51.182"; + public static final boolean HIDDEN = true; @Autowired private MockMvc mockMvc; @@ -136,7 +137,7 @@ void should_return_a_created_success_status_on_the_happy_path() throws Exception ArticleCreationRequest request = ArticleCreationRequest.builder().title(TITLE).description(DESCRIPTION) .content(CONTENT).categoryId(CATEGORY_ID).thumbnailImageUrl(ARTICLE_THUMBNAIL_IMAGE_URL) - .keywords(List.of(KEYWORD)).build(); + .keywords(List.of(KEYWORD)).hidden(HIDDEN).build(); verify(articleCreator).create(request); } @@ -178,7 +179,8 @@ void should_return_a_success_status_on_the_happy_path() throws Exception { ArticleUpdateRequest request = ArticleUpdateRequest.builder().id(ARTICLE_ID).title("updatedArticleTitle") .categoryId("updatedArticleCategoryId").content("updatedArticleContent").description("updatedArticleDescription") - .thumbnailImageUrl("updatedArticleThumbnailImageUrl").keywords(List.of("updatedArticleKeyword")).build(); + .thumbnailImageUrl("updatedArticleThumbnailImageUrl").keywords(List.of("updatedArticleKeyword")) + .hidden(true).build(); verify(articleEditor).edit(request); } @@ -210,6 +212,7 @@ void should_return_a_not_found_status_when_the_chosen_category_does_not_exist() private Article getArticle() { return Article.builder().id(ARTICLE_ID).title(TITLE).description(DESCRIPTION).content(CONTENT) .categoryId(CATEGORY_ID).thumbnailImageUrl(ARTICLE_THUMBNAIL_IMAGE_URL).keywords(List.of(KEYWORD)) - .version(1L).createdDate(LocalDateTime.parse(CREATED_DATE)).lastModifiedDate(LocalDateTime.parse(LAST_MODIFIED_DATE)).build(); + .version(1L).createdDate(LocalDateTime.parse(CREATED_DATE)).lastModifiedDate(LocalDateTime.parse(LAST_MODIFIED_DATE)) + .hidden(HIDDEN).build(); } } \ No newline at end of file diff --git a/src/test/java/me/ezzedine/mohammed/personalspace/article/core/ArticleServiceTest.java b/src/test/java/me/ezzedine/mohammed/personalspace/article/core/ArticleServiceTest.java index 2454584..2518b30 100644 --- a/src/test/java/me/ezzedine/mohammed/personalspace/article/core/ArticleServiceTest.java +++ b/src/test/java/me/ezzedine/mohammed/personalspace/article/core/ArticleServiceTest.java @@ -37,6 +37,8 @@ class ArticleServiceTest { public static final Long VERSION = 1L; public static final LocalDateTime CREATED_DATE = mock(LocalDateTime.class); public static final LocalDateTime LAST_MODIFIED_DATE = mock(LocalDateTime.class); + public static final boolean HIDDEN = true; + public static final boolean UPDATED_HIDDEN = false; private ArticleStorage storage; private ArticleService service; private CategoryFetcher categoryFetcher; @@ -89,6 +91,7 @@ void should_save_the_new_article_in_the_storage() throws CategoryNotFoundExcepti assertEquals(DESCRIPTION, argumentCaptor.getValue().getDescription()); assertEquals(THUMBNAIL_IMAGE_URL, argumentCaptor.getValue().getThumbnailImageUrl()); assertEquals(List.of(KEYWORD), argumentCaptor.getValue().getKeywords()); + assertEquals(HIDDEN, argumentCaptor.getValue().isHidden()); } @Test @@ -100,7 +103,7 @@ void should_return_the_id_of_the_newly_created_article() throws CategoryNotFound private static ArticleCreationRequest getRequest() { return ArticleCreationRequest.builder().categoryId(CATEGORY_ID).title(TITLE).content(CONTENT).description(DESCRIPTION) - .thumbnailImageUrl(THUMBNAIL_IMAGE_URL).keywords(List.of(KEYWORD)).build(); + .thumbnailImageUrl(THUMBNAIL_IMAGE_URL).keywords(List.of(KEYWORD)).hidden(HIDDEN).build(); } } @@ -134,6 +137,8 @@ void it_should_return_the_article_details() throws ArticleNotFoundException { assertEquals(VERSION, article.getVersion()); assertEquals(CREATED_DATE, article.getCreatedDate()); assertEquals(LAST_MODIFIED_DATE, article.getLastModifiedDate()); + assertEquals(HIDDEN, article.isHidden()); + } } @@ -177,20 +182,21 @@ void the_new_changes_should_be_saved_successfully_on_the_happy_path() throws Art service.edit(getRequest()); Article updatedArticle = Article.builder().id(ARTICLE_ID).categoryId(UPDATED_CATEGORY_ID).title(UPDATED_TITLE) .content(UPDATED_CONTENT).description(UPDATED_DESCRIPTION).thumbnailImageUrl(UPDATED_THUMBNAIL_IMAGE_URL) - .keywords(List.of(UPDATED_KEYWORD)).version(VERSION).createdDate(CREATED_DATE).lastModifiedDate(LAST_MODIFIED_DATE).build(); + .keywords(List.of(UPDATED_KEYWORD)).version(VERSION).createdDate(CREATED_DATE).lastModifiedDate(LAST_MODIFIED_DATE) + .hidden(UPDATED_HIDDEN).build(); verify(storage).save(updatedArticle); } private static ArticleUpdateRequest getRequest() { return ArticleUpdateRequest.builder().id(ARTICLE_ID).categoryId(UPDATED_CATEGORY_ID).title(UPDATED_TITLE) .content(UPDATED_CONTENT).description(UPDATED_DESCRIPTION).thumbnailImageUrl(UPDATED_THUMBNAIL_IMAGE_URL) - .keywords(List.of(UPDATED_KEYWORD)).build(); + .keywords(List.of(UPDATED_KEYWORD)).hidden(UPDATED_HIDDEN).build(); } } private Article getArticle() { return Article.builder().id(ARTICLE_ID).title(TITLE).description(DESCRIPTION).content(CONTENT) .categoryId(CATEGORY_ID).thumbnailImageUrl(THUMBNAIL_IMAGE_URL).keywords(List.of(KEYWORD)) - .version(VERSION).createdDate(CREATED_DATE).lastModifiedDate(LAST_MODIFIED_DATE).build(); + .version(VERSION).createdDate(CREATED_DATE).lastModifiedDate(LAST_MODIFIED_DATE).hidden(true).build(); } } \ No newline at end of file diff --git a/src/test/java/me/ezzedine/mohammed/personalspace/article/infra/ArticleStorageManagerIntegrationTest.java b/src/test/java/me/ezzedine/mohammed/personalspace/article/infra/ArticleStorageManagerIntegrationTest.java index d7be518..dc6d914 100644 --- a/src/test/java/me/ezzedine/mohammed/personalspace/article/infra/ArticleStorageManagerIntegrationTest.java +++ b/src/test/java/me/ezzedine/mohammed/personalspace/article/infra/ArticleStorageManagerIntegrationTest.java @@ -33,6 +33,7 @@ class ArticleStorageManagerIntegrationTest extends DatabaseIntegrationTest { public static final String CONTENT = UUID.randomUUID().toString(); public static final String THUMBNAIL_IMAGE_URL = UUID.randomUUID().toString(); public static final String KEYWORD = UUID.randomUUID().toString(); + public static final boolean HIDDEN = true; @Autowired private ArticleMongoRepository repository; @@ -62,6 +63,7 @@ void the_article_should_be_persisted_in_the_storage() { assertEquals(CONTENT, allArticles.get(0).getContent()); assertEquals(THUMBNAIL_IMAGE_URL, allArticles.get(0).getThumbnailImageUrl()); assertEquals(List.of(KEYWORD), allArticles.get(0).getKeywords()); + assertEquals(HIDDEN, allArticles.get(0).isHidden()); } @Test @@ -95,6 +97,7 @@ void should_override_any_existing_article_with_the_same_id() { assertEquals(CONTENT, allArticles.get(0).getContent()); assertEquals(THUMBNAIL_IMAGE_URL, allArticles.get(0).getThumbnailImageUrl()); assertEquals(List.of(KEYWORD), allArticles.get(0).getKeywords()); + assertEquals(HIDDEN, allArticles.get(0).isHidden()); } @Test @@ -132,12 +135,12 @@ void should_not_update_the_created_date_when_overriding_an_existing_article() { private static ArticleEntity getRandomArticleEntity() { return ArticleEntity.builder().id(ID).title(UUID.randomUUID().toString()).categoryId(UUID.randomUUID().toString()) .content(UUID.randomUUID().toString()).description(UUID.randomUUID().toString()).thumbnailImageUrl(UUID.randomUUID().toString()) - .keywords(List.of(UUID.randomUUID().toString())).build(); + .keywords(List.of(UUID.randomUUID().toString())).hidden(false).build(); } private Article getArticle() { return Article.builder().id(ID).categoryId(CATEGORY_ID).title(TITLE).description(DESCRIPTION).content(CONTENT) - .thumbnailImageUrl(THUMBNAIL_IMAGE_URL).keywords(List.of(KEYWORD)).build(); + .thumbnailImageUrl(THUMBNAIL_IMAGE_URL).keywords(List.of(KEYWORD)).hidden(HIDDEN).build(); } } @@ -167,6 +170,7 @@ void it_should_return_the_article_when_it_exists() { assertEquals(List.of(KEYWORD), optionalArticle.get().getKeywords()); assertNotNull(optionalArticle.get().getCreatedDate()); assertNotNull(optionalArticle.get().getLastModifiedDate()); + assertEquals(HIDDEN, optionalArticle.get().isHidden()); } } @@ -198,6 +202,8 @@ void should_return_a_list_of_one_article_when_only_one_exists() { assertEquals(List.of(KEYWORD), articles.getItems().get(0).getKeywords()); assertNotNull(articles.getItems().get(0).getCreatedDate()); assertNotNull(articles.getItems().get(0).getLastModifiedDate()); + assertEquals(HIDDEN, articles.getItems().get(0).isHidden()); + } @Test @@ -259,7 +265,7 @@ void should_return_the_articles_sorted_in_descending_order_of_creation_date() { private ArticleEntity getEntity(String id) { return ArticleEntity.builder().id(id).categoryId(CATEGORY_ID).title(TITLE).description(DESCRIPTION) - .content(CONTENT).thumbnailImageUrl(THUMBNAIL_IMAGE_URL).keywords(List.of(KEYWORD)).build(); + .content(CONTENT).thumbnailImageUrl(THUMBNAIL_IMAGE_URL).keywords(List.of(KEYWORD)).hidden(HIDDEN).build(); } private ArticleEntity getEntity() { diff --git a/src/test/resources/article/api/all_articles_details_response.json b/src/test/resources/article/api/all_articles_details_response.json index 64c4c6c..41d75c3 100644 --- a/src/test/resources/article/api/all_articles_details_response.json +++ b/src/test/resources/article/api/all_articles_details_response.json @@ -10,7 +10,8 @@ "thumbnailImageUrl": "articleThumbnailImageUrl", "keywords": ["keyword"], "createdDate": "2023-12-24T12:33:42.411", - "lastModifiedDate": "2023-12-24T12:34:51.182" + "lastModifiedDate": "2023-12-24T12:34:51.182", + "hidden": true } ] } \ No newline at end of file diff --git a/src/test/resources/article/api/article_details_response.json b/src/test/resources/article/api/article_details_response.json index 8d7332e..1626b34 100644 --- a/src/test/resources/article/api/article_details_response.json +++ b/src/test/resources/article/api/article_details_response.json @@ -7,5 +7,6 @@ "thumbnailImageUrl": "articleThumbnailImageUrl", "keywords": ["keyword"], "createdDate": "2023-12-24T12:33:42.411", - "lastModifiedDate": "2023-12-24T12:34:51.182" + "lastModifiedDate": "2023-12-24T12:34:51.182", + "hidden": true } \ No newline at end of file diff --git a/src/test/resources/article/api/create_article_request.json b/src/test/resources/article/api/create_article_request.json index a7838d1..8ff3616 100644 --- a/src/test/resources/article/api/create_article_request.json +++ b/src/test/resources/article/api/create_article_request.json @@ -4,5 +4,6 @@ "content": "articleContent", "categoryId": "articleCategoryId", "thumbnailImageUrl": "articleThumbnailImageUrl", - "keywords": ["keyword"] + "keywords": ["keyword"], + "hidden": true } \ No newline at end of file diff --git a/src/test/resources/article/api/edit_article_request.json b/src/test/resources/article/api/edit_article_request.json index 6f173de..5e84763 100644 --- a/src/test/resources/article/api/edit_article_request.json +++ b/src/test/resources/article/api/edit_article_request.json @@ -4,5 +4,6 @@ "content": "updatedArticleContent", "categoryId": "updatedArticleCategoryId", "thumbnailImageUrl": "updatedArticleThumbnailImageUrl", - "keywords": ["updatedArticleKeyword"] + "keywords": ["updatedArticleKeyword"], + "hidden": true } \ No newline at end of file