/
ProjectsRouteZ.scala
62 lines (55 loc) · 2.39 KB
/
ProjectsRouteZ.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
package org.knora.webapi.routing.admin
import akka.actor.ActorRef
import akka.pattern.ask
import akka.util.Timeout
import zhttp.http._
import zio.ZIO
import zio.ZLayer
import java.net.URLDecoder
import dsp.errors.BadRequestException
import dsp.errors.InternalServerException
import dsp.errors.KnoraException
import dsp.errors.RequestRejectedException
import org.knora.webapi.config.AppConfig
import org.knora.webapi.core.AppRouter
import org.knora.webapi.http.handler.ExceptionHandlerZ
import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectGetRequestADM
import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectGetResponseADM
import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM
import org.knora.webapi.messages.util.KnoraSystemInstances
final case class ProjectsRouteZ(router: AppRouter, appConfig: AppConfig) {
implicit val sender: ActorRef = router.ref
implicit val timeout: Timeout = appConfig.defaultTimeoutAsDuration
def getProjectByIri(iri: String): ZIO[Any, KnoraException, Response] =
for {
user <- ZIO.succeed(KnoraSystemInstances.Users.SystemUser)
iriDecoded <-
ZIO
.attempt(URLDecoder.decode(iri, "utf-8"))
.orElseFail(BadRequestException(s"Failed to decode IRI $iri"))
iriValue <- ProjectIdentifierADM.IriIdentifier
.fromString(iriDecoded)
.toZIO
message = ProjectGetRequestADM(identifier = iriValue, requestingUser = user)
response <- ZIO.fromFuture(_ => router.ref.ask(message)).map(_.asInstanceOf[ProjectGetResponseADM]).orDie
} yield Response.json(response.toJsValue.toString())
val route: HttpApp[Any, Nothing] =
(Http
.collectZIO[Request] {
// TODO : Add user authentication, make tests run with the new route
// Returns a single project identified through the IRI.
case Method.GET -> !! / "admin" / "projects" / "iri" / iri =>
getProjectByIri(iri)
})
.catchAll {
case RequestRejectedException(e) =>
ExceptionHandlerZ.exceptionToJsonHttpResponseZ(e, appConfig)
case InternalServerException(e) =>
ExceptionHandlerZ.exceptionToJsonHttpResponseZ(e, appConfig)
}
}
object ProjectsRouteZ {
val layer: ZLayer[AppRouter with AppConfig, Nothing, ProjectsRouteZ] = ZLayer.fromFunction { (router, config) =>
ProjectsRouteZ(router, config)
}
}