onlyoffice_documentserver_conversion_helper 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: cddd11a1a80052f9232c9d8f1e6a2eb3fc066ed94dc1c407ec437869126abd49
4
+ data.tar.gz: da14479675d910bca3de929b55d4e9633f5f5a149438bccf52ce47b57e2793d7
5
+ SHA512:
6
+ metadata.gz: a4e053b7993029e73996d969771891fc201add85ccb1e20c7a2de55bdbf77415488196c64de9dd777c66ff97eb01bd9d2e635f2ed4e87f8027dfe806962db02c
7
+ data.tar.gz: 364db58bb120d6688738a4ecd77dfd47a4bdbca0d58ce597edff31a21f3619e9e466bf7413a99cf2c46cd24b1ced9bd05eb74d2fa3c350f967316ed6c803a55f
@@ -0,0 +1 @@
1
+ # onlyoffice_documentserver_conversion_helper
@@ -0,0 +1,120 @@
1
+ require 'jwt'
2
+ require 'net/http'
3
+ require 'securerandom'
4
+ require 'timeout'
5
+ require_relative 'onlyoffice_documentserver_conversion_helper/version'
6
+
7
+ # Stuff for working with conversion service
8
+ # See: https://api.onlyoffice.com/editors/conversionapi
9
+ module OnlyofficeDocumentserverConversionHelper
10
+ # ==== Examples
11
+ # ConvertFileData.new('https://doc-linux.teamlab.info').perform_convert('http://testrail-nct.tk/files/convertation_select/googerd.docx')
12
+ # ConvertFileData.new('https://doc-linux.teamlab.info').perform_convert({:url=>'http://testrail-nct.tk/files/convertation_select/googerd.docx'})
13
+ # ConvertFileData.new('https://doc-linux.teamlab.info').perform_convert({:url=>'http://testrail-nct.tk/files/convertation_select/googerd.docx', :outputtype => 'pdf'})
14
+ class ConvertFileData
15
+ attr_accessor :file_url
16
+ attr_accessor :key
17
+ attr_writer :input_filetype
18
+ attr_accessor :output_file_type
19
+
20
+ DOCUMENT_EXTENSIONS = %w[TXT HTML HTM ODT DOCT DOCX RTF DOC PDF].freeze
21
+ SPREADSHEET_EXTENSIONS = %w[XLS XLSX ODS XLST].freeze
22
+ PRESENTATION_EXTENSIONS = %w[PPT PPTX PPTT ODP].freeze
23
+
24
+ def initialize(server_path,
25
+ jwt_key: 'jwt_key',
26
+ jwt_header: 'AuthorizationJwt',
27
+ jwt_prefix: 'Bearer',
28
+ timeout: 300)
29
+ @server_path = server_path
30
+ @jwt_key = jwt_key
31
+ @jwt_header = jwt_header
32
+ @jwt_prefix = jwt_prefix
33
+ @timeout = timeout
34
+ end
35
+
36
+ def output_file_type_auto
37
+ return 'docx' if DOCUMENT_EXTENSIONS.include?(@input_filetype.upcase)
38
+ return 'xlsx' if SPREADSHEET_EXTENSIONS.include?(@input_filetype.upcase)
39
+ return 'pptx' if PRESENTATION_EXTENSIONS.include?(@input_filetype.upcase)
40
+ end
41
+
42
+ def key_auto
43
+ SecureRandom.uuid
44
+ end
45
+
46
+ def input_filetype
47
+ File.extname(@file_url).delete('.')
48
+ end
49
+
50
+ def convert_url
51
+ "#{@server_path}/ConvertService.ashx"
52
+ end
53
+
54
+ def autocomplete_missing_params(params)
55
+ params[:key] = key_auto unless params.key?(:key)
56
+ params[:outputtype] = output_file_type_auto unless params.key?(:outputtype)
57
+ params[:filetype] = input_filetype unless params.key?(:filetype)
58
+ params
59
+ end
60
+
61
+ # @return [String] with url to result file
62
+ # @param [String] data is a response body
63
+ # @param [String] file_format is a format of result file
64
+ # Method will get link from response body. Link start from 'https', and end from result file format
65
+ def get_url_from_responce(data, file_format)
66
+ res_result = /(http|https).*(#{file_format})/.match(data)
67
+ CGI.unescapeHTML(res_result.to_s)
68
+ end
69
+
70
+ def add_jwt_data(request)
71
+ payload_to_encode = { 'payload' => '{}' }
72
+ jwt_encoded = JWT.encode payload_to_encode, @jwt_key
73
+ request[@jwt_header] = "#{@jwt_prefix} #{jwt_encoded}"
74
+ end
75
+
76
+ def request(convert_url, params)
77
+ uri = URI(convert_url)
78
+ req = Net::HTTP::Post.new(uri)
79
+ req.body = params.to_json
80
+ add_jwt_data(req)
81
+ http = Net::HTTP.new(uri.host, uri.port)
82
+ http.read_timeout = @timeout
83
+ http.use_ssl = true if uri.scheme == 'https'
84
+ send_request(http, req)
85
+ end
86
+
87
+ # sending request every 5 second within @timeout
88
+ # responce will contain 504 if
89
+ # return responce body
90
+ def send_request(http, req)
91
+ Timeout.timeout(@timeout) do
92
+ (@timeout / 5).times do
93
+ responce = http.request(req)
94
+ return responce.body unless responce.code == '504'
95
+ sleep 5
96
+ end
97
+ end
98
+ end
99
+
100
+ # @return [Hash] with usl for download file after conversion and response data
101
+ # @param [Hash] args collect all parameters of request OR [String] if you not need to use advensed params and want to set all etc params automaticly.
102
+ # All args, except of :url and if it is [Hash], will be attache in end of request
103
+ # ==== Examples
104
+ # perform_convert('https://google.com/filename.docx')
105
+ # perform_convert({:url => 'https://google.com/filename.docx'})
106
+ # perform_convert({:url => 'https://google.com/filename.docx',
107
+ # :key=>'askjdhaskdasdasdi',
108
+ # :outputtype => 'pdf'})
109
+ def perform_convert(args = {})
110
+ args = { url: args } if args.is_a?(String)
111
+ raise 'Parameter :url with link on file is necessary!!' if args[:url].nil? || args.nil?
112
+ @file_url = args[:url]
113
+ @input_filetype = File.extname(@file_url).delete('.')
114
+ advanced_params = autocomplete_missing_params(args)
115
+ data = request(convert_url, advanced_params)
116
+ url = get_url_from_responce(data, advanced_params[:outputtype])
117
+ { url: url, data: data }
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,6 @@
1
+ module OnlyofficeDocumentserverConversionHelper
2
+ # This module holds the OnlyofficeDocumentserverConversionHelper gem version
3
+ module Version
4
+ STRING = '0.1.1'.freeze
5
+ end
6
+ end
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: onlyoffice_documentserver_conversion_helper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Pavel Lobashov
8
+ - Dmitry Rotaty
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2018-08-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: jwt
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '2'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '2'
28
+ description: Helper method for using ONLYOFFICE DocumentServer conversion api
29
+ email:
30
+ - shockwavenn@gmail.com
31
+ - flaminestone@gmail.com
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - README.md
37
+ - lib/onlyoffice_documentserver_conversion_helper.rb
38
+ - lib/onlyoffice_documentserver_conversion_helper/version.rb
39
+ homepage: http://rubygems.org/gems/onlyoffice_documentserver_conversion_helper
40
+ licenses:
41
+ - AGPL-3.0
42
+ metadata: {}
43
+ post_install_message:
44
+ rdoc_options: []
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '2.1'
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ requirements: []
58
+ rubyforge_project:
59
+ rubygems_version: 2.7.6
60
+ signing_key:
61
+ specification_version: 4
62
+ summary: onlyoffice_documentserver_conversion_helper Gem
63
+ test_files: []