From 65a98ed26b10c0fd3d9a2e56882be076c42fc38f Mon Sep 17 00:00:00 2001
From: Katrine Wist <katrinew0702@gmail.com>
Date: Mon, 16 Dec 2024 10:04:15 +0100
Subject: [PATCH] Disclaimer is optional

---
 .../scala/no/ndla/articleapi/TestData.scala   | 10 +++----
 .../common/model/domain/article/Article.scala |  2 +-
 .../common/model/domain/draft/Draft.scala     |  2 +-
 .../draftapi/service/ConverterService.scala   | 29 +++++++++++--------
 .../scala/no/ndla/draftapi/TestData.scala     |  8 ++---
 .../service/ConverterServiceTest.scala        | 14 ++++-----
 .../service/StateTransitionRulesTest.scala    | 12 ++++----
 7 files changed, 41 insertions(+), 36 deletions(-)

diff --git a/article-api/src/test/scala/no/ndla/articleapi/TestData.scala b/article-api/src/test/scala/no/ndla/articleapi/TestData.scala
index 4f401dc602..5570aeba3f 100644
--- a/article-api/src/test/scala/no/ndla/articleapi/TestData.scala
+++ b/article-api/src/test/scala/no/ndla/articleapi/TestData.scala
@@ -153,7 +153,7 @@ trait TestData {
       relatedContent = Seq.empty,
       revisionDate = Some(NDLADate.now().withNano(0)),
       slug = None,
-      disclaimer = Seq.empty
+      disclaimer = None
     )
 
     val sampleDomainArticle: Article = Article(
@@ -179,7 +179,7 @@ trait TestData {
       relatedContent = Seq.empty,
       revisionDate = None,
       slug = None,
-      disclaimer = Seq.empty
+      disclaimer = None
     )
 
     val sampleDomainArticle2: Article = Article(
@@ -205,7 +205,7 @@ trait TestData {
       relatedContent = Seq.empty,
       revisionDate = None,
       slug = None,
-      disclaimer = Seq.empty
+      disclaimer = None
     )
 
     val sampleArticleWithByNcSa: Article      = sampleArticleWithPublicDomain.copy(copyright = byNcSaCopyright)
@@ -243,7 +243,7 @@ trait TestData {
       relatedContent = Seq.empty,
       revisionDate = None,
       slug = None,
-      disclaimer = Seq.empty
+      disclaimer = None
     )
 
     val apiArticleWithHtmlFaultV2: api.ArticleV2DTO = api.ArticleV2DTO(
@@ -313,7 +313,7 @@ trait TestData {
         relatedContent = Seq.empty,
         revisionDate = None,
         slug = None,
-        disclaimer = Seq.empty
+        disclaimer = None
       )
     }
 
diff --git a/common/src/main/scala/no/ndla/common/model/domain/article/Article.scala b/common/src/main/scala/no/ndla/common/model/domain/article/Article.scala
index 3d060e711e..f41cf62204 100644
--- a/common/src/main/scala/no/ndla/common/model/domain/article/Article.scala
+++ b/common/src/main/scala/no/ndla/common/model/domain/article/Article.scala
@@ -37,7 +37,7 @@ case class Article(
     relatedContent: Seq[RelatedContent],
     revisionDate: Option[NDLADate],
     slug: Option[String],
-    disclaimer: Seq[Disclaimer]
+    disclaimer: Option[Seq[Disclaimer]]
 ) extends Content
 
 object Article {
diff --git a/common/src/main/scala/no/ndla/common/model/domain/draft/Draft.scala b/common/src/main/scala/no/ndla/common/model/domain/draft/Draft.scala
index 31100c127a..e4f3cce33a 100644
--- a/common/src/main/scala/no/ndla/common/model/domain/draft/Draft.scala
+++ b/common/src/main/scala/no/ndla/common/model/domain/draft/Draft.scala
@@ -46,7 +46,7 @@ case class Draft(
     priority: Priority,
     started: Boolean,
     qualityEvaluation: Option[QualityEvaluation],
-    disclaimer: Seq[Disclaimer]
+    disclaimer: Option[Seq[Disclaimer]]
 ) extends Content {
 
   def supportedLanguages: Seq[String] =
diff --git a/draft-api/src/main/scala/no/ndla/draftapi/service/ConverterService.scala b/draft-api/src/main/scala/no/ndla/draftapi/service/ConverterService.scala
index a4755572b9..3150ae0780 100644
--- a/draft-api/src/main/scala/no/ndla/draftapi/service/ConverterService.scala
+++ b/draft-api/src/main/scala/no/ndla/draftapi/service/ConverterService.scala
@@ -55,7 +55,7 @@ trait ConverterService {
       val domainContent = newArticle.content
         .map(content => common.ArticleContent(removeUnknownEmbedTagAttribute(content), newArticle.language))
         .toSeq
-      val domainDisclaimer = Seq(common.Disclaimer(newArticle.disclaimer.getOrElse(""), newArticle.language))
+      val domainDisclaimer = newArticle.disclaimer.map { d => Seq(common.Disclaimer(d, newArticle.language)) }
 
       val status = externalIds match {
         case Nil => common.Status(PLANNED, Set.empty)
@@ -391,7 +391,8 @@ trait ConverterService {
         val metaImage      = findByLanguageOrBestEffort(article.metaImage, language).map(toApiArticleMetaImage)
         val revisionMetas  = article.revisionMeta.map(toApiRevisionMeta)
         val responsible    = article.responsible.map(toApiResponsible)
-        val disclaimer     = findByLanguageOrBestEffort((article.disclaimer), language).map(toApiArticleDisclaimer)
+        val disclaimer =
+          article.disclaimer.flatMap { d => findByLanguageOrBestEffort(d, language).map(toApiArticleDisclaimer) }
 
         Success(
           api.ArticleDTO(
@@ -460,7 +461,7 @@ trait ConverterService {
     def toApiArticleTitle(title: common.Title): api.ArticleTitleDTO =
       api.ArticleTitleDTO(Jsoup.parseBodyFragment(title.title).body().text(), title.title, title.language)
 
-    def toApiArticleDisclaimer(disclaimer: common.Disclaimer): api.DisclaimerDTO =
+    private def toApiArticleDisclaimer(disclaimer: common.Disclaimer): api.DisclaimerDTO =
       api.DisclaimerDTO(
         disclaimer.disclaimer,
         disclaimer.language
@@ -795,14 +796,18 @@ trait ConverterService {
           .traverse(lang => articleWithNewContent.title.toSeq.map(t => toDomainTitle(api.ArticleTitleDTO(t, t, lang))))
           .flatten
       )
-      val updatedDisclaimer = mergeLanguageFields(
-        toMergeInto.disclaimer,
-        maybeLang
-          .traverse(lang =>
-            articleWithNewContent.disclaimer.toSeq.map(d => toDomainDisclaimer(api.DisclaimerDTO(d, lang)))
-          )
-          .flatten
-      )
+
+      val updatedDisclaimer = toMergeInto.disclaimer.map { disclaimer =>
+        mergeLanguageFields(
+          disclaimer,
+          maybeLang
+            .traverse(lang =>
+              articleWithNewContent.disclaimer.toSeq.map(d => toDomainDisclaimer(api.DisclaimerDTO(d, lang)))
+            )
+            .flatten
+        )
+      }
+
       val updatedContents = mergeLanguageFields(
         toMergeInto.content,
         maybeLang
@@ -957,7 +962,7 @@ trait ConverterService {
           priority = priority,
           started = false,
           qualityEvaluation = qualityEvaluationToDomain(article.qualityEvaluation),
-          disclaimer = article.disclaimer.map(d => common.Disclaimer(d, lang)).toSeq
+          disclaimer = article.disclaimer.map { d => Seq(common.Disclaimer(d, lang)) }
         )
     }
 
diff --git a/draft-api/src/test/scala/no/ndla/draftapi/TestData.scala b/draft-api/src/test/scala/no/ndla/draftapi/TestData.scala
index ef879f8abe..27054f7a17 100644
--- a/draft-api/src/test/scala/no/ndla/draftapi/TestData.scala
+++ b/draft-api/src/test/scala/no/ndla/draftapi/TestData.scala
@@ -322,7 +322,7 @@ object TestData {
     Priority.Unspecified,
     false,
     None,
-    Seq.empty
+    None
   )
 
   val sampleArticleWithPublicDomain: Draft = Draft(
@@ -357,7 +357,7 @@ object TestData {
     Priority.Unspecified,
     false,
     None,
-    Seq.empty
+    None
   )
 
   val sampleDomainArticle: Draft = Draft(
@@ -394,7 +394,7 @@ object TestData {
     Priority.Unspecified,
     false,
     None,
-    Seq.empty
+    None
   )
 
   val newArticle: NewArticleDTO = api.NewArticleDTO(
@@ -485,7 +485,7 @@ object TestData {
     priority = Priority.Unspecified,
     started = false,
     qualityEvaluation = None,
-    disclaimer = Seq.empty
+    disclaimer = None
   )
 
   val apiArticleWithHtmlFaultV2: api.ArticleDTO = api.ArticleDTO(
diff --git a/draft-api/src/test/scala/no/ndla/draftapi/service/ConverterServiceTest.scala b/draft-api/src/test/scala/no/ndla/draftapi/service/ConverterServiceTest.scala
index 9150be30f4..3b4c02ecf5 100644
--- a/draft-api/src/test/scala/no/ndla/draftapi/service/ConverterServiceTest.scala
+++ b/draft-api/src/test/scala/no/ndla/draftapi/service/ConverterServiceTest.scala
@@ -333,7 +333,7 @@ class ConverterServiceTest extends UnitSuite with TestEnvironment {
       priority = Priority.Unspecified,
       started = false,
       qualityEvaluation = None,
-      disclaimer = Seq(Disclaimer("Disclaimer test", "nb"))
+      disclaimer = Some(Seq(Disclaimer("Disclaimer test", "nb")))
     )
 
     val updatedNothing = TestData.blankUpdatedArticle.copy(
@@ -381,7 +381,7 @@ class ConverterServiceTest extends UnitSuite with TestEnvironment {
       priority = Priority.Unspecified,
       started = false,
       qualityEvaluation = None,
-      disclaimer = Seq(Disclaimer("Disclaimer test", "nb"))
+      disclaimer = Some(Seq(Disclaimer("Disclaimer test", "nb")))
     )
 
     val expectedArticle = Draft(
@@ -416,7 +416,7 @@ class ConverterServiceTest extends UnitSuite with TestEnvironment {
       priority = Priority.Unspecified,
       started = false,
       qualityEvaluation = None,
-      disclaimer = Seq(Disclaimer("NyDisclaimer test", "nb"))
+      disclaimer = Some(Seq(Disclaimer("NyDisclaimer test", "nb")))
     )
 
     val updatedEverything = TestData.blankUpdatedArticle.copy(
@@ -482,7 +482,7 @@ class ConverterServiceTest extends UnitSuite with TestEnvironment {
       priority = Priority.Unspecified,
       started = false,
       qualityEvaluation = None,
-      disclaimer = Seq.empty
+      disclaimer = None
     )
 
     val expectedArticle = Draft(
@@ -525,7 +525,7 @@ class ConverterServiceTest extends UnitSuite with TestEnvironment {
       priority = Priority.Unspecified,
       started = false,
       qualityEvaluation = None,
-      disclaimer = Seq.empty
+      disclaimer = None
     )
 
     val updatedEverything = TestData.blankUpdatedArticle.copy(
@@ -1127,7 +1127,7 @@ class ConverterServiceTest extends UnitSuite with TestEnvironment {
       priority = Priority.Unspecified,
       started = false,
       qualityEvaluation = None,
-      disclaimer = Seq(Disclaimer("articleDisclaimer", "nb"))
+      disclaimer = Some(Seq(Disclaimer("articleDisclaimer", "nb")))
     )
     val article = common.model.domain.article.Article(
       id = Some(articleId),
@@ -1153,7 +1153,7 @@ class ConverterServiceTest extends UnitSuite with TestEnvironment {
       relatedContent = Seq.empty,
       revisionDate = None,
       slug = Some("kjempe-slug"),
-      disclaimer = Seq(Disclaimer("articleDisclaimer", "nb"))
+      disclaimer = Some(Seq(Disclaimer("articleDisclaimer", "nb")))
     )
 
     val result = service.toArticleApiArticle(draft)
diff --git a/draft-api/src/test/scala/no/ndla/draftapi/service/StateTransitionRulesTest.scala b/draft-api/src/test/scala/no/ndla/draftapi/service/StateTransitionRulesTest.scala
index a1e17f1369..bbad36f927 100644
--- a/draft-api/src/test/scala/no/ndla/draftapi/service/StateTransitionRulesTest.scala
+++ b/draft-api/src/test/scala/no/ndla/draftapi/service/StateTransitionRulesTest.scala
@@ -356,7 +356,7 @@ class StateTransitionRulesTest extends UnitSuite with TestEnvironment {
       priority = Priority.Unspecified,
       started = false,
       qualityEvaluation = None,
-      disclaimer = Seq.empty
+      disclaimer = None
     )
     val article = common.article.Article(
       id = Some(articleId),
@@ -381,7 +381,7 @@ class StateTransitionRulesTest extends UnitSuite with TestEnvironment {
       relatedContent = Seq.empty,
       revisionDate = None,
       slug = None,
-      disclaimer = Seq.empty
+      disclaimer = None
     )
     val status = common.Status(END_CONTROL, Set.empty)
 
@@ -479,7 +479,7 @@ class StateTransitionRulesTest extends UnitSuite with TestEnvironment {
       priority = Priority.Unspecified,
       started = false,
       qualityEvaluation = None,
-      disclaimer = Seq.empty
+      disclaimer = None
     )
     val status            = common.Status(PLANNED, Set.empty)
     val transitionsToTest = StateTransitionRules.StateTransitions.filter(_.to == PUBLISHED)
@@ -536,7 +536,7 @@ class StateTransitionRulesTest extends UnitSuite with TestEnvironment {
       priority = Priority.Unspecified,
       started = false,
       qualityEvaluation = None,
-      disclaimer = Seq.empty
+      disclaimer = None
     )
     val status            = common.Status(PLANNED, Set.empty)
     val transitionsToTest = StateTransitionRules.StateTransitions.filter(_.to == ARCHIVED)
@@ -597,7 +597,7 @@ class StateTransitionRulesTest extends UnitSuite with TestEnvironment {
       priority = Priority.Unspecified,
       started = false,
       qualityEvaluation = None,
-      disclaimer = Seq.empty
+      disclaimer = None
     )
     val status            = common.Status(PLANNED, Set.empty)
     val transitionsToTest = StateTransitionRules.StateTransitions.filter(_.to == UNPUBLISHED)
@@ -659,7 +659,7 @@ class StateTransitionRulesTest extends UnitSuite with TestEnvironment {
       priority = Priority.Unspecified,
       started = false,
       qualityEvaluation = None,
-      disclaimer = Seq.empty
+      disclaimer = None
     )
     val status                            = common.Status(PUBLISHED, Set.empty)
     val transitionToTest: StateTransition = PUBLISHED -> IN_PROGRESS