cloudinary 1.18.0 → 1.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug_report.md +15 -14
- data/.github/ISSUE_TEMPLATE/feature_request.md +1 -1
- data/.github/pull_request_template.md +18 -11
- data/CHANGELOG.md +69 -0
- data/cloudinary.gemspec +8 -3
- data/lib/active_storage/service/cloudinary_service.rb +23 -3
- data/lib/cloudinary.rb +54 -64
- data/lib/cloudinary/account_api.rb +226 -0
- data/lib/cloudinary/account_config.rb +30 -0
- data/lib/cloudinary/api.rb +65 -78
- data/lib/cloudinary/auth_token.rb +4 -0
- data/lib/cloudinary/base_api.rb +79 -0
- data/lib/cloudinary/base_config.rb +70 -0
- data/lib/cloudinary/config.rb +43 -0
- data/lib/cloudinary/search.rb +40 -7
- data/lib/cloudinary/uploader.rb +52 -23
- data/lib/cloudinary/utils.rb +216 -29
- data/lib/cloudinary/version.rb +1 -1
- data/vendor/assets/javascripts/cloudinary/jquery.cloudinary.js +16 -4
- metadata +17 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fbc5f576707d33b684e97610585e92838695cbd373cace7c16b0078021b46871
|
4
|
+
data.tar.gz: a5fc7e5d8f0930223cb03b4ca07910ba3b8a6e8ac18b5d6028f9a8963311f8d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 888d693726c91cba5113ca6d4e13f89b859fc01fde5603ace994eb13a907881d4d5e84a7150501c970b1792c47286ae4a9d889f61b1e41408e25a4aea20cf11d
|
7
|
+
data.tar.gz: 6a76cfcc6187c87314f1676a769b8fbfcfda08a5a22d00403f689056a680e4acb15d7360b919a2132c254295c8439e2072be74a8a2891362920f217d387d14ef
|
@@ -3,7 +3,7 @@ name: Bug report
|
|
3
3
|
about: Bug report for Cloudinary Ruby SDK
|
4
4
|
title: ''
|
5
5
|
labels: ''
|
6
|
-
assignees:
|
6
|
+
assignees: ''
|
7
7
|
|
8
8
|
---
|
9
9
|
|
@@ -14,11 +14,11 @@ Before proceeding, please update to latest version and test if the issue persist
|
|
14
14
|
…
|
15
15
|
|
16
16
|
## Issue Type (Can be multiple)
|
17
|
-
[ ] Build -
|
18
|
-
[ ] Performance - Performance issues
|
19
|
-
[ ] Behaviour - Functions
|
20
|
-
[ ] Documentation - Inconsistency between the docs and behaviour
|
21
|
-
[ ] Other (Specify)
|
17
|
+
- [ ] Build - Cannot install or import the SDK
|
18
|
+
- [ ] Performance - Performance issues
|
19
|
+
- [ ] Behaviour - Functions are not working as expected (such as generate URL)
|
20
|
+
- [ ] Documentation - Inconsistency between the docs and behaviour
|
21
|
+
- [ ] Other (Specify)
|
22
22
|
|
23
23
|
## Steps to reproduce
|
24
24
|
… if applicable
|
@@ -27,16 +27,17 @@ Before proceeding, please update to latest version and test if the issue persist
|
|
27
27
|
…
|
28
28
|
|
29
29
|
## Operating System
|
30
|
-
[ ] Linux
|
31
|
-
[ ] Windows
|
32
|
-
[ ]
|
33
|
-
[ ] All
|
30
|
+
- [ ] Linux
|
31
|
+
- [ ] Windows
|
32
|
+
- [ ] macOS
|
33
|
+
- [ ] All
|
34
34
|
|
35
35
|
## Environment and Libraries (fill in the version numbers)
|
36
|
-
Cloudinary Ruby SDK version - 0.0.0
|
37
|
-
Ruby Version - 0.0.0
|
38
|
-
Rails Version - 0.0.0
|
39
|
-
Other Libraries (Carrierwave, ActiveStorage, etc) - 0.0.0
|
36
|
+
- Cloudinary Ruby SDK version - 0.0.0
|
37
|
+
- Ruby Version - 0.0.0
|
38
|
+
- Rails Version - 0.0.0
|
39
|
+
- Other Libraries (Carrierwave, ActiveStorage, etc) - 0.0.0
|
40
40
|
|
41
41
|
## Repository
|
42
|
+
|
42
43
|
If possible, please provide a link to a reproducible repository that showcases the problem
|
@@ -4,21 +4,28 @@ Provide some context as to what was changed, from an implementation standpoint.
|
|
4
4
|
-->
|
5
5
|
|
6
6
|
#### What does this PR address?
|
7
|
-
[ ]
|
8
|
-
[ ] Refactoring
|
9
|
-
[ ] New feature
|
10
|
-
[ ] Bug fix
|
11
|
-
[ ] Adds more tests
|
7
|
+
- [ ] GitHub issue (Add reference - #XX)
|
8
|
+
- [ ] Refactoring
|
9
|
+
- [ ] New feature
|
10
|
+
- [ ] Bug fix
|
11
|
+
- [ ] Adds more tests
|
12
12
|
|
13
13
|
#### Are tests included?
|
14
|
-
[ ] Yes
|
15
|
-
[ ] No
|
14
|
+
- [ ] Yes
|
15
|
+
- [ ] No
|
16
16
|
|
17
|
-
#### Reviewer,
|
17
|
+
#### Reviewer, please note:
|
18
18
|
<!--
|
19
19
|
List anything here that the reviewer should pay special attention to. This might
|
20
20
|
include, for example:
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
* Dependence on other PRs
|
22
|
+
* Reference to other Cloudinary SDKs
|
23
|
+
* Changes that seem arbitrary without further explanations
|
24
24
|
-->
|
25
|
+
|
26
|
+
#### Checklist:
|
27
|
+
<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
|
28
|
+
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
|
29
|
+
- [ ] My code follows the code style of this project.
|
30
|
+
- [ ] My change requires a change to the documentation.
|
31
|
+
- [ ] I ran the full test suite before pushing the changes and all the tests pass.
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,72 @@
|
|
1
|
+
1.21.0 / 2021-08-23
|
2
|
+
==================
|
3
|
+
|
4
|
+
New functionality and features
|
5
|
+
------------------------------
|
6
|
+
|
7
|
+
* Add support for `create_slideshow` Upload API
|
8
|
+
* Add support for variables in text style
|
9
|
+
* Add support for `context` and `metadata` in `rename` Upload API
|
10
|
+
* Add support for `reorder_metadata_field_datasource` Admin API
|
11
|
+
* Add `verify_api_response_signature` and `verify_notification_signature` helpers
|
12
|
+
* Add `download_generated_sprite` and `download_multi` methods
|
13
|
+
* Add support for `urls` in multi and sprite APIs
|
14
|
+
* Add support for `live` parameter in upload presets
|
15
|
+
* Add support for `metadata` parameter in `resources` Admin APIs
|
16
|
+
|
17
|
+
Other Changes
|
18
|
+
-------------
|
19
|
+
|
20
|
+
* Fix `transformations` API call
|
21
|
+
* Fix named parameters normalization issue
|
22
|
+
* Remove duplicates in Search Api fields
|
23
|
+
* Improve configuration tests
|
24
|
+
* Add tests for Provisioning API
|
25
|
+
* Refactor metadata usage in tests
|
26
|
+
* Update GitHub templates
|
27
|
+
|
28
|
+
1.20.0 / 2021-03-26
|
29
|
+
==================
|
30
|
+
|
31
|
+
New functionality and features
|
32
|
+
------------------------------
|
33
|
+
|
34
|
+
* Add support for `download_backedup_asset` helper method
|
35
|
+
* Add support for `filename_override` upload parameter
|
36
|
+
* Add support for `SHA-256` algorithm in auth signatures
|
37
|
+
|
38
|
+
Other Changes
|
39
|
+
-------------
|
40
|
+
|
41
|
+
* Fix `type` parameter support in ActiveStorage service
|
42
|
+
* Fix expression normalization in advanced cases
|
43
|
+
* Add test for context metadata as user variables
|
44
|
+
* Improve validation of auth token generation
|
45
|
+
|
46
|
+
|
47
|
+
1.19.0 / 2021-03-05
|
48
|
+
==================
|
49
|
+
|
50
|
+
New functionality and features
|
51
|
+
------------------------------
|
52
|
+
|
53
|
+
* Add Account Provisioning API
|
54
|
+
* Add support for `api_proxy` parameter
|
55
|
+
* Add support for `date` parameter in `usage` Admin API
|
56
|
+
|
57
|
+
Other Changes
|
58
|
+
-------------
|
59
|
+
|
60
|
+
* Fix direct upload of raw files
|
61
|
+
* Improve unit testing of add-ons
|
62
|
+
* Change test for `eval` upload parameter
|
63
|
+
* Bump vulnerable version of rubyzip
|
64
|
+
* Fix `cloudinary.gemspec` glob issue
|
65
|
+
|
66
|
+
1.18.1 / 2020-09-30
|
67
|
+
===================
|
68
|
+
|
69
|
+
* Update embedded `jquery.cloudinary.js` to fix ES5 compatibility issue
|
1
70
|
|
2
71
|
1.18.0 / 2020-09-27
|
3
72
|
===================
|
data/cloudinary.gemspec
CHANGED
@@ -15,12 +15,17 @@ Gem::Specification.new do |s|
|
|
15
15
|
|
16
16
|
s.rubyforge_project = "cloudinary"
|
17
17
|
|
18
|
-
s.files =
|
18
|
+
s.files = `git ls-files`.split("\n").select { |f| !f.start_with?("test", "spec", "features", "samples") } + Dir.glob("vendor/assets/javascripts/*/*") + Dir.glob("vendor/assets/html/*")
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
20
|
s.require_paths = ["lib"]
|
21
21
|
|
22
22
|
s.add_dependency "aws_cf_signer"
|
23
|
-
|
23
|
+
|
24
|
+
if RUBY_VERSION >= "2.0.0"
|
25
|
+
s.add_dependency "rest-client", ">= 2.0.0"
|
26
|
+
else
|
27
|
+
s.add_dependency "rest-client"
|
28
|
+
end
|
24
29
|
|
25
30
|
s.add_development_dependency "actionpack"
|
26
31
|
s.add_development_dependency "nokogiri"
|
@@ -39,7 +44,7 @@ Gem::Specification.new do |s|
|
|
39
44
|
s.add_development_dependency "railties", "<= 4.2.7" if RUBY_VERSION <= "1.9.3"
|
40
45
|
s.add_development_dependency "rspec-rails"
|
41
46
|
|
42
|
-
s.add_development_dependency "rubyzip"
|
47
|
+
s.add_development_dependency "rubyzip"
|
43
48
|
|
44
49
|
if RUBY_VERSION <= "2.4.0"
|
45
50
|
s.add_development_dependency "simplecov", "<= 0.17.1" # support testing Ruby 1.9
|
@@ -72,6 +72,14 @@ module ActiveStorage
|
|
72
72
|
instrument :url, key: key do |payload|
|
73
73
|
options = {:resource_type => resource_type(nil, key)}.merge(@options.merge(options.symbolize_keys))
|
74
74
|
options[:public_id] = public_id_internal(key)
|
75
|
+
# Provide file format for raw files, since js client does not include original file name.
|
76
|
+
#
|
77
|
+
# When the file is uploaded from the server, the request includes original filename. That allows Cloudinary
|
78
|
+
# to identify file extension and append it to the public id of the file (raw files include file extension
|
79
|
+
# in their public id, opposed to transformable assets (images/video) that use only basename). When uploading
|
80
|
+
# through direct upload (client side js), filename is missing, and that leads to inconsistent/broken URLs.
|
81
|
+
# To avoid that, we explicitly pass file format in options.
|
82
|
+
options[:format] = ext_for_file(key) if options[:resource_type] == "raw"
|
75
83
|
options[:context] = {active_storage_key: key}
|
76
84
|
options.delete(:file)
|
77
85
|
payload[:url] = api_uri("upload", options)
|
@@ -87,7 +95,12 @@ module ActiveStorage
|
|
87
95
|
|
88
96
|
def delete(key)
|
89
97
|
instrument :delete, key: key do
|
90
|
-
|
98
|
+
options = {
|
99
|
+
resource_type: resource_type(nil, key),
|
100
|
+
type: @options[:type]
|
101
|
+
}.compact
|
102
|
+
|
103
|
+
Cloudinary::Uploader.destroy public_id(key), **options
|
91
104
|
end
|
92
105
|
end
|
93
106
|
|
@@ -99,7 +112,12 @@ module ActiveStorage
|
|
99
112
|
def exist?(key)
|
100
113
|
instrument :exist, key: key do |payload|
|
101
114
|
begin
|
102
|
-
|
115
|
+
options = {
|
116
|
+
resource_type: resource_type(nil, key),
|
117
|
+
type: @options[:type]
|
118
|
+
}.compact
|
119
|
+
|
120
|
+
Cloudinary::Api.resource public_id(key), **options
|
103
121
|
true
|
104
122
|
rescue Cloudinary::Api::NotFound => e
|
105
123
|
false
|
@@ -174,7 +192,7 @@ module ActiveStorage
|
|
174
192
|
# @param [string] content_type The content type of the file.
|
175
193
|
#
|
176
194
|
# @return [string] The extension of the filename.
|
177
|
-
def ext_for_file(key, filename, content_type)
|
195
|
+
def ext_for_file(key, filename = nil, content_type = nil)
|
178
196
|
if filename.blank?
|
179
197
|
options = key.respond_to?(:attributes) ? key.attributes : {}
|
180
198
|
filename = ActiveStorage::Filename.new(options[:filename]) if options.has_key?(:filename)
|
@@ -200,6 +218,8 @@ module ActiveStorage
|
|
200
218
|
end
|
201
219
|
|
202
220
|
def content_type_to_resource_type(content_type)
|
221
|
+
return 'image' if content_type.nil?
|
222
|
+
|
203
223
|
type, subtype = content_type.split('/')
|
204
224
|
case type
|
205
225
|
when 'video', 'audio'
|
data/lib/cloudinary.rb
CHANGED
@@ -16,7 +16,12 @@ require "cloudinary/missing"
|
|
16
16
|
module Cloudinary
|
17
17
|
autoload :Utils, 'cloudinary/utils'
|
18
18
|
autoload :Uploader, 'cloudinary/uploader'
|
19
|
+
autoload :BaseConfig, "cloudinary/base_config"
|
20
|
+
autoload :Config, "cloudinary/config"
|
21
|
+
autoload :AccountConfig, "cloudinary/account_config"
|
22
|
+
autoload :BaseApi, "cloudinary/base_api"
|
19
23
|
autoload :Api, "cloudinary/api"
|
24
|
+
autoload :AccountApi, "cloudinary/account_api"
|
20
25
|
autoload :Downloader, "cloudinary/downloader"
|
21
26
|
autoload :Blob, "cloudinary/blob"
|
22
27
|
autoload :PreloadedFile, "cloudinary/preloaded_file"
|
@@ -58,64 +63,42 @@ module Cloudinary
|
|
58
63
|
"ept" => "eps"
|
59
64
|
}
|
60
65
|
|
61
|
-
|
62
|
-
|
66
|
+
# Cloudinary config
|
67
|
+
#
|
68
|
+
# @param [Hash] new_config If +new_config+ is passed, Config will be updated with it
|
69
|
+
# @yieldparam [OpenStruct] Config can be updated in the block
|
70
|
+
#
|
71
|
+
# @return [OpenStruct]
|
63
72
|
def self.config(new_config=nil)
|
64
|
-
|
65
|
-
@@config ||= OpenStruct.new((YAML.load(ERB.new(IO.read(config_dir.join("cloudinary.yml"))).result)[config_env] rescue {}))
|
66
|
-
|
67
|
-
config_from_env if first_time
|
73
|
+
@@config ||= make_new_config(Config)
|
68
74
|
|
69
|
-
|
70
|
-
yield
|
75
|
+
@@config.update(new_config) if new_config
|
76
|
+
yield @@config if block_given?
|
71
77
|
|
72
78
|
@@config
|
73
79
|
end
|
74
80
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
set_config(
|
84
|
-
"cloud_name" => uri.host,
|
85
|
-
"api_key" => uri.user,
|
86
|
-
"api_secret" => uri.password,
|
87
|
-
"private_cdn" => !uri.path.blank?,
|
88
|
-
"secure_distribution" => uri.path[1..-1]
|
89
|
-
)
|
90
|
-
uri.query.to_s.split("&").each do
|
91
|
-
|param|
|
92
|
-
key, value = param.split("=")
|
93
|
-
if isNestedKey? key
|
94
|
-
putNestedKey key, value
|
95
|
-
else
|
96
|
-
set_config(key => Utils.smart_unescape(value))
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
81
|
+
# Cloudinary account config
|
82
|
+
#
|
83
|
+
# @param [Hash] new_config If +new_config+ is passed, Account Config will be updated with it
|
84
|
+
# @yieldparam [OpenStruct] Account config can be updated in the block
|
85
|
+
#
|
86
|
+
# @return [OpenStruct]
|
87
|
+
def self.account_config(new_config=nil)
|
88
|
+
@@account_config ||= make_new_config(AccountConfig)
|
100
89
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
chain.each do |innerKey|
|
106
|
-
inner = outer[innerKey]
|
107
|
-
if inner.nil?
|
108
|
-
inner = OpenStruct.new
|
109
|
-
outer[innerKey] = inner
|
110
|
-
end
|
111
|
-
outer = inner
|
112
|
-
end
|
113
|
-
outer[lastKey] = value
|
90
|
+
@@account_config.update(new_config) if new_config
|
91
|
+
yield @@account_config if block_given?
|
92
|
+
|
93
|
+
@@account_config
|
114
94
|
end
|
115
95
|
|
96
|
+
def self.config_from_url(url)
|
97
|
+
config.load_from_url(url)
|
98
|
+
end
|
116
99
|
|
117
|
-
def self.
|
118
|
-
|
100
|
+
def self.config_from_account_url(url)
|
101
|
+
account_config.load_from_url(url)
|
119
102
|
end
|
120
103
|
|
121
104
|
def self.app_root
|
@@ -129,22 +112,6 @@ module Cloudinary
|
|
129
112
|
|
130
113
|
private
|
131
114
|
|
132
|
-
def self.config_from_env
|
133
|
-
# Heroku support
|
134
|
-
if ENV["CLOUDINARY_CLOUD_NAME"]
|
135
|
-
config_keys = ENV.keys.select! { |key| key.start_with? "CLOUDINARY_" }
|
136
|
-
config_keys -= ["CLOUDINARY_URL"] # ignore it when explicit options are passed
|
137
|
-
config_keys.each do |full_key|
|
138
|
-
conf_key = full_key["CLOUDINARY_".length..-1].downcase # convert "CLOUDINARY_CONFIG_NAME" to "config_name"
|
139
|
-
conf_val = ENV[full_key]
|
140
|
-
conf_val = conf_val == 'true' if %w[true false].include?(conf_val) # cast relevant boolean values
|
141
|
-
set_config(conf_key => conf_val)
|
142
|
-
end
|
143
|
-
elsif ENV["CLOUDINARY_URL"]
|
144
|
-
config_from_url(ENV["CLOUDINARY_URL"])
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
115
|
def self.config_env
|
149
116
|
return ENV["CLOUDINARY_ENV"] if ENV["CLOUDINARY_ENV"]
|
150
117
|
return Rails.env if defined? Rails::env
|
@@ -159,6 +126,29 @@ module Cloudinary
|
|
159
126
|
def self.set_config(new_config)
|
160
127
|
new_config.each{|k,v| @@config.send(:"#{k}=", v) if !v.nil?}
|
161
128
|
end
|
129
|
+
|
130
|
+
# Builds config from yaml file, extends it with specific module and loads configuration from environment variable
|
131
|
+
#
|
132
|
+
# @param [Module] config_module Config is extended with this module after being built
|
133
|
+
#
|
134
|
+
# @return [OpenStruct]
|
135
|
+
def self.make_new_config(config_module)
|
136
|
+
import_settings_from_file.tap do |config|
|
137
|
+
config.extend(config_module)
|
138
|
+
config.load_config_from_env
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
private_class_method :make_new_config
|
143
|
+
|
144
|
+
# Import settings from yaml file
|
145
|
+
#
|
146
|
+
# @return [OpenStruct]
|
147
|
+
def self.import_settings_from_file
|
148
|
+
OpenStruct.new((YAML.load(ERB.new(IO.read(config_dir.join("cloudinary.yml"))).result)[config_env] rescue {}))
|
149
|
+
end
|
150
|
+
|
151
|
+
private_class_method :import_settings_from_file
|
162
152
|
end
|
163
153
|
# Prevent require loop if included after Rails is already initialized.
|
164
154
|
require "cloudinary/helper" if defined?(::ActionView::Base)
|
@@ -0,0 +1,226 @@
|
|
1
|
+
class Cloudinary::AccountApi
|
2
|
+
extend Cloudinary::BaseApi
|
3
|
+
|
4
|
+
# Creates a new sub-account. Any users that have access to all sub-accounts will also automatically have access to the
|
5
|
+
# new sub-account.
|
6
|
+
# @param [String] name The display name as shown in the management console
|
7
|
+
# @param [String] cloud_name A case-insensitive cloud name comprised of alphanumeric and underscore characters.
|
8
|
+
# Generates an error if the specified cloud name is not unique across all Cloudinary accounts.
|
9
|
+
# Note: Once created, the name can only be changed for accounts with fewer than 1000 assets.
|
10
|
+
# @param [Object] custom_attributes Any custom attributes you want to associate with the sub-account
|
11
|
+
# @param [Boolean] enabled Whether to create the account as enabled (default is enabled)
|
12
|
+
# @param [String] base_account ID of sub-account from which to copy settings
|
13
|
+
# @param [Object] options additional options
|
14
|
+
def self.create_sub_account(name, cloud_name = nil, custom_attributes = {}, enabled = nil, base_account = nil, options = {})
|
15
|
+
params = {
|
16
|
+
name: name,
|
17
|
+
cloud_name: cloud_name,
|
18
|
+
custom_attributes: custom_attributes,
|
19
|
+
enabled: enabled,
|
20
|
+
base_sub_account_id: base_account
|
21
|
+
}
|
22
|
+
|
23
|
+
call_account_api(:post, 'sub_accounts', params, options.merge(content_type: :json))
|
24
|
+
end
|
25
|
+
|
26
|
+
# Updates the specified details of the sub-account.
|
27
|
+
# @param [String] sub_account_id The ID of the sub-account.
|
28
|
+
# @param [String] name The display name as shown in the management console
|
29
|
+
# @param [String] cloud_name A case-insensitive cloud name comprised of alphanumeric and underscore characters.
|
30
|
+
# Generates an error if the specified cloud name is not unique across all Cloudinary accounts.
|
31
|
+
# Note: Once created, the name can only be changed for accounts with fewer than 1000 assets.
|
32
|
+
# @param [Object] custom_attributes Any custom attributes you want to associate with the sub-account, as a map/hash
|
33
|
+
# of key/value pairs.
|
34
|
+
# @param [Boolean] enabled Whether the sub-account is enabled.
|
35
|
+
# @param [Object] options additional options
|
36
|
+
def self.update_sub_account(sub_account_id, name = nil, cloud_name = nil, custom_attributes = nil, enabled = nil, options = {})
|
37
|
+
params = {
|
38
|
+
name: name,
|
39
|
+
cloud_name: cloud_name,
|
40
|
+
custom_attributes: custom_attributes,
|
41
|
+
enabled: enabled
|
42
|
+
}
|
43
|
+
|
44
|
+
call_account_api(:put, ['sub_accounts', sub_account_id], params, options.merge(content_type: :json))
|
45
|
+
end
|
46
|
+
|
47
|
+
# Lists sub-accounts.
|
48
|
+
# @param [Boolean] enabled Whether to only return enabled sub-accounts (true) or disabled accounts (false).
|
49
|
+
# Default: all accounts are returned (both enabled and disabled).
|
50
|
+
# @param [Array<String>] ids A list of up to 100 sub-account IDs. When provided, other parameters are ignored.
|
51
|
+
# @param [String] prefix Returns accounts where the name begins with the specified case-insensitive string.
|
52
|
+
# @param [Object] options additional options
|
53
|
+
def self.sub_accounts(enabled = nil, ids = [], prefix = nil, options = {})
|
54
|
+
params = {
|
55
|
+
enabled: enabled,
|
56
|
+
ids: ids,
|
57
|
+
prefix: prefix
|
58
|
+
}
|
59
|
+
|
60
|
+
call_account_api(:get, 'sub_accounts', params, options.merge(content_type: :json))
|
61
|
+
end
|
62
|
+
|
63
|
+
# Retrieves the details of the specified sub-account.
|
64
|
+
# @param [String] sub_account_id The ID of the sub-account.
|
65
|
+
# @param [Object] options additional options
|
66
|
+
def self.sub_account(sub_account_id, options = {})
|
67
|
+
call_account_api(:get, ['sub_accounts', sub_account_id], {}, options.merge(content_type: :json))
|
68
|
+
end
|
69
|
+
|
70
|
+
# Deletes the specified sub-account. Supported only for accounts with fewer than 1000 assets.
|
71
|
+
# @param [String] sub_account_id The ID of the sub-account.
|
72
|
+
# @param [Object] options additional options
|
73
|
+
def self.delete_sub_account(sub_account_id, options = {})
|
74
|
+
call_account_api(:delete, ['sub_accounts', sub_account_id], {}, options)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Creates a new user in the account.
|
78
|
+
# @param [String] name The name of the user.
|
79
|
+
# @param [String] email A unique email address, which serves as the login name and notification address.
|
80
|
+
# @param [String] role The role to assign. Possible values: master_admin, admin, billing, technical_admin, reports,
|
81
|
+
# media_library_admin, media_library_user
|
82
|
+
# @param [Array<String>] sub_account_ids The list of sub-account IDs that this user can access.
|
83
|
+
# Note: This parameter is ignored if the role is specified as master_admin.
|
84
|
+
# @param [Object] options additional options
|
85
|
+
def self.create_user(name, email, role, sub_account_ids = [], options = {})
|
86
|
+
params = {
|
87
|
+
name: name,
|
88
|
+
email: email,
|
89
|
+
role: role,
|
90
|
+
sub_account_ids: sub_account_ids
|
91
|
+
}
|
92
|
+
|
93
|
+
call_account_api(:post, 'users', params, options.merge(content_type: :json))
|
94
|
+
end
|
95
|
+
|
96
|
+
# Deletes an existing user.
|
97
|
+
# @param [String] user_id The ID of the user to delete.
|
98
|
+
# @param [Object] options additional options
|
99
|
+
def self.delete_user(user_id, options = {})
|
100
|
+
call_account_api(:delete, ['users', user_id], {}, options)
|
101
|
+
end
|
102
|
+
|
103
|
+
# Updates the details of the specified user.
|
104
|
+
# @param [String] user_id The ID of the user to update.
|
105
|
+
# @param [String] name The name of the user.
|
106
|
+
# @param [String] email A unique email address, which serves as the login name and notification address.
|
107
|
+
# @param [String] role The role to assign. Possible values: master_admin, admin, billing, technical_admin, reports,
|
108
|
+
# media_library_admin, media_library_user
|
109
|
+
# @param [Array<String>] sub_account_ids The list of sub-account IDs that this user can access.
|
110
|
+
# Note: This parameter is ignored if the role is specified as master_admin.
|
111
|
+
# @param [Object] options additional options
|
112
|
+
def self.update_user(user_id, name = nil, email = nil, role = nil, sub_account_ids = nil, options = {})
|
113
|
+
params = {
|
114
|
+
name: name,
|
115
|
+
email: email,
|
116
|
+
role: role,
|
117
|
+
sub_account_ids: sub_account_ids
|
118
|
+
}
|
119
|
+
|
120
|
+
call_account_api(:put, ['users', user_id], params, options.merge(content_type: :json))
|
121
|
+
end
|
122
|
+
|
123
|
+
# Returns the user with the specified ID.
|
124
|
+
# @param [String] user_id The ID of the user.
|
125
|
+
# @param [Object] options additional options
|
126
|
+
def self.user(user_id, options = {})
|
127
|
+
call_account_api(:get, ['users', user_id], {}, options.merge(content_type: :json))
|
128
|
+
end
|
129
|
+
|
130
|
+
# Lists users in the account.
|
131
|
+
# @param [Boolean] pending Limit results to pending users (true), users that are not pending (false), or all users (nil, the default)
|
132
|
+
# @param [Array<String>] user_ids A list of up to 100 user IDs. When provided, other parameters are ignored.
|
133
|
+
# @param [String] prefix Returns users where the name or email address begins with the specified case-insensitive string.
|
134
|
+
# @param [String] sub_account_id Only returns users who have access to the specified account.
|
135
|
+
# @param [Object] options additional options
|
136
|
+
def self.users(pending = nil, user_ids = [], prefix = nil, sub_account_id = nil, options = {})
|
137
|
+
params = {
|
138
|
+
ids: user_ids,
|
139
|
+
prefix: prefix,
|
140
|
+
sub_account_id: sub_account_id,
|
141
|
+
pending: pending
|
142
|
+
}
|
143
|
+
|
144
|
+
call_account_api(:get, 'users', params, options.merge(content_type: :json))
|
145
|
+
end
|
146
|
+
|
147
|
+
# Creates a new user group.
|
148
|
+
# @param [String] name The name for the user group.
|
149
|
+
# @param [Object] options additional options
|
150
|
+
def self.create_user_group(name, options = {})
|
151
|
+
params = {
|
152
|
+
name: name
|
153
|
+
}
|
154
|
+
|
155
|
+
call_account_api(:post, 'user_groups', params, options.merge(content_type: :json))
|
156
|
+
end
|
157
|
+
|
158
|
+
# Updates the specified user group.
|
159
|
+
# @param [String] group_id The ID of the user group to update.
|
160
|
+
# @param [String] name The name for the user group.
|
161
|
+
# @param [Object] options additional options
|
162
|
+
def self.update_user_group(group_id, name, options = {})
|
163
|
+
params = {
|
164
|
+
name: name
|
165
|
+
}
|
166
|
+
|
167
|
+
call_account_api(:put, ['user_groups', group_id], params, options.merge(content_type: :json))
|
168
|
+
end
|
169
|
+
|
170
|
+
# Adds a user to a group with the specified ID.
|
171
|
+
# @param [String] group_id The ID of the user group.
|
172
|
+
# @param [String] user_id The ID of the user.
|
173
|
+
# @param [Object] options additional options
|
174
|
+
def self.add_user_to_group(group_id, user_id, options = {})
|
175
|
+
call_account_api(:post, ['user_groups', group_id, 'users', user_id], {}, options.merge(content_type: :json))
|
176
|
+
end
|
177
|
+
|
178
|
+
# Removes a user from a group with the specified ID.
|
179
|
+
# @param [String] group_id The ID of the user group.
|
180
|
+
# @param [String] user_id The ID of the user.
|
181
|
+
# @param [Object] options additional options
|
182
|
+
def self.remove_user_from_group(group_id, user_id, options = {})
|
183
|
+
call_account_api(:delete, ['user_groups', group_id, 'users', user_id], {}, options.merge(content_type: :json))
|
184
|
+
end
|
185
|
+
|
186
|
+
# Deletes the user group with the specified ID.
|
187
|
+
# @param [String] group_id The ID of the user group to delete.
|
188
|
+
# @param [Object] options additional options
|
189
|
+
def self.delete_user_group(group_id, options = {})
|
190
|
+
call_account_api(:delete, ['user_groups', group_id], {}, options)
|
191
|
+
end
|
192
|
+
|
193
|
+
# Lists user groups in the account.
|
194
|
+
# @param [Object] options additional options
|
195
|
+
def self.user_groups(options = {})
|
196
|
+
call_account_api(:get, 'user_groups', {}, options.merge(content_type: :json))
|
197
|
+
end
|
198
|
+
|
199
|
+
# Retrieves the details of the specified user group.
|
200
|
+
# @param [String] group_id The ID of the user group to retrieve.
|
201
|
+
# @param [Object] options additional options
|
202
|
+
def self.user_group(group_id, options = {})
|
203
|
+
call_account_api(:get, ['user_groups', group_id], {}, options.merge(content_type: :json))
|
204
|
+
end
|
205
|
+
|
206
|
+
# Lists users in the specified user group.
|
207
|
+
# @param [String] group_id The ID of the user group.
|
208
|
+
# @param [Object] options additional options
|
209
|
+
def self.user_group_users(group_id, options = {})
|
210
|
+
call_account_api(:get, ['user_groups', group_id, 'users'], {}, options.merge(content_type: :json))
|
211
|
+
end
|
212
|
+
|
213
|
+
def self.call_account_api(method, uri, params, options)
|
214
|
+
account_id = options[:account_id] || Cloudinary.account_config.account_id || raise('Must supply account_id')
|
215
|
+
api_key = options[:provisioning_api_key] || Cloudinary.account_config.provisioning_api_key || raise('Must supply provisioning api_key')
|
216
|
+
api_secret = options[:provisioning_api_secret] || Cloudinary.account_config.provisioning_api_secret || raise('Must supply provisioning api_secret')
|
217
|
+
|
218
|
+
params.reject! { |_, v| v.nil? }
|
219
|
+
|
220
|
+
call_cloudinary_api(method, uri, api_key, api_secret, params, options) do |cloudinary, inner_uri|
|
221
|
+
[cloudinary, 'v1_1', 'provisioning', 'accounts', account_id, inner_uri]
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
private_class_method :call_account_api
|
226
|
+
end
|