|
| 1 | +# frozen_string_literal: true |
| 2 | + |
| 3 | +require_relative "constants/errors" |
| 4 | +require_relative "constants/file" |
| 5 | +require_relative "constants/url" |
| 6 | + |
| 7 | +require_relative "utils/formatter" |
| 8 | + |
| 9 | +class ImageKitFile |
| 10 | + # This File class holds file related operations like |
| 11 | + # upload, list etc |
| 12 | + def initialize(req_obj) |
| 13 | + @req_obj = req_obj |
| 14 | + end |
| 15 | + |
| 16 | + def upload(file, file_name, options) |
| 17 | + # uploads files with required arguments |
| 18 | + # supports bot url and binary |
| 19 | + raise ArgumentError, MISSING_UPLOAD_FILE_PARAMETER unless file |
| 20 | + raise ArgumentError, MISSING_UPLOAD_FILE_PARAMETER unless file_name |
| 21 | + options = validate_upload_options(options || {}) |
| 22 | + if options.is_a?(FalseClass) |
| 23 | + raise ArgumentError, "Invalid Upload option" |
| 24 | + else |
| 25 | + headers = @req_obj.create_headers |
| 26 | + payload = {multipart: true, file: file, fileName: file_name}.merge(options) |
| 27 | + |
| 28 | + url = "#{URL::BASE_URL}#{URL::UPLOAD}" |
| 29 | + @req_obj.request("post", url, headers, payload) |
| 30 | + end |
| 31 | + end |
| 32 | + |
| 33 | + def update_details(file_id, options) |
| 34 | + # Update file detail by file_id and options |
| 35 | + |
| 36 | + unless (options.key? :tags) || (options.key? :custom_coordinates) |
| 37 | + raise ArgumentError, UPDATE_DATA_MISSING |
| 38 | + end |
| 39 | + unless options.fetch(:tags, []).is_a?(Array) |
| 40 | + raise ArgumentError, UPDATE_DATA_TAGS_INVALID |
| 41 | + end |
| 42 | + unless options.fetch(:custom_coordinates, "").is_a?(String) |
| 43 | + raise ArgumentError, UPDATE_DATA_COORDS_INVALID |
| 44 | + end |
| 45 | + url = "#{URL::BASE_URL}/#{file_id}/details/" |
| 46 | + headers = @req_obj.create_headers |
| 47 | + payload = request_formatter(options) |
| 48 | + @req_obj.request("patch", url, headers, payload.to_json) |
| 49 | + end |
| 50 | + |
| 51 | + def list(options) |
| 52 | + # returns list of files on ImageKit Server |
| 53 | + # :options dictionary of options |
| 54 | + formatted_options = request_formatter(options) |
| 55 | + raise KeyError(LIST_FILES_INPUT_MISSING) unless formatted_options.is_a?(Hash) |
| 56 | + url = URL::BASE_URL |
| 57 | + headers = @req_obj.create_headers.update({params: options}) |
| 58 | + @req_obj.request("get", url, headers, options) |
| 59 | + end |
| 60 | + |
| 61 | + def details(file_identifier) |
| 62 | + # Get detail of file by file_identifier |
| 63 | + url = "#{URL::BASE_URL}/#{file_identifier}/details/" |
| 64 | + headers = @req_obj.create_headers |
| 65 | + @req_obj.request("get", url, headers) |
| 66 | + end |
| 67 | + |
| 68 | + def get_metadata(file_id) |
| 69 | + # Get metadata of a file by file_id |
| 70 | + url = "#{URL::BASE_URL}/#{file_id}/metadata" |
| 71 | + @req_obj.request("get", url, @req_obj.create_headers) |
| 72 | + end |
| 73 | + |
| 74 | + def delete(file_id) |
| 75 | + # Delete a file_id by file_id |
| 76 | + url = "#{URL::BASE_URL}/#{file_id}" |
| 77 | + headers = @req_obj.create_headers |
| 78 | + @req_obj.request("delete", url, headers) |
| 79 | + end |
| 80 | + |
| 81 | + def batch_delete(file_ids) |
| 82 | + url = "#{URL::BASE_URL}#{URL::BULK_FILE_DELETE}" |
| 83 | + payload = {'fileIds': file_ids} |
| 84 | + @req_obj.request("post", url, @req_obj.create_headers, payload.to_json) |
| 85 | + end |
| 86 | + |
| 87 | + def purge_cache(file_url) |
| 88 | + |
| 89 | + # purges cache from server by file_url |
| 90 | + |
| 91 | + url = "#{URL::BASE_URL}/purge" |
| 92 | + payload = {'url': file_url} |
| 93 | + @req_obj.request("post", url, @req_obj.create_headers, payload) |
| 94 | + end |
| 95 | + |
| 96 | + def purge_cache_status(request_id) |
| 97 | + # This function is to get cache_status |
| 98 | + url = "#{URL::BASE_URL}/purge/#{request_id}" |
| 99 | + @req_obj.request("get", url, @req_obj.create_headers) |
| 100 | + end |
| 101 | + |
| 102 | + def get_metadata_from_remote_url(remote_file_url) |
| 103 | + if remote_file_url == "" |
| 104 | + raise ArgumentError, "remote_file_url is required" |
| 105 | + end |
| 106 | + url = "#{URL::REMOTE_METADATA_FULL_URL}?url=#{remote_file_url}" |
| 107 | + @req_obj.request("get", url, @req_obj.create_headers) |
| 108 | + end |
| 109 | + |
| 110 | + def validate_upload_options(options) |
| 111 | + |
| 112 | + # Validates upload value, checks if params are valid, |
| 113 | + # changes snake to camel case which is supported by |
| 114 | + # ImageKit server |
| 115 | + |
| 116 | + |
| 117 | + response_list = [] |
| 118 | + options.each do |key, val| |
| 119 | + if VALID_UPLOAD_OPTIONS.include?(key.to_s) |
| 120 | + if val.is_a?(Array) |
| 121 | + val = val.join(",") |
| 122 | + end |
| 123 | + if val.is_a?(TrueClass) || val.is_a?(FalseClass) |
| 124 | + val = val.to_s |
| 125 | + end |
| 126 | + options[key] = val |
| 127 | + else |
| 128 | + return false |
| 129 | + end |
| 130 | + end |
| 131 | + request_formatter(options) |
| 132 | + end |
| 133 | +end |
0 commit comments