-
Notifications
You must be signed in to change notification settings - Fork 18
/
CreateListItemsRouteADM.scala
112 lines (100 loc) · 4.81 KB
/
CreateListItemsRouteADM.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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
* Copyright © 2021 - 2024 Swiss National 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 org.apache.pekko
import zio.*
import zio.prelude.Validation
import java.util.UUID
import dsp.errors.BadRequestException
import dsp.errors.ForbiddenException
import dsp.errors.ValidationException
import dsp.valueobjects.Iri.*
import dsp.valueobjects.List.*
import dsp.valueobjects.ListErrorMessages
import org.knora.webapi.core.MessageRelay
import org.knora.webapi.messages.StringFormatter
import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListChildNodeCreatePayloadADM
import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListRootNodeCreatePayloadADM
import org.knora.webapi.messages.admin.responder.listsmessages.*
import org.knora.webapi.routing.Authenticator
import org.knora.webapi.routing.KnoraRoute
import org.knora.webapi.routing.KnoraRouteData
import org.knora.webapi.routing.RouteUtilADM.*
import org.knora.webapi.slice.admin.domain.model.KnoraProject.ProjectIri
import pekko.http.scaladsl.server.Directives.*
import pekko.http.scaladsl.server.PathMatcher
import pekko.http.scaladsl.server.Route
/**
* Provides routes to create list items.
*
* @param routeData the [[KnoraRouteData]] to be used in constructing the route.
*/
final case class CreateListItemsRouteADM(
private val routeData: KnoraRouteData,
override protected implicit val runtime: Runtime[Authenticator & StringFormatter & MessageRelay]
) extends KnoraRoute(routeData, runtime)
with ListADMJsonProtocol {
val listsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists")
def makeRoute: Route =
createListRootNode() ~
createListChildNode()
/**
* Creates a new list (root node).
*/
private def createListRootNode(): Route = path(listsBasePath) {
post {
entity(as[ListRootNodeCreateApiRequestADM]) { apiRequest => requestContext =>
val maybeId: Validation[Throwable, Option[ListIri]] = ListIri.make(apiRequest.id)
val projectIri: Validation[Throwable, ProjectIri] =
Validation.fromEither(ProjectIri.from(apiRequest.projectIri)).mapError(ValidationException.apply)
val maybeName: Validation[Throwable, Option[ListName]] = ListName.make(apiRequest.name)
val labels: Validation[Throwable, Labels] = Labels.make(apiRequest.labels)
val comments: Validation[Throwable, Comments] = Comments.make(apiRequest.comments)
val validatedPayload: Validation[Throwable, ListRootNodeCreatePayloadADM] =
Validation.validateWith(maybeId, projectIri, maybeName, labels, comments)(ListRootNodeCreatePayloadADM)
val requestMessage = for {
payload <- validatedPayload.toZIO
user <- Authenticator.getUserADM(requestContext)
_ <-
ZIO
.fail(ForbiddenException(ListErrorMessages.ListCreatePermission))
.when(!user.permissions.isProjectAdmin(payload.projectIri.value) && !user.permissions.isSystemAdmin)
} yield ListRootNodeCreateRequestADM(payload, user, UUID.randomUUID())
runJsonRouteZ(requestMessage, requestContext)
}
}
}
/**
* Creates a new list child node.
*/
private def createListChildNode(): Route = path(listsBasePath / Segment) { iri =>
post {
entity(as[ListChildNodeCreateApiRequestADM]) { apiRequest => requestContext =>
val validatedPayload = for {
_ <- ZIO
.fail(BadRequestException("Route and payload parentNodeIri mismatch."))
.when(iri != apiRequest.parentNodeIri)
parentNodeIri = ListIri.make(apiRequest.parentNodeIri)
id = ListIri.make(apiRequest.id)
projectIri = Validation.fromEither(ProjectIri.from(apiRequest.projectIri)).mapError(ValidationException.apply)
name = ListName.make(apiRequest.name)
position = Position.make(apiRequest.position)
labels = Labels.make(apiRequest.labels)
comments = Comments.make(apiRequest.comments)
} yield Validation.validateWith(id, parentNodeIri, projectIri, name, position, labels, comments)(
ListChildNodeCreatePayloadADM
)
val requestMessage = for {
payload <- validatedPayload.flatMap(_.toZIO)
user <- Authenticator.getUserADM(requestContext)
_ <- ZIO
.fail(ForbiddenException(ListErrorMessages.ListCreatePermission))
.when(!user.permissions.isProjectAdmin(payload.projectIri.value) && !user.permissions.isSystemAdmin)
} yield ListChildNodeCreateRequestADM(payload, user, UUID.randomUUID())
runJsonRouteZ(requestMessage, requestContext)
}
}
}
}