Skip to content

Commit 11f2685

Browse files
committed
chore: file operation added
1 parent 59b760d commit 11f2685

File tree

3 files changed

+259
-0
lines changed

3 files changed

+259
-0
lines changed

lib/imagekit/file.rb

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
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

lib/imagekit/resource.rb

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# frozen_string_literal: true
2+
3+
require "base64"
4+
require "rest-client"
5+
require "json"
6+
require_relative "constants/defaults"
7+
8+
# ImageKitRequest requests and sends data from server
9+
class ImageKitRequest
10+
attr_reader :private_key, :public_key, :url_endpoint, :transformation_position, :options
11+
12+
def initialize(private_key, public_key, url_endpoint, transformation_position = nil, options = nil)
13+
@private_key = private_key
14+
@public_key = public_key
15+
@url_endpoint = url_endpoint
16+
@transformation_position = transformation_position || Default::TRANSFORMATION_POSITION
17+
@options = options || {}
18+
end
19+
20+
# creates required headers
21+
def create_headers
22+
headers = {'Accept-Encoding': "application/json", 'Content-Type': "application/json"}
23+
headers.update(auth_headers)
24+
end
25+
26+
def auth_headers
27+
encoded_private_key = Base64.strict_encode64(@private_key+":")
28+
{Authorization: "Basic #{encoded_private_key}"}
29+
end
30+
31+
# request method communicates with server
32+
def request(method, url, headers = nil, payload = nil)
33+
headers ||= create_headers
34+
response = {response: nil, error: nil}
35+
begin
36+
resp = RestClient::Request.new(method: method,
37+
url: url,
38+
headers: headers,
39+
payload: payload).execute
40+
41+
42+
if resp.code == 404
43+
raise RestClient::ExceptionWithResponse
44+
elsif (resp.code >= 200) && (resp.code < 204)
45+
response[:response] = JSON.parse(resp.body.to_s)
46+
elsif resp.code == 204
47+
response[:response] = {'success': true}
48+
end
49+
50+
rescue RestClient::ExceptionWithResponse => err
51+
err.http_code == 404 ? response[:error] = {'message': err.response.to_s} : JSON.parse(err.response)
52+
end
53+
response
54+
end
55+
end

lib/imagekit/sdk.rb

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
require "imagekit/sdk/railtie"
2+
3+
require 'carrierwave'
4+
require 'base64'
5+
require_relative '../carrierwave/storage/imagekit_store'
6+
require_relative '../carrierwave/storage/ik_file'
7+
require_relative '../carrierwave/support/uri_filename'
8+
require_relative './imagekit.rb'
9+
require_relative "./resource"
10+
require_relative "./file"
11+
require_relative "./url"
12+
require_relative "./utils/calculation"
13+
module CarrierWave
14+
module Uploader
15+
class Base
16+
17+
def initialize(*)
18+
ik_config=Rails.application.config.imagekit
19+
@imagekit=ImageKit::ImageKitClient.new(ik_config[:private_key],ik_config[:public_key],ik_config[:url_endpoint])
20+
@options={}
21+
end
22+
23+
configure do |config|
24+
config.storage_engines[:imagekit_store] = 'CarrierWave::Storage::ImageKitStore'
25+
end
26+
27+
def filename
28+
if options!=nil
29+
@options=options
30+
end
31+
if self.file!=nil
32+
base64=Base64.encode64(::File.open(self.file.file, "rb").read)
33+
resp=@imagekit.upload_file(open(self.file.file,'rb'),self.file.filename,@options)
34+
::File.delete(self.file.file)
35+
res=resp[:response].to_json
36+
if res!="null"
37+
res
38+
else
39+
"{\"filePath\":\"\",\"url\":\"\",\"name\":\"\"}"
40+
end
41+
else
42+
"{\"filePath\":\"\",\"url\":\"\",\"name\":\"\"}"
43+
end
44+
end
45+
46+
def fileId
47+
JSON.parse(self.identifier)['fileId']
48+
end
49+
50+
def blob
51+
JSON.parse(self.identifier)
52+
end
53+
54+
def url_with(opt)
55+
path=JSON.parse(self.identifier)['filePath']
56+
opt[:path]=path
57+
url=@imagekit.url(opt)
58+
end
59+
60+
def url
61+
JSON.parse(self.identifier)['url']
62+
end
63+
64+
def options
65+
options={}
66+
end
67+
end
68+
69+
end
70+
71+
end

0 commit comments

Comments
 (0)