diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7277c2b54c..ac94192ae5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,7 +5,7 @@ on: push: branches: - main - - 'pr**' + - pr* jobs: CI: runs-on: ubuntu-latest diff --git a/.github/workflows/push-pr.yml b/.github/workflows/push-pr.yml index 5a293fb19b..4c4cceec2e 100644 --- a/.github/workflows/push-pr.yml +++ b/.github/workflows/push-pr.yml @@ -1,4 +1,5 @@ name: push-pr +run-name: Create/Update pr${{ inputs.prNumber }} branch on: workflow_dispatch: inputs: diff --git a/common-lib/src/main/scala/com/gu/mediaservice/lib/elasticsearch/MappingTest.scala b/common-lib/src/main/scala/com/gu/mediaservice/lib/elasticsearch/MappingTest.scala index 0f27e25963..022e63ce0b 100644 --- a/common-lib/src/main/scala/com/gu/mediaservice/lib/elasticsearch/MappingTest.scala +++ b/common-lib/src/main/scala/com/gu/mediaservice/lib/elasticsearch/MappingTest.scala @@ -175,7 +175,8 @@ object MappingTest { composerUrl = Some(new URI("https://composer/api/2345678987654321345678")) )), syndicationUsageMetadata = Some(SyndicationUsageMetadata( - partnerName = "friends of ours" + partnerName = "friends of ours", + syndicatedBy = Some("Bob") )), frontUsageMetadata = Some(FrontUsageMetadata( addedBy = "me", diff --git a/common-lib/src/main/scala/com/gu/mediaservice/lib/elasticsearch/Mappings.scala b/common-lib/src/main/scala/com/gu/mediaservice/lib/elasticsearch/Mappings.scala index ff5d86e755..0b126e1839 100644 --- a/common-lib/src/main/scala/com/gu/mediaservice/lib/elasticsearch/Mappings.scala +++ b/common-lib/src/main/scala/com/gu/mediaservice/lib/elasticsearch/Mappings.scala @@ -281,7 +281,8 @@ object Mappings { )) def syndicationUsageMetadata(name: String): ObjectField = nonDynamicObjectField(name).copy(properties = Seq( - keywordField("partnerName") + keywordField("partnerName"), + keywordField("syndicatedBy") )) def frontUsageMetadata(name: String): ObjectField = nonDynamicObjectField(name).copy(properties = Seq( @@ -293,7 +294,7 @@ object Mappings { keywordField("downloadedBy") )) - def usagesMapping(name: String): NestedField = nestedField(name).copy( properties = Seq( + def usagesMapping(name: String): NestedField = nestedField(name).copy(properties = Seq( keywordField("id"), sStemmerAnalysed("title"), usageReference("references"), diff --git a/common-lib/src/main/scala/com/gu/mediaservice/lib/usage/ItemToMediaUsage.scala b/common-lib/src/main/scala/com/gu/mediaservice/lib/usage/ItemToMediaUsage.scala index c7fdf7bb69..dc9a84100d 100644 --- a/common-lib/src/main/scala/com/gu/mediaservice/lib/usage/ItemToMediaUsage.scala +++ b/common-lib/src/main/scala/com/gu/mediaservice/lib/usage/ItemToMediaUsage.scala @@ -1,7 +1,6 @@ package com.gu.mediaservice.lib.usage import java.net.URI - import com.amazonaws.services.dynamodbv2.document.Item import com.gu.mediaservice.model.usage._ import org.joda.time.DateTime @@ -52,7 +51,8 @@ object ItemToMediaUsage { private def buildSyndication(metadataMap: Map[String, Any]): Option[SyndicationUsageMetadata] = { Try { SyndicationUsageMetadata( - metadataMap("partnerName").asInstanceOf[String] + metadataMap("partnerName").asInstanceOf[String], + metadataMap.get("syndicatedBy").map(x => x.asInstanceOf[String]) ) }.toOption } diff --git a/common-lib/src/main/scala/com/gu/mediaservice/lib/usage/UsageBuilder.scala b/common-lib/src/main/scala/com/gu/mediaservice/lib/usage/UsageBuilder.scala index d015333dea..4d422309f8 100644 --- a/common-lib/src/main/scala/com/gu/mediaservice/lib/usage/UsageBuilder.scala +++ b/common-lib/src/main/scala/com/gu/mediaservice/lib/usage/UsageBuilder.scala @@ -64,7 +64,7 @@ object UsageBuilder { private def buildSyndicationUsageReference(usage: MediaUsage): List[UsageReference] = usage.syndicationUsageMetadata.map (metadata => { List( UsageReference( - SyndicationUsageReference, None, Some(metadata.partnerName) + SyndicationUsageReference, None, metadata.syndicatedBy.map(_ => s"${metadata.partnerName}, ${metadata.syndicatedBy.get}").orElse(Some(metadata.partnerName)) ) ) }).getOrElse( diff --git a/common-lib/src/main/scala/com/gu/mediaservice/model/ThrallMessage.scala b/common-lib/src/main/scala/com/gu/mediaservice/model/ThrallMessage.scala index 40a8bfc8a6..41370db7d5 100644 --- a/common-lib/src/main/scala/com/gu/mediaservice/model/ThrallMessage.scala +++ b/common-lib/src/main/scala/com/gu/mediaservice/model/ThrallMessage.scala @@ -76,6 +76,7 @@ object ExternalThrallMessage{ implicit val updateImagePhotoshootMetadataMessage = Json.format[UpdateImagePhotoshootMetadataMessage] implicit val deleteUsagesMessage = Json.format[DeleteUsagesMessage] implicit val deleteSingleUsageMessage = Json.format[DeleteSingleUsageMessage] + implicit val updateUsageStatusMessage = Json.format[UpdateUsageStatusMessage] implicit val updateImageUsagesMessage = Json.format[UpdateImageUsagesMessage] implicit val addImageLeaseMessage = Json.format[AddImageLeaseMessage] implicit val removeImageLeaseMessage = Json.format[RemoveImageLeaseMessage] @@ -124,6 +125,8 @@ case class DeleteSingleUsageMessage(id: String, lastModified: DateTime, usageId: case class DeleteUsagesMessage(id: String, lastModified: DateTime) extends ExternalThrallMessage +case class UpdateUsageStatusMessage(id: String, usageNotice: UsageNotice, lastModified: DateTime) extends ExternalThrallMessage + object DeleteUsagesMessage { implicit val yourJodaDateReads = JodaReads.DefaultJodaDateTimeReads.map(d => d.withZone(DateTimeZone.UTC)) implicit val yourJodaDateWrites = JodaWrites.JodaDateTimeWrites diff --git a/common-lib/src/main/scala/com/gu/mediaservice/model/usage/SyndicationUsageMetadata.scala b/common-lib/src/main/scala/com/gu/mediaservice/model/usage/SyndicationUsageMetadata.scala index 4ede81dd58..2804b82884 100644 --- a/common-lib/src/main/scala/com/gu/mediaservice/model/usage/SyndicationUsageMetadata.scala +++ b/common-lib/src/main/scala/com/gu/mediaservice/model/usage/SyndicationUsageMetadata.scala @@ -3,11 +3,12 @@ package com.gu.mediaservice.model.usage import play.api.libs.json._ case class SyndicationUsageMetadata( - partnerName: String + partnerName: String, + syndicatedBy: Option[String] = None ) extends UsageMetadata { override def toMap: Map[String, Any] = Map( "partnerName" -> partnerName - ) + ) ++ syndicatedBy.map("syndicatedBy" -> _) } object SyndicationUsageMetadata { diff --git a/common-lib/src/main/scala/com/gu/mediaservice/model/usage/UsageStatus.scala b/common-lib/src/main/scala/com/gu/mediaservice/model/usage/UsageStatus.scala index cbafb45fe7..3a356c1634 100644 --- a/common-lib/src/main/scala/com/gu/mediaservice/model/usage/UsageStatus.scala +++ b/common-lib/src/main/scala/com/gu/mediaservice/model/usage/UsageStatus.scala @@ -9,6 +9,7 @@ sealed trait UsageStatus { case RemovedUsageStatus => "removed" case SyndicatedUsageStatus => "syndicated" case DownloadedUsageStatus => "downloaded" + case FailedUsageStatus => "failed" case UnknownUsageStatus => "unknown" } } @@ -20,7 +21,9 @@ object UsageStatus { case "removed" => RemovedUsageStatus case "syndicated" => SyndicatedUsageStatus case "downloaded" => DownloadedUsageStatus + case "failed" => FailedUsageStatus case "unknown" => UnknownUsageStatus + case _ => throw new IllegalArgumentException("Invalid usage status") } implicit val reads: Reads[UsageStatus] = JsPath.read[String].map(UsageStatus(_)) @@ -35,6 +38,7 @@ object PublishedUsageStatus extends UsageStatus object RemovedUsageStatus extends UsageStatus object SyndicatedUsageStatus extends UsageStatus object DownloadedUsageStatus extends UsageStatus +object FailedUsageStatus extends UsageStatus // For Fronts usages as we don't know if a front is in draft or is live // TODO remove this once we do! diff --git a/common-lib/src/main/scala/com/gu/mediaservice/syntax/MessageSubjects.scala b/common-lib/src/main/scala/com/gu/mediaservice/syntax/MessageSubjects.scala index 8713d58a4a..a490f427f5 100644 --- a/common-lib/src/main/scala/com/gu/mediaservice/syntax/MessageSubjects.scala +++ b/common-lib/src/main/scala/com/gu/mediaservice/syntax/MessageSubjects.scala @@ -16,6 +16,7 @@ trait MessageSubjects { val AddImageLease = "add-image-lease" val RemoveImageLease = "remove-image-lease" val SetImageCollections = "set-image-collections" + val UpdateUsageStatus = "update-usage-status" val DeleteUsages = "delete-usages" val DeleteSingleUsage = "delete-single-usage" val UpdateImageSyndicationMetadata = "update-image-syndication-metadata" diff --git a/kahuna/public/js/components/gr-image-metadata/gr-image-metadata.html b/kahuna/public/js/components/gr-image-metadata/gr-image-metadata.html index 11fb29cdbe..ffe0d8c7bd 100644 --- a/kahuna/public/js/components/gr-image-metadata/gr-image-metadata.html +++ b/kahuna/public/js/components/gr-image-metadata/gr-image-metadata.html @@ -104,6 +104,7 @@
{{ctrl.metadata.title}}
@@ -112,6 +113,7 @@
{{ctrl.metadata.title}}
@@ -322,6 +324,7 @@ {{ctrl.metadata.byline}} @@ -370,6 +373,7 @@ {{ctrl.metadata.credit}} @@ -400,6 +404,7 @@ {{ctrl.metadata[prop]}}