Files
contractor/chunk.cfm

127 lines
7.2 KiB
Plaintext
Raw Permalink 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>
<!--- Если файл с таким именем уже есть в контракте — удалить старый --->
<cfif len(contractId)>
<cfquery name="oldD" datasource="baza">
SELECT s.id as sid, s.document_id FROM supplements s
JOIN documents d ON d.id = s.document_id
WHERE s.contract_id = <cfqueryparam value="#contractId#" cfsqltype="cf_sql_varchar">
AND d.filename = <cfqueryparam value="#clientFile#" cfsqltype="cf_sql_varchar">
</cfquery>
<cfif oldD.recordCount GT 0>
<cfquery datasource="baza">DELETE FROM supplements WHERE id = <cfqueryparam value="#oldD.sid#" cfsqltype="cf_sql_varchar"></cfquery>
<cfquery datasource="baza">DELETE FROM documents WHERE id = <cfqueryparam value="#oldD.document_id#" cfsqltype="cf_sql_varchar"></cfquery>
</cfif>
</cfif>
<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">,<cfqueryparam value="#allData#" cfsqltype="cf_sql_varchar">,'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>