wireup script execution

This commit is contained in:
gowthaman.b 2023-11-11 18:14:57 +05:30
parent f35851d339
commit 1a22043cf2
8 changed files with 55 additions and 15 deletions

2
.idea/kotlinc.xml generated
View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="KotlinJpsPluginSettings"> <component name="KotlinJpsPluginSettings">
<option name="version" value="1.9.0" /> <option name="version" value="1.9.20" />
</component> </component>
</project> </project>

View File

@ -5,9 +5,9 @@ Authorization: {{auth-token}}
{ {
"data": { "data": {
"number": "KA01MU0556" "number": "TN36AS1206"
}, },
"uniqueIdentifier": "KA01MU0556" "uniqueIdentifier": "TN36AS1206"
} }
### create row, with autogenerated identifier ### create row, with autogenerated identifier

View File

@ -11,4 +11,4 @@ app.iam.realm=forewarn-dev
app.iam.client=forewarn app.iam.client=forewarn
app.iam.client_redirect_uri=http://localhost:9001/auth/code app.iam.client_redirect_uri=http://localhost:9001/auth/code
app.cache.redis_uri=redis://127.0.0.1:6379/0 app.cache.redis_uri=redis://127.0.0.1:6379/0
app.scripts.path=/tmp app.scripts.path=/Users/gowthaman.b/IdeaProjects/rmc_modules_api/src/main/resources/scripts

View File

@ -1,6 +1,6 @@
plugins { plugins {
kotlin("jvm") version "1.9.0" kotlin("jvm") version "1.9.20"
kotlin("kapt") version "1.9.0" kotlin("kapt") version "1.9.20"
id("idea") id("idea")
id("io.ebean") version "13.23.2" id("io.ebean") version "13.23.2"
application application
@ -29,7 +29,8 @@ dependencies {
implementation("ch.qos.logback:logback-classic:1.4.11") implementation("ch.qos.logback:logback-classic:1.4.11")
implementation("org.bitbucket.b_c:jose4j:0.9.3") implementation("org.bitbucket.b_c:jose4j:0.9.3")
implementation("redis.clients:jedis:5.0.2") implementation("redis.clients:jedis:5.0.2")
implementation("org.jetbrains.kotlin:kotlin-scripting-jsr223:1.9.0") implementation("org.jetbrains.kotlin:kotlin-scripting-jsr223:1.9.20")
implementation("org.jetbrains.kotlin:kotlin-script-runtime:1.9.20")
api ("net.cactusthorn.config:config-core:0.81") api ("net.cactusthorn.config:config-core:0.81")
kapt("net.cactusthorn.config:config-compiler:0.81") kapt("net.cactusthorn.config:config-compiler:0.81")
kapt("io.ebean:kotlin-querybean-generator:13.23.2") kapt("io.ebean:kotlin-querybean-generator:13.23.2")

View File

@ -57,7 +57,8 @@ object Entities {
val name = ctx.pathParam("name") val name = ctx.pathParam("name")
val params = ctx.bodyAsClass<Map<String, Any>>() val params = ctx.bodyAsClass<Map<String, Any>>()
ctx.json( ctx.json(
Scripting.execute(name, params) Scripting.
execute(name, "execute", params, logger)
) )
} }
@ -202,6 +203,12 @@ object Entities {
} }
} }
} }
if (!setupEntity.preSaveScript.isNullOrEmpty()) {
val ok = Scripting.preSave(setupEntity.preSaveScript!!, "preSave", this, logger) as Boolean
if (!ok) {
throw BadRequestResponse("PreSave Failed")
}
}
if (setupEntity.approvalLevels > 0) { if (setupEntity.approvalLevels > 0) {
@ -210,7 +217,8 @@ object Entities {
} }
} }
}) }
)
} }
private fun isValidDate(f: String) = try { private fun isValidDate(f: String) = try {

View File

@ -1,17 +1,29 @@
package com.restapi.integ package com.restapi.integ
import com.restapi.config.AppConfig.Companion.appConfig import com.restapi.config.AppConfig.Companion.appConfig
import com.restapi.domain.DataModel
import com.restapi.domain.Session
import org.slf4j.Logger
import java.io.File import java.io.File
import java.util.concurrent.ConcurrentHashMap
import javax.script.Invocable import javax.script.Invocable
import javax.script.ScriptEngineManager import javax.script.ScriptEngineManager
object Scripting { object Scripting {
private val engineMap = ConcurrentHashMap<String, Invocable>()
fun execute(name: String, params: Map<String, Any>): Any { private fun getEngine(scriptName: String) = engineMap.computeIfAbsent(scriptName) {
val engine = ScriptEngineManager().getEngineByExtension("kts")!! val engine = ScriptEngineManager().getEngineByExtension("kts")!!
engine.eval(File(appConfig.scriptsPath(), "$name.kts").reader()) engine.eval(File(appConfig.scriptsPath(), scriptName).reader())
val invocator = engine as Invocable engine as Invocable
return invocator.invokeFunction("execute", params) }
fun execute(scriptName: String, fnName: String, params: Map<String, Any>, logger: Logger): Any {
return getEngine(scriptName).invokeFunction(fnName, params, Session.database, logger)
}
fun preSave(scriptName: String, fnName: String, data: DataModel, logger: Logger): Any {
return getEngine(scriptName).invokeFunction(fnName, data, Session.database, logger)
} }
} }

View File

@ -1,2 +1,4 @@
insert into tenant_model(name, domain, created_by, modified_by) values ('compegence', 'https://www.compegence.com', 'system', 'system'); insert into tenant_model(name, domain, created_by, modified_by)
insert into entity_model(name, tenant_id, created_by, modified_by) values ('vehicle', 'compegence', 'system', 'system'); values ('compegence', 'https://www.compegence.com', 'system', 'system');
insert into entity_model(name, tenant_id, created_by, modified_by, pre_save_script, post_save_script)
values ('vehicle', 'compegence', 'system', 'system', 'vehicle.kts', 'vehicle.kts');

View File

@ -0,0 +1,17 @@
import com.restapi.domain.DataModel
import io.ebean.Database
import org.slf4j.Logger
fun execute(d: Map<String, Any>, db: Database, logger: Logger): Map<String, Any> {
println("execute on $d")
return d
}
fun preSave(d: DataModel, db: Database, logger: Logger): Boolean {
logger.warn("PreSave $d")
return true
}
fun postSave(d: DataModel, db: Database, logger: Logger) {
println("PostSave $d")
}