127 lines
6.4 KiB
Plaintext
127 lines
6.4 KiB
Plaintext
<cfcomponent displayname="Application" output="true">
|
|
<cfset this.Name = "rabbit-lsd-ui" />
|
|
<cfset this.sessionmanagement = "Yes" />
|
|
<cfset this.datasource = "testds" />
|
|
<cfset this.javaSettings = { loadPaths = [ expandPath("./lib") ] } />
|
|
<cfset getDS(this.datasource) />
|
|
|
|
<cffunction name="getEnv" access="private" returntype="string">
|
|
<cfargument name="key" type="string" required="true" />
|
|
<cfargument name="def" type="string" required="true" />
|
|
<cfset var system = createObject("java", "java.lang.System") />
|
|
<cfset var val = system.getEnv(arguments.key) />
|
|
<cfif isDefined("val") AND len(val)><cfreturn val /></cfif>
|
|
<cfreturn arguments.def />
|
|
</cffunction>
|
|
|
|
<cffunction name="getDS" access="private" returntype="void">
|
|
<cfargument name="dsname" type="string" required="true" />
|
|
<cfset var system = createObject("java", "java.lang.System") />
|
|
<cfset var ds = {} />
|
|
<cfloop list="class,connectionString,database,driver,host,port,type,url,username,password,bundleName,bundleVersion,connectionLimit,liveTimeout,validate" item="field">
|
|
<cfset var envVal = system.getEnv("#arguments.dsname#_#field#") />
|
|
<cfif isDefined("envVal") AND len(envVal)><cfset ds[field] = envVal /></cfif>
|
|
</cfloop>
|
|
<cfset this.datasources[arguments.dsname] = ds />
|
|
</cffunction>
|
|
|
|
<cffunction name="publishToRabbit" access="private" returntype="void">
|
|
<cfargument name="payload" type="struct" required="true" />
|
|
<cfset var host = getEnv("RABBIT_HOST", "") />
|
|
<cfset var user = getEnv("RABBIT_USER", "") />
|
|
<cfset var pass = getEnv("RABBIT_PASSWORD", "") />
|
|
<cfset var vhost = getEnv("RABBIT_VHOST", "/") />
|
|
<cfset var port = getEnv("RABBIT_PORT", "5672") />
|
|
<cfset var queueList = listToArray(getEnv("RABBIT_QUEUES", "crud_queue")) />
|
|
<cfset var queueName = trim(queueList[1]) />
|
|
<cfset var durable = lcase(getEnv("RABBIT_DURABLE", "true")) EQ "true" />
|
|
<cfset var factory = createObject("java", "com.rabbitmq.client.ConnectionFactory") />
|
|
<cfset var connection = "" />
|
|
<cfset var channel = "" />
|
|
|
|
<cfif host EQ "" OR user EQ "" OR pass EQ "">
|
|
<cfthrow message="Rabbit credentials are missing" />
|
|
</cfif>
|
|
|
|
<cfset factory.setHost(host) />
|
|
<cfset factory.setPort(JavaCast("int", port)) />
|
|
<cfset factory.setUsername(user) />
|
|
<cfset factory.setPassword(pass) />
|
|
<cfset factory.setVirtualHost(vhost) />
|
|
|
|
<cftry>
|
|
<cfset connection = factory.newConnection() />
|
|
<cfset channel = connection.createChannel() />
|
|
<cfset channel.queueDeclare(queueName, durable, false, false, JavaCast("null", "")) />
|
|
<cfset var payloadJson = serializeJSON(arguments.payload) />
|
|
<cfset var body = createObject("java", "java.lang.String").init(payloadJson).getBytes("UTF-8") />
|
|
<cfset channel.basicPublish("", queueName, JavaCast("null", ""), body) />
|
|
<cfif isDefined("channel")><cfset channel.close() /></cfif>
|
|
<cfif isDefined("connection")><cfset connection.close() /></cfif>
|
|
<cfcatch>
|
|
<cfif isDefined("channel")><cfset channel.close() /></cfif>
|
|
<cfif isDefined("connection")><cfset connection.close() /></cfif>
|
|
<cfthrow message="#cfcatch.message#" />
|
|
</cfcatch>
|
|
</cftry>
|
|
</cffunction>
|
|
|
|
<cffunction name="OnRequest" access="public" returntype="void" output="true">
|
|
<cfargument name="template" type="string" required="true" />
|
|
<cfset request.DS = this.datasource />
|
|
<cfset request.tableName = getEnv("PG_TABLE", "rabbit_messages") />
|
|
|
|
<cftry>
|
|
<cfquery datasource="#request.DS#">
|
|
CREATE TABLE IF NOT EXISTS #request.tableName# (id SERIAL PRIMARY KEY, test_data TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)
|
|
</cfquery>
|
|
<cfcatch><cfset request.db_error = cfcatch.message /></cfcatch>
|
|
</cftry>
|
|
|
|
<cfif CGI.REQUEST_METHOD EQ "POST" AND structKeyExists(form, "crud_action")>
|
|
<cfset var action = lcase(form.crud_action) />
|
|
<cfset var requestId = createUUID() />
|
|
<cfset var payload = { "request_id" = requestId } />
|
|
|
|
<cftry>
|
|
<cfswitch expression="#action#">
|
|
<cfcase value="insert">
|
|
<cfset payload.action = "create" />
|
|
<cfset payload.text = trim(form.txt_content) & " [req:" & requestId & "]" />
|
|
<cfset session.last_action = { action = "create", request_id = requestId, queued_at = now(), text = trim(form.txt_content) } />
|
|
</cfcase>
|
|
<cfcase value="update">
|
|
<cfif NOT structKeyExists(form, "id")>
|
|
<cfthrow message="Missing id for update" />
|
|
</cfif>
|
|
<cfset payload.action = "update" />
|
|
<cfset payload.id = val(form.id) />
|
|
<cfset payload.text = trim(form.txt_content) & " [req:" & requestId & "]" />
|
|
<cfset session.last_action = { action = "update", request_id = requestId, queued_at = now(), id = val(form.id), text = trim(form.txt_content) } />
|
|
</cfcase>
|
|
<cfcase value="delete">
|
|
<cfif NOT structKeyExists(form, "id")>
|
|
<cfthrow message="Missing id for delete" />
|
|
</cfif>
|
|
<cfset payload.action = "delete" />
|
|
<cfset payload.id = val(form.id) />
|
|
<cfset session.last_action = { action = "delete", request_id = requestId, queued_at = now(), id = val(form.id) } />
|
|
</cfcase>
|
|
<cfdefaultcase>
|
|
<cfthrow message="Unknown action" />
|
|
</cfdefaultcase>
|
|
</cfswitch>
|
|
|
|
<cfset publishToRabbit(payload) />
|
|
<cflocation url="#CGI.SCRIPT_NAME#" addtoken="false">
|
|
<cfcatch>
|
|
<cfset request.queue_error = cfcatch.message />
|
|
<cfset structDelete(session, "last_action") />
|
|
</cfcatch>
|
|
</cftry>
|
|
</cfif>
|
|
|
|
<cfinclude template="#arguments.template#" />
|
|
</cffunction>
|
|
</cfcomponent>
|