Skip to content

Commit 1c7b7e5

Browse files
committed
Added Worker implementation to 04-worker-c7spring.
1 parent 2de4306 commit 1c7b7e5

File tree

14 files changed

+516
-16
lines changed

14 files changed

+516
-16
lines changed

00-docs/src/docs/company/03-worker.md

Lines changed: 133 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,133 @@
1-
# 03-worker
1+
# 03-worker
2+
Use this to add Company specific Worker stuff like the configuration of the auth method.
3+
4+
@:callout(info)
5+
Workers are a bit more complex as there is a specific implementation you have to provide.
6+
7+
This will hopefully be simplified in the future.
8+
9+
For now, you have to provide a couple of files, as explained below.
10+
@:@
11+
12+
The following structure is generated by `./helperCompany.scala init`:
13+
14+
```bash
15+
03-worker/src
16+
| main/resources
17+
| main/scala/company/worker
18+
| | CompanyEngineContext.scala
19+
| | CompanyPasswordFlow.scala
20+
| | CompanyRestApiClient.scala
21+
| | CompanyWorkerHandler.scala
22+
| test/scala/company/worker
23+
```
24+
25+
## CompanyEngineContext
26+
Depending on the Camunda Engine and Authentication you use, you have to provide the EngineContext.
27+
28+
```scala
29+
package mycompany.camundala.worker
30+
31+
import camundala.camunda7.worker.Camunda7Context
32+
import scala.compiletime.uninitialized
33+
import scala.reflect.ClassTag
34+
35+
@SpringConfiguration
36+
class CompanyEngineContext extends Camunda7Context:
37+
38+
@Autowired()
39+
var restApiClient: CompanyRestApiClient = uninitialized
40+
41+
override def sendRequest[ServiceIn: Encoder, ServiceOut: Decoder: ClassTag](
42+
request: RunnableRequest[ServiceIn]
43+
): SendRequestType[ServiceOut] =
44+
restApiClient.sendRequest(request)
45+
46+
end CompanyEngineContext
47+
```
48+
Basically you override the sendRequest to use your RestApiClient with the specific auth-method.
49+
50+
## CompanyPasswordFlow
51+
Configure the Token Service - this is tested only with Keycloak.
52+
53+
```scala
54+
package mycompany.camundala.worker
55+
56+
import camundala.camunda7.worker.oauth.OAuthPasswordFlow
57+
58+
trait CompanyPasswordFlow extends OAuthPasswordFlow:
59+
60+
lazy val fssoRealm: String = sys.env.getOrElse("FSSO_REALM", "myRealm")
61+
// default is a local keycloak server on colime docker environment
62+
lazy val fssoBaseUrl = sys.env.getOrElse("FSSO_BASE_URL", s"http://host.lima.internal:8090")
63+
64+
override lazy val client_id = sys.env.getOrElse("FSSO_CLIENT_NAME", "myClientKey")
65+
override lazy val client_secret = sys.env.getOrElse("FSSO_CLIENT_SECRET", "myClientSecret")
66+
override lazy val scope = sys.env.getOrElse("FSSO_SCOPE", "myScope")
67+
override lazy val username = sys.env.getOrElse("FSSO_TECHUSER_NAME", "myTechUser")
68+
override lazy val password = sys.env.getOrElse("FSSO_TECHUSER_PASSWORD", "myTechUserPassword")
69+
70+
end CompanyPasswordFlow
71+
```
72+
## CompanyRestApiClient
73+
Some specific configuration or authentication for the RestApiClient.
74+
75+
```scala
76+
package mycompany.camundala.worker
77+
78+
import camundala.camunda7.worker.RestApiClient
79+
import camundala.worker.CamundalaWorkerError.*
80+
import sttp.client3.*
81+
82+
@SpringConfiguration
83+
class CompanyRestApiClient extends RestApiClient, CompanyPasswordFlow:
84+
85+
override protected def auth(
86+
request: Request[Either[String, String], Any]
87+
)(using context: EngineRunContext
88+
): Either[ServiceAuthError, Request[Either[String, String], Any]] =
89+
tokenService.adminToken()
90+
.map:
91+
request.addToken
92+
end auth
93+
94+
end CompanyRestApiClient
95+
```
96+
## CompanyWorkerHandler
97+
98+
The Company's base class, you can provide super classes for each Worker type.
99+
See [Workers] for more information on these types.
100+
101+
Example (generated by `./helperCompany.scala init`):
102+
103+
```scala
104+
package mycompany.camundala.worker
105+
106+
import camundala.camunda7.worker.C7WorkerHandler
107+
import scala.reflect.ClassTag
108+
109+
/**
110+
* Add here company specific stuff, to run the Workers.
111+
* You also define the implementation of the WorkerHandler here.
112+
*/
113+
trait CompanyWorkerHandler extends C7WorkerHandler
114+
115+
trait CompanyInitWorkerDsl[
116+
In <: Product: InOutCodec,
117+
Out <: Product: InOutCodec,
118+
InitIn <: Product: InOutCodec,
119+
InConfig <: Product: InOutCodec
120+
] extends CompanyWorkerHandler, InitWorkerDsl[In, Out, InitIn, InConfig]
121+
122+
trait CompanyCustomWorkerDsl[
123+
In <: Product: InOutCodec,
124+
Out <: Product: InOutCodec
125+
] extends CompanyWorkerHandler, CustomWorkerDsl[In, Out]
126+
127+
trait CompanyServiceWorkerDsl[
128+
In <: Product: InOutCodec,
129+
Out <: Product: InOutCodec,
130+
ServiceIn: InOutEncoder,
131+
ServiceOut: InOutDecoder: ClassTag
132+
] extends CompanyWorkerHandler, ServiceWorkerDsl[In, Out, ServiceIn, ServiceOut]
133+
```

