Files
contractor/chunk.cfm
T

114 lines
6.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<cfsetting showdebugoutput="no" enablecfoutputonly="true">
<cfheader name="Content-Type" value="application/json; charset=utf-8">
<cfheader name="Access-Control-Allow-Origin" value="*">
<cfheader name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS">
<cfheader name="Access-Control-Allow-Headers" value="Content-Type">
<cfif cgi.request_method EQ "OPTIONS"><cfoutput>OK</cfoutput><cfabort></cfif>
<cfparam name="url.action" default="">
<cfset result = {ok: false, error: "action required: put or assemble"}>
<cftry>
<cfset body = toString(getHttpRequestData().content)>
<cfset data = deserializeJSON(body)>
<cfif url.action EQ "put">
<!--- Сохранить чанк --->
<cfif NOT structKeyExists(data, "upload_id") OR NOT structKeyExists(data, "chunk_index") OR NOT structKeyExists(data, "data")>
<cfset result = {ok: false, error: "upload_id, chunk_index, data required"}>
<cfelse>
<cfquery datasource="baza">
INSERT INTO upload_chunks (upload_id, chunk_index, total_chunks, filename, data, contract_id)
VALUES (
<cfqueryparam value="#data.upload_id#" cfsqltype="cf_sql_varchar">,
<cfqueryparam value="#data.chunk_index#" cfsqltype="cf_sql_integer">,
<cfqueryparam value="#structKeyExists(data,'total_chunks') ? data.total_chunks : 0#" cfsqltype="cf_sql_integer">,
<cfqueryparam value="#structKeyExists(data,'filename') ? data.filename : ''#" cfsqltype="cf_sql_varchar">,
<cfqueryparam value="#data.data#" cfsqltype="cf_sql_varchar">,
<cfqueryparam value="#structKeyExists(data,'contract_id') ? data.contract_id : ''#" cfsqltype="cf_sql_varchar">
)
</cfquery>
<cfset result = {ok: true, chunk: data.chunk_index}>
</cfif>
<cfelseif url.action EQ "assemble">
<!--- Собрать чанки в файл --->
<cfif NOT structKeyExists(data, "upload_id")>
<cfset result = {ok: false, error: "upload_id required"}>
<cfelse>
<cfquery name="chunks" datasource="baza">
SELECT chunk_index, data, filename, total_chunks, contract_id
FROM upload_chunks
WHERE upload_id = <cfqueryparam value="#data.upload_id#" cfsqltype="cf_sql_varchar">
ORDER BY chunk_index
</cfquery>
<cfif chunks.recordCount EQ 0>
<cfset result = {ok: false, error: "no chunks found"}>
<cfelse>
<cfset allData = "">
<cfset clientFile = "">
<cfset contractId = structKeyExists(data, "contract_id") ? data.contract_id : "">
<cfloop query="chunks">
<cfset allData &= chunks.data>
<cfif NOT len(clientFile) AND len(chunks.filename)>
<cfset clientFile = chunks.filename>
</cfif>
<cfif NOT len(contractId) AND len(chunks.contract_id)>
<cfset contractId = chunks.contract_id>
</cfif>
</cfloop>
<cfif NOT len(clientFile)>
<cfset clientFile = "uploaded_file">
</cfif>
<cfset mime = "application/octet-stream">
<cfset ext = listLast(clientFile, ".")>
<cfif ext EQ "pdf"><cfset mime = "application/pdf">
<cfelseif ext EQ "docx"><cfset mime = "application/vnd.openxmlformats-officedocument.wordprocessingml.document">
<cfelseif ext EQ "doc"><cfset mime = "application/msword">
<cfelseif ext EQ "zip"><cfset mime = "application/zip">
</cfif>
<cftransaction>
<cfquery datasource="baza">
INSERT INTO documents (filename, mime_type, original_bytes, status)
VALUES (<cfqueryparam value="#clientFile#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#mime#" cfsqltype="cf_sql_varchar">,decode(<cfqueryparam value="#allData#" cfsqltype="cf_sql_varchar">,'hex'),'uploaded')
</cfquery>
<cfquery name="doc" datasource="baza">
SELECT id FROM documents WHERE filename=<cfqueryparam value="#clientFile#" cfsqltype="cf_sql_varchar"> AND status='uploaded' ORDER BY created_at DESC LIMIT 1
</cfquery>
<cfif len(contractId)>
<cfset suppType = "additional">
<cfelse>
<cfquery datasource="baza">
INSERT INTO contracts (number, client) VALUES (<cfqueryparam value="б/н #dateFormat(now(),'yyyymmdd')#-#timeFormat(now(),'HHmm')#" cfsqltype="cf_sql_varchar">,'')
</cfquery>
<cfquery name="cid" datasource="baza">
SELECT id FROM contracts ORDER BY created_at DESC LIMIT 1
</cfquery>
<cfset contractId = cid.id>
<cfset suppType = "initial">
</cfif>
<cfquery datasource="baza">
INSERT INTO supplements (contract_id, document_id, type) VALUES (<cfqueryparam value="#contractId#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#doc.id#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#suppType#" cfsqltype="cf_sql_varchar">)
</cfquery>
<!--- Удалить чанки --->
<cfquery datasource="baza">
DELETE FROM upload_chunks WHERE upload_id = <cfqueryparam value="#data.upload_id#" cfsqltype="cf_sql_varchar">
</cfquery>
</cftransaction>
<cfset result = {ok: true, doc_id: doc.id, contract_id: contractId, filename: clientFile, size: len(allData)}>
</cfif>
</cfif>
</cfif>
<cfcatch>
<cfset result = {ok: false, error: cfcatch.message}>
</cfcatch>
</cftry>
<cfoutput>#serializeJSON(result)#</cfoutput>