Skip to content

Commit 7ff4db4

Browse files
committed
Updating the domainMetadata to allow introduction of 'key' field to allow search link to be included. Addition of force soft delete endpoint for use with Capture.
1 parent feffdeb commit 7ff4db4

5 files changed

Lines changed: 43 additions & 1 deletion

File tree

common-lib/src/main/scala/com/gu/mediaservice/lib/config/CommonConfig.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ abstract class CommonConfig(resources: GridConfigResources) extends AwsClientV1B
9191
* {
9292
* name = "field-a"
9393
* label = "Field A"
94+
* key = "Search field key for A" (optional)
9495
* type = "string" # type can either be string, integer, select or datetime
9596
* }
9697
* {

common-lib/src/main/scala/com/gu/mediaservice/lib/config/DomainMetadataSpec.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import scala.jdk.CollectionConverters._
88
case class DomainMetadataField(
99
name: String,
1010
label: String,
11+
key: Option[String] = None,
1112
fieldType: String,
1213
options: Option[List[String]] = None
1314
)
@@ -32,10 +33,12 @@ object DomainMetadataSpec {
3233
val description = if (config.hasPath("description")) Some(config.getString("description")) else None
3334
val fields = config.getConfigList("fields").asScala.map(config => {
3435
val fieldOptions = if (config.hasPath("options")) Some(config.getStringList("options").asScala.toList) else None
36+
val key = if (config.hasPath("key")) Some(config.getString("key")) else None
3537

3638
DomainMetadataField(
3739
config.getString("name"),
3840
config.getString("label"),
41+
key,
3942
config.getString("type"),
4043
fieldOptions
4144
)

kahuna/public/js/components/gr-image-metadata/gr-image-metadata.html

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -804,7 +804,16 @@
804804
e:form="domainMetadataEditForm">
805805

806806
<span ng-if="specField.value">
807-
{{specField.value}}
807+
<span ng-if="specField.key">
808+
<a ui-sref="search.results({query: specField.value, nonFree: ctrl.srefNonfree()})"
809+
ng-click="ctrl.searchWithModifiers($event, specField.key , specField.value)"
810+
aria-label="Search images with '{{specField.value}}'">
811+
{{specField.value}}
812+
</a>
813+
</span>
814+
<span ng-if="!specField.key">
815+
{{specField.value}}
816+
</span>
808817
</span>
809818
<span class="editable-empty" ng-if="! specField.value && ctrl.userCanEdit">
810819
Unknown (click ✎ to add)

media-api/app/controllers/MediaApi.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,34 @@ class MediaApi(
313313
}
314314
}
315315

316+
def forceDeleteImage(id: String) = auth.async { request =>
317+
implicit val r: Request[AnyContent] = request
318+
elasticSearch.getImageById(id) map {
319+
case Some(image) if hasPermission(request.user, image) =>
320+
val canDelete = authorisation.isUploaderOrHasPermission(request.user, image.uploadedBy, DeleteImagePermission)
321+
if(canDelete){
322+
val imageStatusRecord = ImageStatusRecord(id, request.user.accessor.identity, DateTime.now(DateTimeZone.UTC).toString, true)
323+
softDeletedMetadataTable.setStatus(imageStatusRecord)
324+
.map { _ =>
325+
messageSender.publish(
326+
UpdateMessage(
327+
subject = SoftDeleteImage,
328+
id = Some(id),
329+
softDeletedMetadata = Some(SoftDeletedMetadata(
330+
deleteTime = DateTime.now(DateTimeZone.UTC),
331+
deletedBy = request.user.accessor.identity
332+
))
333+
)
334+
)
335+
}
336+
Accepted
337+
} else {
338+
ImageDeleteForbidden
339+
}
340+
case _ => ImageNotFound(id)
341+
}
342+
}
343+
316344
def unSoftDeleteImage(id: String) = auth.async { request =>
317345
implicit val r: Request[AnyContent] = request
318346
elasticSearch.getImageById(id) map {

media-api/conf/routes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ GET /images/:imageId/download controllers.
2525
GET /images/:imageId/downloadOptimised controllers.MediaApi.downloadOptimisedImage(imageId: String, width: Int, height: Int, quality: Int)
2626
POST /images/:id/:partnerName/:startPending/syndicateImage controllers.MediaApi.syndicateImage(id: String, partnerName: String, startPending:String)
2727
DELETE /images/:id controllers.MediaApi.deleteImage(id: String)
28+
DELETE /images/:id/force-delete controllers.MediaApi.forceDeleteImage(id: String)
2829
DELETE /images/:id/hard-delete controllers.MediaApi.hardDeleteImage(id: String)
2930
PUT /images/:id/undelete controllers.MediaApi.unSoftDeleteImage(id: String)
3031
GET /images controllers.MediaApi.imageSearch()

0 commit comments

Comments
 (0)