aboutsummaryrefslogtreecommitdiffstats
path: root/app/services
diff options
context:
space:
mode:
Diffstat (limited to 'app/services')
-rw-r--r--app/services/file_service.rb23
-rw-r--r--app/services/http_service.rb36
-rw-r--r--app/services/zip_service.rb55
3 files changed, 114 insertions, 0 deletions
diff --git a/app/services/file_service.rb b/app/services/file_service.rb
new file mode 100644
index 000000000..efccbe24f
--- /dev/null
+++ b/app/services/file_service.rb
@@ -0,0 +1,23 @@
+module FileService extend self
+
+ def unique_filename( path, enum_with: with_ints )
+ file_names = enum_with.map( &file_name_maker(path) )
+ file_names
+ .drop_while( &File.method(:exists?) )
+ .next
+ end
+
+ def with_ints(format='%d')
+ (0..Float::INFINITY)
+ .lazy
+ .map{ |n| format % n }
+ end
+
+
+ private
+
+ def file_name_maker path
+ ->(n){ [path, n].join('_') }
+ end
+
+end
diff --git a/app/services/http_service.rb b/app/services/http_service.rb
new file mode 100644
index 000000000..a3c4d2569
--- /dev/null
+++ b/app/services/http_service.rb
@@ -0,0 +1,36 @@
+class HTTPService
+ def self.get_resource(*args)
+ new.get_resource(*args)
+ end
+
+ def get_resource(host:, path:, token: nil, params: {}, parse_json: false)
+ Faraday.new(url: host) do |c|
+ c.headers['Authorization'] = "Token token=#{token.inspect}" if token
+ c.adapter Faraday.default_adapter
+
+ resp = c.get path, params
+ if resp.status == 200
+ return parse_json ? JSON.parse(resp.body) : resp.body
+ else
+ raise "Error on api request status : #{resp.status} => #{resp.body}"
+ end
+ end
+ end
+
+ def post_resource(host:, path:, resource_name:, token: nil, params: {}, upload: nil)
+ Faraday.new(url: host) do |c|
+ c.headers['Authorization'] = "Token token=#{token.inspect}" if token
+ c.request :multipart
+ c.request :url_encoded
+ c.adapter Faraday.default_adapter
+
+ if upload
+ name = upload.keys.first
+ value, mime_type, as_name = upload.values.first
+ params.update( name => Faraday::UploadIO.new(value, mime_type, as_name ) )
+ end
+
+ c.post path, resource_name => params
+ end
+ end
+end
diff --git a/app/services/zip_service.rb b/app/services/zip_service.rb
new file mode 100644
index 000000000..778bfd06d
--- /dev/null
+++ b/app/services/zip_service.rb
@@ -0,0 +1,55 @@
+class ZipService
+
+ attr_reader :current_entry, :zip_data
+
+ def initialize data
+ @zip_data = data
+ @current_entry = nil
+ end
+
+ class << self
+ def convert_entries entries
+ -> output_stream do
+ entries.each do |e|
+ output_stream.put_next_entry e.name
+ output_stream.write e.get_input_stream.read
+ end
+ end
+ end
+
+ def entries input_stream
+ Enumerator.new do |enum|
+ loop{ enum << input_stream.get_next_entry }
+ end.lazy.take_while{ |e| e }
+ end
+ end
+
+ def entry_groups
+ self.class.entries(input_stream).group_by(&method(:entry_key))
+ end
+
+ def entry_group_streams
+ entry_groups.map(&method(:make_stream)).to_h
+ end
+
+ def entry_key entry
+ entry.name.split('/', -1)[-2]
+ end
+
+ def make_stream pair
+ name, entries = pair
+ [name, make_stream_from( entries )]
+ end
+
+ def make_stream_from entries
+ Zip::OutputStream.write_buffer(&self.class.convert_entries(entries))
+ end
+
+ def next_entry
+ @current_entry = input_stream.get_next_entry
+ end
+
+ def input_stream
+ @__input_stream__ ||= Zip::InputStream.open(StringIO.new(zip_data))
+ end
+end