Files
contractor/api.cfm
T

128 lines
5.7 KiB
Plaintext

<cfsetting showdebugoutput="no" enablecfoutputonly="true">
<cfheader name="Content-Type" value="application/json; charset=utf-8">
<cfparam name="url.action" default="test">
<cfset result = {ok: false, error: "unknown action"}>
<cftry>
<cfif url.action EQ "test">
<cfquery name="q" datasource="baza">SELECT 1 as ok</cfquery>
<cfset result = {ok: true, message: "PostgreSQL connected"}>
<cfelseif url.action EQ "tables">
<cfquery name="q" datasource="baza">
SELECT table_name FROM information_schema.tables
WHERE table_schema = 'public' ORDER BY table_name
</cfquery>
<cfset tables = []>
<cfloop query="q"><cfset arrayAppend(tables, q.table_name)></cfloop>
<cfset result = {ok: true, tables: tables}>
<cfelseif url.action EQ "schema">
<cfset result = {ok: true, results: []}>
<cftry>
<cfquery datasource="baza">
CREATE TABLE IF NOT EXISTS documents (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
filename TEXT NOT NULL, mime_type TEXT NOT NULL,
original_bytes BYTEA, parsed_text TEXT, elements_json JSONB,
status TEXT DEFAULT 'uploaded', error_message TEXT,
created_at TIMESTAMPTZ DEFAULT now()
)
</cfquery>
<cfset arrayAppend(result.results, "documents: OK")>
<cfcatch><cfset arrayAppend(result.results, "documents: " & cfcatch.message)></cfcatch>
</cftry>
<cftry>
<cfquery datasource="baza">
CREATE TABLE IF NOT EXISTS contracts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
number TEXT NOT NULL, client TEXT, date_signed DATE,
status TEXT DEFAULT 'active', created_at TIMESTAMPTZ DEFAULT now()
)
</cfquery>
<cfset arrayAppend(result.results, "contracts: OK")>
<cfcatch><cfset arrayAppend(result.results, "contracts: " & cfcatch.message)></cfcatch>
</cftry>
<cftry>
<cfquery datasource="baza">
CREATE TABLE IF NOT EXISTS supplements (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
contract_id UUID REFERENCES contracts(id),
number TEXT, date_signed DATE, type TEXT DEFAULT 'initial',
document_id UUID REFERENCES documents(id),
created_at TIMESTAMPTZ DEFAULT now()
)
</cfquery>
<cfset arrayAppend(result.results, "supplements: OK")>
<cfcatch><cfset arrayAppend(result.results, "supplements: " & cfcatch.message)></cfcatch>
</cftry>
<cftry>
<cfquery datasource="baza">
CREATE TABLE IF NOT EXISTS spec_rows (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
supplement_id UUID REFERENCES supplements(id),
row_num INTEGER, name TEXT, price NUMERIC, qty NUMERIC,
sum NUMERIC, date_start DATE, date_end DATE,
created_at TIMESTAMPTZ DEFAULT now()
)
</cfquery>
<cfset arrayAppend(result.results, "spec_rows: OK")>
<cfcatch><cfset arrayAppend(result.results, "spec_rows: " & cfcatch.message)></cfcatch>
</cftry>
<cftry>
<cfquery datasource="baza">
CREATE TABLE IF NOT EXISTS spec_history (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
contract_id UUID REFERENCES contracts(id),
supplement_id UUID REFERENCES supplements(id),
row_num INTEGER, change_type TEXT NOT NULL,
old_values JSONB, new_values JSONB,
created_at TIMESTAMPTZ DEFAULT now()
)
</cfquery>
<cfset arrayAppend(result.results, "spec_history: OK")>
<cfcatch><cfset arrayAppend(result.results, "spec_history: " & cfcatch.message)></cfcatch>
</cftry>
<cftry>
<cfquery datasource="baza">
CREATE TABLE IF NOT EXISTS upload_chunks (
id SERIAL PRIMARY KEY,
upload_id TEXT NOT NULL,
chunk_index INTEGER NOT NULL,
total_chunks INTEGER DEFAULT 0,
filename TEXT DEFAULT '',
data TEXT NOT NULL,
contract_id TEXT DEFAULT '',
created_at TIMESTAMPTZ DEFAULT now()
)
</cfquery>
<cfset arrayAppend(result.results, "upload_chunks: OK")>
<cfcatch><cfset arrayAppend(result.results, "upload_chunks: " & cfcatch.message)></cfcatch>
</cftry>
<cfelseif url.action EQ "query" AND structKeyExists(url, "sql")>
<cfquery name="q" datasource="baza">#preserveSingleQuotes(url.sql)#</cfquery>
<cfset cols = q.getColumnNames()>
<cfset rows = []>
<cfloop query="q">
<cfset row = {}>
<cfloop array="#cols#" index="c"><cfset row[c] = q[c][q.currentRow]></cfloop>
<cfset arrayAppend(rows, row)>
</cfloop>
<cfset result = {ok: true, columns: cols, rows: rows, count: q.recordCount}>
<cfelseif url.action EQ "execute" AND cgi.request_method EQ "POST">
<cfset body = deserializeJSON(toString(getHttpRequestData().content))>
<cfquery datasource="baza">#preserveSingleQuotes(body.sql)#</cfquery>
<cfset result = {ok: true}>
</cfif>
<cfcatch>
<cfset result = {ok: false, error: cfcatch.message}>
</cfcatch>
</cftry>
<cfoutput>#serializeJSON(result)#</cfoutput>