diff options
Diffstat (limited to 'app/services')
| -rw-r--r-- | app/services/file_service.rb | 23 | ||||
| -rw-r--r-- | app/services/http_service.rb | 36 | ||||
| -rw-r--r-- | app/services/zip_service.rb | 55 |
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 |
