-
Notifications
You must be signed in to change notification settings - Fork 0
/
Service.scala
129 lines (118 loc) · 4.84 KB
/
Service.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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/**
* Copyright 2017 Interel
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package controllers
import javax.inject.{Inject, Singleton}
import akka.util.Timeout
import core3.config.StaticConfig
import core3.core.ComponentManager
import core3.database.dals.DatabaseAbstractionLayer
import core3.http.controllers.local.ServiceController
import core3.http.handlers
import core3.http.responses.GenericResult
import core3.security.{LocalAuthUserToken, UserTokenBase}
import core3.workflows.{WorkflowBase, WorkflowEngine, WorkflowRequest}
import play.api.{Environment, Logger}
import play.api.cache.SyncCacheApi
import play.api.libs.json.Json
import play.api.mvc._
import scala.concurrent.{ExecutionContext, Future}
import scala.concurrent.duration._
@Singleton
class Service @Inject()(db: DatabaseAbstractionLayer, cache: SyncCacheApi, engine: WorkflowEngine, workflows: Vector[WorkflowBase], manager: ComponentManager)
(implicit environment: Environment, ec: ExecutionContext)
extends ServiceController(cache, StaticConfig.get.getConfig("security.authentication.clients.LocalEngineExample"), db) {
private val auditLogger = Logger("core3-example-audit")
implicit private val timeout = Timeout(StaticConfig.get.getInt("manager.requestTimeout").seconds)
def users() = UserAwareAction(
"exec:asUser",
(request: Request[AnyContent], user: UserTokenBase) => {
request.body.asJson match {
case Some(httpRequest) =>
(for {
workflowRequest <- Future {
httpRequest.as[WorkflowRequest]
}
workflowResult <- engine.executeWorkflow(
workflowRequest.workflowName,
workflowRequest.rawParams,
user,
workflowRequest.returnOutputData
)
} yield {
Ok(workflowResult.asJson)
}).recover {
case e =>
val message = s"Exception encountered while processing request: [${e.getMessage}]."
auditLogger.error(s"controllers.Service::asUser > $message")
InternalServerError(GenericResult(wasSuccessful = false, Some(message)).asJson)
}
case None =>
val message =
request.contentType match {
case Some(contentType) => s"Unexpected request content type received: [$contentType]."
case None => s"Failed to determine request content type."
}
auditLogger.error(s"controllers.UsersService::asUser > $message")
Future.successful(BadRequest(GenericResult(wasSuccessful = false, Some(message)).asJson))
}
}
)
def clients() = ClientAwareAction(
"exec:asClient",
(request: Request[AnyContent], clientID: String) => {
request.body.asJson match {
case Some(httpRequest) =>
(for {
workflowRequest <- Future {
httpRequest.as[WorkflowRequest]
}
workflowResult <- engine.executeWorkflow(
workflowRequest.workflowName,
workflowRequest.rawParams,
LocalAuthUserToken(
userID = clientID,
permissions = workflows.map(_.name), //Warning: allows the client to execute any workflow
profile = Json.obj(),
sessionToken = "None"
),
workflowRequest.returnOutputData
)
} yield {
Ok(workflowResult.asJson)
}).recover {
case e =>
val message = s"Exception encountered while processing request: [${e.getMessage}]."
auditLogger.error(s"controllers.Service::asClient > $message")
InternalServerError(GenericResult(wasSuccessful = false, Some(message)).asJson)
}
case None =>
val message =
request.contentType match {
case Some(contentType) => s"Unexpected request content type received: [$contentType]."
case None => s"Failed to determine request content type."
}
auditLogger.error(s"controllers.UsersService::asClient > $message")
Future.successful(BadRequest(GenericResult(wasSuccessful = false, Some(message)).asJson))
}
}
)
def manage() = ClientAwareAction(
"exec:manage",
(request: Request[AnyContent], _) => {
handlers.JSON.management(manager.getRef, auditLogger, request)
}
)
}