/
DeleteListItemsRouteADM.scala
94 lines (81 loc) · 3.28 KB
/
DeleteListItemsRouteADM.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*
* Copyright © 2021 Data and Service Center for the Humanities and/or DaSCH Service Platform contributors.
* SPDX-License-Identifier: Apache-2.0
*/
package org.knora.webapi.routing.admin.lists
import java.util.UUID
import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.server.{PathMatcher, Route}
import org.knora.webapi.exceptions.BadRequestException
import org.knora.webapi.feature.{Feature, FeatureFactoryConfig}
import org.knora.webapi.messages.admin.responder.listsmessages._
import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilADM}
import scala.concurrent.Future
object DeleteListItemsRouteADM {
val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists")
}
/**
* A [[Feature]] that provides routes to delete list items.
*
* @param routeData the [[KnoraRouteData]] to be used in constructing the route.
*/
class DeleteListItemsRouteADM(routeData: KnoraRouteData)
extends KnoraRoute(routeData)
with Feature
with Authenticator
with ListADMJsonProtocol {
import DeleteListItemsRouteADM._
def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route =
deleteListItem(featureFactoryConfig) ~
canDeleteList(featureFactoryConfig)
/* delete list (i.e. root node) or a child node which should also delete its children */
private def deleteListItem(featureFactoryConfig: FeatureFactoryConfig): Route = path(ListsBasePath / Segment) { iri =>
delete {
/* delete a list item root node or child if unused */
requestContext =>
val nodeIri =
stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid list item Iri: $iri"))
val requestMessage: Future[ListItemDeleteRequestADM] = for {
requestingUser <- getUserADM(requestContext, featureFactoryConfig)
} yield ListItemDeleteRequestADM(
nodeIri = nodeIri,
featureFactoryConfig = featureFactoryConfig,
requestingUser = requestingUser,
apiRequestID = UUID.randomUUID()
)
RouteUtilADM.runJsonRoute(
requestMessageF = requestMessage,
requestContext = requestContext,
featureFactoryConfig = featureFactoryConfig,
settings = settings,
responderManager = responderManager,
log = log
)
}
}
/**
* Checks if a list can be deleted (none of its nodes is used in data).
*/
private def canDeleteList(featureFactoryConfig: FeatureFactoryConfig): Route =
path(ListsBasePath / "candelete" / Segment) { iri =>
get { requestContext =>
val listIri =
stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid list IRI: $iri"))
val requestMessage: Future[CanDeleteListRequestADM] = for {
requestingUser <- getUserADM(requestContext, featureFactoryConfig)
} yield CanDeleteListRequestADM(
iri = listIri,
featureFactoryConfig = featureFactoryConfig,
requestingUser = requestingUser
)
RouteUtilADM.runJsonRoute(
requestMessageF = requestMessage,
requestContext = requestContext,
featureFactoryConfig = featureFactoryConfig,
settings = settings,
responderManager = responderManager,
log = log
)
}
}
}