From 0cd23686f0697a0e395ab5942776c59904beb2da Mon Sep 17 00:00:00 2001 From: Jimmy Bosse Date: Mon, 6 Feb 2023 17:47:51 -0500 Subject: [PATCH 1/5] Fix test data --- test/fixtures/ocr_done.json | 6 +++++- test/fixtures/ocr_in_progress.json | 6 +----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/fixtures/ocr_done.json b/test/fixtures/ocr_done.json index e85e094..c35e347 100644 --- a/test/fixtures/ocr_done.json +++ b/test/fixtures/ocr_done.json @@ -1,3 +1,7 @@ { - "status": "in progress" + "status": "done", + "asset": { + "assetID": "ocr'd:asset-id", + "downloadUri": "https://ocr.file.url" + } } diff --git a/test/fixtures/ocr_in_progress.json b/test/fixtures/ocr_in_progress.json index c35e347..e85e094 100644 --- a/test/fixtures/ocr_in_progress.json +++ b/test/fixtures/ocr_in_progress.json @@ -1,7 +1,3 @@ { - "status": "done", - "asset": { - "assetID": "ocr'd:asset-id", - "downloadUri": "https://ocr.file.url" - } + "status": "in progress" } From 899cd2aa845c5466dd2732f60741a4895ea95700 Mon Sep 17 00:00:00 2001 From: Jimmy Bosse Date: Mon, 6 Feb 2023 17:48:03 -0500 Subject: [PATCH 2/5] Use new API --- lib/pdfservices/document_merge/operation.rb | 134 ++++++++++-------- test/fixtures/files/merge_done.pdf | Bin 0 -> 25119 bytes test/fixtures/merge_request_done.json | 7 + test/fixtures/merge_request_in_progress.json | 24 +--- .../fixtures/merge_request_response.multipart | Bin 54699 -> 0 bytes test/integration_spikes/document_merge.rb | 21 +++ test/pdf_services_sdk/test_document_merge.rb | 61 ++++++-- 7 files changed, 151 insertions(+), 96 deletions(-) create mode 100644 test/fixtures/files/merge_done.pdf create mode 100644 test/fixtures/merge_request_done.json delete mode 100644 test/fixtures/merge_request_response.multipart create mode 100755 test/integration_spikes/document_merge.rb diff --git a/lib/pdfservices/document_merge/operation.rb b/lib/pdfservices/document_merge/operation.rb index 1f650e3..da05628 100644 --- a/lib/pdfservices/document_merge/operation.rb +++ b/lib/pdfservices/document_merge/operation.rb @@ -8,8 +8,9 @@ module PdfServices module DocumentMerge class Operation - ENDPOINT = "https://cpf-ue1.adobe.io/ops/:create?respondWith=%7B%22reltype%22%3A%20%22http%3A%2F%2Fns.adobe.com%2Frel%2Fprimary%22%7D" - DOCUMENT_GENERATION_ASSET_ID = "urn:aaid:cpf:Service-52d5db6097ed436ebb96f13a4c7bf8fb" + PRESIGNED_URL_ENDPOINT = "https://pdf-services.adobe.io/assets" + OPERATION_ENDPOINT = "https://pdf-services.adobe.io/operation/documentgeneration" + ASSETS_ENDPOINT = "https://pdf-services.adobe.io/assets" def initialize(credentials = nil, template_path = nil, json_data_for_merge = nil, output_format = nil) @credentials = credentials @@ -18,85 +19,92 @@ def initialize(credentials = nil, template_path = nil, json_data_for_merge = nil @output_format = output_format end - def execute - form = { - contentAnalyzerRequests: build_content_analyzer_requests.to_json, - InputFile0: build_input_file - } - response = api.post(ENDPOINT, form: form) - if response.status == 202 - document_url = response.headers["Location"] - poll_document_result(document_url) + def get_presigned_url + response = api.post(PRESIGNED_URL_ENDPOINT, json: {mediaType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}) + if response.status == 200 + JSON.parse(response.body.to_s) else - Result.new(nil, "Unexpected response status: #{response.status}") + Result.new(nil, "Unexpected response status from get presigned url: #{response.status}") end end - private + def upload_asset(template_path) + presigned_url = get_presigned_url + upload_uri = presigned_url["uploadUri"] + asset_id = presigned_url["assetID"] + aws = HTTP.headers({"Content-Type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}) + response = aws.put(upload_uri, body: File.open(template_path)) + if response.status == 200 + asset_id + else + Result.new(nil, "Unexpected response status from asset upload: #{response.status}") + end + end - def build_content_analyzer_requests - { - "cpf:engine": { - "repo:assetId": DOCUMENT_GENERATION_ASSET_ID - }, - "cpf:inputs": { - documentIn: { - "dc:format": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", - "cpf:location": "InputFile0" - }, - params: { - "cpf:inline": { - outputFormat: @output_format, - jsonDataForMerge: @json_data_for_merge - } - } - }, - "cpf:outputs": { - documentOut: { - "dc:format": mime_type(@output_format), - "cpf:location": "multipartLabel" - } - } - } + def delete_the_asset(asset_id) + api.delete("#{ASSETS_ENDPOINT}/#{asset_id}") end - def build_headers + def execute + asset_id = upload_asset(@template_path) + response = api.post(OPERATION_ENDPOINT, json: { + assetID: asset_id, + outputFormat: @output_format, + jsonDataForMerge: @json_data_for_merge + }) + if response.status == 201 + document_url = response.headers["location"] + poll_document_result(document_url, asset_id) + else + Result.new(nil, "Unexpected response status from document merge endpoint: #{response.status}\nasset_id: #{asset_id}") + end + end + + private + + def api_headers { Authorization: "Bearer #{JwtProvider.get_jwt(@credentials)}", "x-api-key": @credentials.client_id, - Prefer: "respond-async,wait=0" + "Content-Type": "application/json" } end - def build_input_file - HTTP::FormData::File.new(@template_path) - end - def api - @api ||= HTTP.headers(build_headers) + @api ||= HTTP.headers(api_headers) end - def poll_document_result(url) + def poll_document_result(url, original_asset_id) sleep(1) - document_response = api.get(url) - case document_response.content_type.mime_type - when "application/json" - poll_document_result(url) - when "multipart/mixed" - Result.from_multipart_response(document_response) - else - Result.new(nil, "Unexpected response content type: #{document_response.content_type.mime_type}; status: #{document_response.status}") - end - end - - def mime_type(format) - case format - when :docx - "application/vnd.openxmlformats-officedocument.wordprocessingml.document" - when :pdf - "application/pdf" + response = api.get(url) + if response.status == 200 + json_response = JSON.parse(response.body.to_s) + document_merge_asset_id = json_response&.[]("asset")&.[]("assetID") + case json_response["status"] + when "in progress" + poll_document_result(url, original_asset_id) + when "done" + # download_the_asset + response = HTTP.get(json_response["asset"]["downloadUri"]) + # delete the assets + delete_the_asset(original_asset_id) if !original_asset_id.nil? + delete_the_asset(document_merge_asset_id) if !document_merge_asset_id.nil? + # return the result + Result.new(response.body, nil) + when "failed" + # delete the original asset + message = json_response["error"]["message"] + delete_the_asset(original_asset_id) if !original_asset_id.nil? + Result.new(nil, message) + else + # delete the original asset + delete_the_asset(original_asset_id) if original_asset_id.present? + Result.new(nil, "Unexpected status from polling: #{json_response["status"]}") + end else - "text/plain" + # delete the original asset + delete_the_asset(original_asset_id) if original_asset_id.present? + Result.new(nil, "Unexpected response status from polling: #{json_response["status"]}") end end end diff --git a/test/fixtures/files/merge_done.pdf b/test/fixtures/files/merge_done.pdf new file mode 100644 index 0000000000000000000000000000000000000000..94a0dc8cbe63544a3191f4ef0decb39093a89632 GIT binary patch literal 25119 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/merge_request_done.json b/test/fixtures/merge_request_done.json new file mode 100644 index 0000000..59b7760 --- /dev/null +++ b/test/fixtures/merge_request_done.json @@ -0,0 +1,7 @@ +{ + "status": "done", + "asset": { + "assetID": "merged:asset-id", + "downloadUri": "https://documentmerge.file.url" + } +} diff --git a/test/fixtures/merge_request_in_progress.json b/test/fixtures/merge_request_in_progress.json index 24cdcf1..e85e094 100644 --- a/test/fixtures/merge_request_in_progress.json +++ b/test/fixtures/merge_request_in_progress.json @@ -1,25 +1,3 @@ { - "cpf:status": { - "completed": false, - "type": "", - "title": "In Progress", - "status": 202 - }, - "cpf:engine": { - "repo:assetId": "urn:aaid:cpf:Service-52d5db6097ed436ebb96f13a4c7bf8fb" - }, - "cpf:inputs": { - "documentIn": { - "dc:format": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", - "cpf:location": "InputFile0" - }, - "params": { - "cpf:inline": { - "outputFormat": "pdf", - "jsonDataForMerge": { - "message": "World" - } - } - } - } + "status": "in progress" } diff --git a/test/fixtures/merge_request_response.multipart b/test/fixtures/merge_request_response.multipart deleted file mode 100644 index 657ddf6934680080aea0c1ac7952dd258aa4d84d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54699 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 bUohapRa|;3Kp+bzxW~f53Is4PAS3)g`x_@v diff --git a/test/integration_spikes/document_merge.rb b/test/integration_spikes/document_merge.rb new file mode 100755 index 0000000..7202ef2 --- /dev/null +++ b/test/integration_spikes/document_merge.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +require "lib/pdfservices" + +credentials = ::PdfServices::CredentialsBuilder.new + .with_client_id(ENV["PDF_SERVICES_CLIENT_ID"]) + .with_client_secret(ENV["PDF_SERVICES_CLIENT_SECRET"]) + .with_organization_id(ENV["PDF_SERVICES_ORGANIZATION_ID"]) + .with_account_id(ENV["PDF_SERVICES_ACCOUNT_ID"]) + .with_private_key(ENV["PDF_SERVICES_PRIVATE_KEY"]) + .build + +json = { message: "World"} +word_file = File.join(Dir.pwd, "test", "fixtures", "files", "sample_template.docx") +operation = ::PdfServices::DocumentMerge::Operation.new(credentials, word_file, json, "pdf") + +result = operation.execute() + +puts(result.error) + +result.save_as_file("tmp/document_merge_result.pdf") diff --git a/test/pdf_services_sdk/test_document_merge.rb b/test/pdf_services_sdk/test_document_merge.rb index 76165de..60c1410 100644 --- a/test/pdf_services_sdk/test_document_merge.rb +++ b/test/pdf_services_sdk/test_document_merge.rb @@ -31,27 +31,68 @@ def test_it_works private def stub_valid_response_sequence + # get JWT for requests stub_request(:post, "https://ims-na1.adobelogin.com/ims/exchange/jwt/") .to_return(status: 200, body: json_fixture("valid_jwt_response")) - stub_request(:post, "https://cpf-ue1.adobe.io/ops/:create?respondWith=%7B%22reltype%22:%20%22http://ns.adobe.com/rel/primary%22%7D") + # get a presigned url to upload the source pdf + stub_request(:post, "https://pdf-services.adobe.io/assets") + .with(headers: secured_headers) .to_return( - status: 202, - headers: {"Location" => "https://cpf-ue1.adobe.io/ops/id/some-document-token"}.merge(json_headers), - body: json_fixture("merge_request_in_progress") + status: 200, + headers: json_headers, + body: json_fixture("presigned_upload_url_response") ) - stub_request(:get, "https://cpf-ue1.adobe.io/ops/id/some-document-token") - .to_return(status: 202, headers: json_headers, body: json_fixture("merge_request_in_progress")) - .to_return(status: 202, headers: json_headers, body: json_fixture("merge_request_in_progress")) - .to_return(status: 200, headers: multipart_headers, body: multipart_fixture("merge_request_response")) + # upload the source template + stub_request(:put, "https://a.presigned.url").to_return(status: 200) + + # request the Document Merge operation + stub_request(:post, "https://pdf-services.adobe.io/operation/documentgeneration") + .with(headers: secured_headers) + .to_return( + status: 201, + headers: {"location" => "https://some.polling.url"}.merge(json_headers) + ) + + # poll for the result + stub_request(:get, "https://some.polling.url") + .with(headers: secured_headers) + .to_return(status: 200, headers: json_headers, body: json_fixture("merge_request_in_progress")) + .to_return(status: 200, headers: json_headers, body: json_fixture("merge_request_in_progress")) + .to_return(status: 200, headers: json_headers, body: json_fixture("merge_request_done")) + + # download the merged pdf + stub_request(:get, "https://documentmerge.file.url") + .to_return(status: 200, headers: pdf_headers, body: file_fixture("merge_done.pdf")) + + # delete the original asset + stub_request(:delete, "https://pdf-services.adobe.io/assets/urn:a-real-long-asset-asset-id") + .with(headers: secured_headers) + .to_return(status: 200, body: "", headers: {}) + + # delete the merged asset + stub_request(:delete, "https://pdf-services.adobe.io/assets/merged:asset-id") + .with(headers: secured_headers) + .to_return(status: 200, body: "", headers: {}) + end + + def secured_headers + { + Authorization: "Bearer fake1.fake2.fake3", + "Content-Type": "application/json", + "X-Api-Key": "123someclientid" + } end def json_headers {"Content-Type" => "application/json;charset=UTF-8"} end - def multipart_headers - {"Content-Type" => "multipart/mixed; boundary=Boundary_962026_575353369_1661875317362;charset=UTF-8"} + def pdf_headers + {"Content-Type" => "application/pdf"} end end + +#stub_request(:post, "https://pdf-services.adobe.io/assets"). +#stub_request(:post, "https://pdf-services.adobe.io/assets"). From 7d6b1430f301985fe168bedb3542113aedcac61c Mon Sep 17 00:00:00 2001 From: Jimmy Bosse Date: Mon, 6 Feb 2023 17:49:18 -0500 Subject: [PATCH 3/5] Bump version --- Gemfile.lock | 4 ++-- lib/pdfservices/version.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 5e720dc..713a453 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - pdfservices (0.1.2) + pdfservices (0.1.3) http (~> 5.1) json (~> 2.6) jwt (>= 1.0, < 3.0) @@ -31,7 +31,7 @@ GEM domain_name (~> 0.5) http-form_data (2.3.0) json (2.6.2) - jwt (2.6.0) + jwt (2.7.0) llhttp-ffi (0.4.0) ffi-compiler (~> 1.0) rake (~> 13.0) diff --git a/lib/pdfservices/version.rb b/lib/pdfservices/version.rb index 39032cc..0deddaa 100644 --- a/lib/pdfservices/version.rb +++ b/lib/pdfservices/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module PdfServices - VERSION = "0.1.2" + VERSION = "0.1.3" end From fc90b6db91b0979d4d7be42b97ece1b44867d76b Mon Sep 17 00:00:00 2001 From: Jimmy Bosse Date: Tue, 7 Feb 2023 07:36:53 -0500 Subject: [PATCH 4/5] Remove crap --- test/pdf_services_sdk/test_document_merge.rb | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/pdf_services_sdk/test_document_merge.rb b/test/pdf_services_sdk/test_document_merge.rb index 60c1410..571fc0a 100644 --- a/test/pdf_services_sdk/test_document_merge.rb +++ b/test/pdf_services_sdk/test_document_merge.rb @@ -93,6 +93,3 @@ def pdf_headers {"Content-Type" => "application/pdf"} end end - -#stub_request(:post, "https://pdf-services.adobe.io/assets"). -#stub_request(:post, "https://pdf-services.adobe.io/assets"). From 78f5e2f72701d3eba7261274947ed164455f9830 Mon Sep 17 00:00:00 2001 From: Jimmy Bosse Date: Tue, 7 Feb 2023 07:40:30 -0500 Subject: [PATCH 5/5] gross --- test/integration_spikes/document_merge.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/integration_spikes/document_merge.rb b/test/integration_spikes/document_merge.rb index 7202ef2..319a854 100755 --- a/test/integration_spikes/document_merge.rb +++ b/test/integration_spikes/document_merge.rb @@ -10,11 +10,11 @@ .with_private_key(ENV["PDF_SERVICES_PRIVATE_KEY"]) .build -json = { message: "World"} +json = {message: "World"} word_file = File.join(Dir.pwd, "test", "fixtures", "files", "sample_template.docx") operation = ::PdfServices::DocumentMerge::Operation.new(credentials, word_file, json, "pdf") -result = operation.execute() +result = operation.execute puts(result.error)