04-helper/src/main/scala/camundala/helper/dev/company/CompanySbtGenerator.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ case class CompanySbtGenerator()(using
3131
|""".stripMargin
3232

3333
private lazy val settings =
34-
s"""// $helperCompanyDoNotAdjustText
34+
s"""$helperCompanyDoNotAdjustText
3535
|
3636
|import com.typesafe.config.ConfigFactory
3737
|import laika.ast.Path.Root

04-helper/src/main/scala/camundala/helper/dev/company/CompanyWrapperGenerator.scala

Lines changed: 74 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ case class CompanyWrapperGenerator()(using config: DevConfig):
1010
createIfNotExists(projectApiPath, apiWrapper)
1111
createIfNotExists(projectDmnPath, dmnWrapper)
1212
createIfNotExists(projectSimulationPath, simulationWrapper)
13-
createIfNotExists(projectWorkerPath, workerWrapper)
13+
createIfNotExists(projectWorkerHandlerPath, workerHandlerWrapper)
14+
createIfNotExists(projectWorkerContextPath, workerContextWrapper)
15+
createIfNotExists(projectWorkerPasswordPath, workerPasswordWrapper)
16+
createIfNotExists(projectWorkerRestApiPath, workerRestApiWrapper)
1417
createIfNotExists(projectHelperPath, helperWrapper)
1518

1619
private lazy val companyName = config.companyName
@@ -19,7 +22,10 @@ case class CompanyWrapperGenerator()(using config: DevConfig):
1922
private lazy val projectApiPath = ModuleConfig.apiModule.srcPath / "CompanyApiCreator.scala"
2023
private lazy val projectDmnPath = ModuleConfig.dmnModule.srcPath / "CompanyDmnTester.scala"
2124
private lazy val projectSimulationPath = ModuleConfig.simulationModule.srcPath / "CompanySimulation.scala"
22-
private lazy val projectWorkerPath = ModuleConfig.workerModule.srcPath / "CompanyWorkerHandler.scala"
25+
private lazy val projectWorkerHandlerPath = ModuleConfig.workerModule.srcPath / "CompanyWorkerHandler.scala"
26+
private lazy val projectWorkerContextPath = ModuleConfig.workerModule.srcPath / "CompanyEngineContext.scala"
27+
private lazy val projectWorkerPasswordPath = ModuleConfig.workerModule.srcPath / "CompanyPasswordFlow.scala"
28+
private lazy val projectWorkerRestApiPath = ModuleConfig.workerModule.srcPath / "CompanyRestApiClient.scala"
2329
private lazy val projectHelperPath = ModuleConfig.helperModule.srcPath / "CompanyDevHelper.scala"
2430

2531
private lazy val bpmnWrapper =
@@ -87,12 +93,10 @@ case class CompanyWrapperGenerator()(using config: DevConfig):
8793
|end CompanySimulation
8894
|""".stripMargin
8995

90-
private lazy val workerWrapper =
96+
private lazy val workerHandlerWrapper =
9197
s"""package $companyName.camundala.worker
9298
|
93-
|import camundala.camunda7.worker.C7WorkerHandler
94-
|import camundala.worker.*
95-
|
99+
|import camundala.camunda7.worker.C7WorkerHandler |
96100
|import scala.reflect.ClassTag
97101
|
98102
|/**
@@ -108,10 +112,6 @@ case class CompanyWrapperGenerator()(using config: DevConfig):
108112
| InConfig <: Product: InOutCodec
109113
|] extends CompanyWorkerHandler, InitWorkerDsl[In, Out, InitIn, InConfig]
110114
|
111-
|trait CompanyValidationWorkerDsl[
112-
| In <: Product: InOutCodec
113-
|] extends CompanyWorkerHandler, ValidationWorkerDsl[In]
114-
|
115115
|trait CompanyCustomWorkerDsl[
116116
| In <: Product: InOutCodec,
117117
| Out <: Product: InOutCodec
@@ -125,6 +125,70 @@ case class CompanyWrapperGenerator()(using config: DevConfig):
125125
|] extends CompanyWorkerHandler, ServiceWorkerDsl[In, Out, ServiceIn, ServiceOut]
126126
|""".stripMargin
127127

128+
private lazy val workerContextWrapper =
129+
s"""package $companyName.camundala.worker
130+
|
131+
|import camundala.camunda7.worker.Camunda7Context
132+
|import scala.compiletime.uninitialized
133+
|import scala.reflect.ClassTag
134+
|
135+
|@SpringConfiguration
136+
|class CompanyEngineContext extends Camunda7Context:
137+
|
138+
| @Autowired()
139+
| var restApiClient: CompanyRestApiClient = uninitialized
140+
|
141+
| override def sendRequest[ServiceIn: Encoder, ServiceOut: Decoder: ClassTag](
142+
| request: RunnableRequest[ServiceIn]
143+
| ): SendRequestType[ServiceOut] =
144+
| restApiClient.sendRequest(request)
145+
|
146+
|end CompanyEngineContext
147+
|""".stripMargin
148+
149+
private lazy val workerPasswordWrapper =
150+
s"""package $companyName.camundala.worker
151+
|
152+
|import camundala.camunda7.worker.oauth.OAuthPasswordFlow
153+
|
154+
|trait CompanyPasswordFlow extends OAuthPasswordFlow:
155+
|
156+
| lazy val fssoRealm: String = sys.env.getOrElse("FSSO_REALM", "myRealm")
157+
| // default is a local keycloak server on colime docker environment
158+
| lazy val fssoBaseUrl = sys.env.getOrElse("FSSO_BASE_URL", s"http://host.lima.internal:8090")
159+
|
160+
| override lazy val client_id = sys.env.getOrElse("FSSO_CLIENT_NAME", "myClientKey")
161+
| override lazy val client_secret = sys.env.getOrElse("FSSO_CLIENT_SECRET", "myClientSecret")
162+
| override lazy val scope = sys.env.getOrElse("FSSO_SCOPE", "myScope")
163+
| override lazy val username = sys.env.getOrElse("FSSO_TECHUSER_NAME", "myTechUser")
164+
| override lazy val password = sys.env.getOrElse("FSSO_TECHUSER_PASSWORD", "myTechUserPassword")
165+
|
166+
|end CompanyPasswordFlow
167+
|""".stripMargin
168+
169+
private lazy val workerRestApiWrapper =
170+
s"""package $companyName.camundala.worker
171+
|
172+
|import camundala.camunda7.worker.RestApiClient
173+
|import camundala.worker.CamundalaWorkerError.*
174+
|import sttp.client3.*
175+
|
176+
|@SpringConfiguration
177+
|class CompanyRestApiClient extends RestApiClient, CompanyPasswordFlow:
178+
|
179+
| override protected def auth(
180+
| request: Request[Either[String, String], Any]
181+
| )(using
182+
| context: EngineRunContext
183+
| ): Either[ServiceAuthError, Request[Either[String, String], Any]] =
184+
| tokenService.adminToken()
185+
| .map:
186+
| request.addToken
187+
| end auth
188+
|
189+
|end CompanyRestApiClient
190+
|""".stripMargin
191+
128192
private lazy val helperWrapper =
129193
s"""package $companyName.camundala.helper
130194
|

04-helper/src/main/scala/camundala/helper/dev/update/WorkerGenerator.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ case class WorkerGenerator()(using config: DevConfig):
5757
|@Component("${config.projectClassName}$objName")
5858
|@ConfigurationPropertiesScan
5959
|@ComponentScan(basePackages = Array(
60+
| "camundala.camunda7.worker.oauth",
6061
| "$companyName.camundala.worker",
6162
| "${config.projectPackage}.worker",
6263
| ${

04-worker-c7spring/src/main/scala/camundala/camunda7/worker/RestApiClient.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,13 @@ trait RestApiClient:
135135
val runtimeClass = implicitly[ClassTag[ServiceOut]].runtimeClass
136136
runtimeClass == classOf[NoOutput]
137137

138+
extension (request: Request[Either[String, String], Any])
139+
140+
def addToken(token: String): RequestT[Identity, Either[String, String], Any] =
141+
val tokenHeader = if token.startsWith("Bearer") then token else s"Bearer $token"
142+
request.header("Authorization", tokenHeader)
143+
144+
end extension
138145
end RestApiClient
139146

140147
object DefaultRestApiClient extends RestApiClient

0 commit comments

Comments
 (0)