resourcespace-ruby 0.1.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.
@@ -0,0 +1,298 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ResourceSpace
4
+ # Metadata management interface for ResourceSpace API
5
+ #
6
+ # @example
7
+ # metadata = client.metadata
8
+ #
9
+ # # Get field options
10
+ # options = metadata.get_field_options(75)
11
+ #
12
+ # # Create a resource type field
13
+ # field = metadata.create_resource_type_field(
14
+ # name: "Web Asset Type",
15
+ # type: "dropdown"
16
+ # )
17
+ class Metadata
18
+ # @return [Client] the ResourceSpace client
19
+ attr_reader :client
20
+
21
+ # Initialize the metadata interface
22
+ #
23
+ # @param client [Client] ResourceSpace client instance
24
+ def initialize(client)
25
+ @client = client
26
+ end
27
+
28
+ # Get field options for dropdown/checkbox fields
29
+ #
30
+ # @param field_id [Integer] field ID
31
+ # @param node_info [Boolean] whether to include detailed node information
32
+ # @return [Array] field options
33
+ def get_field_options(field_id, node_info: false)
34
+ params = { param1: field_id.to_s }
35
+ params[:param2] = node_info ? "true" : "false"
36
+
37
+ client.get("get_field_options", params)
38
+ end
39
+
40
+ # Get node ID for a field value
41
+ #
42
+ # @param field_id [Integer] field ID
43
+ # @param value [String] field value
44
+ # @return [Integer] node ID
45
+ def get_node_id(field_id, value)
46
+ response = client.get("get_node_id", {
47
+ param1: field_id.to_s,
48
+ param2: value
49
+ })
50
+ response.to_i
51
+ end
52
+
53
+ # Get all nodes for a field
54
+ #
55
+ # @param field_id [Integer] field ID
56
+ # @return [Array] field nodes
57
+ def get_nodes(field_id)
58
+ client.get("get_nodes", { param1: field_id.to_s })
59
+ end
60
+
61
+ # Set/create a node value
62
+ #
63
+ # @param field_id [Integer] field ID
64
+ # @param value [String] node value
65
+ # @param return_existing [Boolean] return existing node if it exists
66
+ # @return [Integer] node ID
67
+ def set_node(field_id, value, return_existing: true)
68
+ params = {
69
+ param1: field_id.to_s,
70
+ param2: value
71
+ }
72
+ params[:param3] = return_existing ? "true" : "false"
73
+
74
+ response = client.post("set_node", params)
75
+ response.to_i
76
+ end
77
+
78
+ # Add resource nodes (multiple field values)
79
+ #
80
+ # @param resource_id [Integer] resource ID
81
+ # @param field_id [Integer] field ID
82
+ # @param node_ids [Array<Integer>] array of node IDs
83
+ # @return [Hash] response
84
+ def add_resource_nodes(resource_id, field_id, node_ids)
85
+ node_ids_str = Array(node_ids).join(",")
86
+
87
+ client.post("add_resource_nodes", {
88
+ param1: resource_id.to_s,
89
+ param2: field_id.to_s,
90
+ param3: node_ids_str
91
+ })
92
+ end
93
+
94
+ # Add resource nodes for multiple fields
95
+ #
96
+ # @param resource_id [Integer] resource ID
97
+ # @param field_data [Hash] hash of field_id => node_ids pairs
98
+ # @return [Hash] response
99
+ def add_resource_nodes_multi(resource_id, field_data)
100
+ # Convert field_data to the format expected by the API
101
+ # This might need adjustment based on the exact API format
102
+ params = { param1: resource_id.to_s }
103
+
104
+ field_data.each_with_index do |(field_id, node_ids), index|
105
+ node_ids_str = Array(node_ids).join(",")
106
+ params["param#{index + 2}"] = "#{field_id}:#{node_ids_str}"
107
+ end
108
+
109
+ client.post("add_resource_nodes_multi", params)
110
+ end
111
+
112
+ # Update a field definition
113
+ #
114
+ # @param field_id [Integer] field ID
115
+ # @param properties [Hash] field properties to update
116
+ # @return [Hash] response
117
+ def update_field(field_id, properties = {})
118
+ params = { param1: field_id.to_s }
119
+
120
+ # Add properties as additional parameters
121
+ properties.each_with_index do |(key, value), index|
122
+ params["param#{index + 2}"] = "#{key}:#{value}"
123
+ end
124
+
125
+ client.post("update_field", params)
126
+ end
127
+
128
+ # Get resource type fields
129
+ #
130
+ # @param resource_type [Integer] resource type ID
131
+ # @return [Array] fields for the resource type
132
+ def get_resource_type_fields(resource_type = nil)
133
+ params = {}
134
+ params[:param1] = resource_type.to_s if resource_type
135
+
136
+ client.get("get_resource_type_fields", params)
137
+ end
138
+
139
+ # Create a new resource type field
140
+ #
141
+ # @param name [String] field name
142
+ # @param type [String] field type ("text", "dropdown", "checkbox", "date", etc.)
143
+ # @param resource_types [Array<Integer>] resource types this field applies to
144
+ # @param options [Hash] additional field options
145
+ # @return [Hash] created field data
146
+ def create_resource_type_field(name:, type:, resource_types: [1], **options)
147
+ params = {
148
+ param1: name,
149
+ param2: type,
150
+ param3: Array(resource_types).join(",")
151
+ }
152
+
153
+ # Add additional options
154
+ options.each_with_index do |(key, value), index|
155
+ params["param#{index + 4}"] = "#{key}:#{value}"
156
+ end
157
+
158
+ client.post("create_resource_type_field", params)
159
+ end
160
+
161
+ # Toggle active state for nodes
162
+ #
163
+ # @param field_id [Integer] field ID
164
+ # @param node_ids [Array<Integer>] node IDs to toggle
165
+ # @param active [Boolean] whether to activate or deactivate
166
+ # @return [Hash] response
167
+ def toggle_active_state_for_nodes(field_id, node_ids, active: true)
168
+ node_ids_str = Array(node_ids).join(",")
169
+
170
+ client.post("toggle_active_state_for_nodes", {
171
+ param1: field_id.to_s,
172
+ param2: node_ids_str,
173
+ param3: active ? "1" : "0"
174
+ })
175
+ end
176
+
177
+ # Get metadata schema for web assets
178
+ #
179
+ # @return [Hash] recommended metadata fields for web assets
180
+ def web_asset_schema
181
+ {
182
+ 8 => "Title/Name",
183
+ 12 => "Keywords/Tags",
184
+ 51 => "Asset Type", # Custom field for web asset type
185
+ 52 => "Usage Rights", # Custom field for usage/license
186
+ 53 => "Dimensions", # Custom field for dimensions
187
+ 54 => "File Size", # Custom field for file size
188
+ 55 => "Compression", # Custom field for compression type
189
+ 56 => "Color Profile", # Custom field for color profile
190
+ 57 => "Purpose/Context" # Custom field for intended use
191
+ }
192
+ end
193
+
194
+ # Create web asset metadata fields
195
+ #
196
+ # @param resource_types [Array<Integer>] resource types to apply fields to
197
+ # @return [Array] created field data
198
+ def create_web_asset_fields(resource_types: [1])
199
+ fields_to_create = [
200
+ {
201
+ name: "Web Asset Type",
202
+ type: "dropdown",
203
+ options: ["Image", "CSS", "JavaScript", "Font", "Icon", "Video", "Audio"]
204
+ },
205
+ {
206
+ name: "Usage Rights",
207
+ type: "dropdown",
208
+ options: ["Public Domain", "Creative Commons", "Licensed", "Proprietary"]
209
+ },
210
+ {
211
+ name: "Dimensions",
212
+ type: "text",
213
+ description: "Width x Height (e.g., 1920x1080)"
214
+ },
215
+ {
216
+ name: "File Size",
217
+ type: "text",
218
+ description: "File size in bytes/KB/MB"
219
+ },
220
+ {
221
+ name: "Compression",
222
+ type: "dropdown",
223
+ options: ["None", "Lossless", "Lossy", "Optimized"]
224
+ },
225
+ {
226
+ name: "Color Profile",
227
+ type: "dropdown",
228
+ options: ["sRGB", "Adobe RGB", "ProPhoto RGB", "CMYK", "Grayscale"]
229
+ },
230
+ {
231
+ name: "Purpose/Context",
232
+ type: "text",
233
+ description: "Intended use or context for this asset"
234
+ }
235
+ ]
236
+
237
+ created_fields = []
238
+ fields_to_create.each do |field_data|
239
+ options = field_data.dup
240
+ name = options.delete(:name)
241
+ type = options.delete(:type)
242
+
243
+ created_field = create_resource_type_field(
244
+ name: name,
245
+ type: type,
246
+ resource_types: resource_types,
247
+ **options
248
+ )
249
+ created_fields << created_field
250
+ end
251
+
252
+ created_fields
253
+ end
254
+
255
+ # Update resource with web asset metadata
256
+ #
257
+ # @param resource_id [Integer] resource ID
258
+ # @param metadata [Hash] web asset metadata
259
+ # @return [Array] array of update responses
260
+ def update_web_asset_metadata(resource_id, metadata = {})
261
+ updates = []
262
+
263
+ schema = web_asset_schema
264
+
265
+ metadata.each do |field_name, value|
266
+ field_id = case field_name.to_s.downcase
267
+ when "title", "name"
268
+ 8
269
+ when "keywords", "tags"
270
+ 12
271
+ when "asset_type", "type"
272
+ 51
273
+ when "usage_rights", "rights", "license"
274
+ 52
275
+ when "dimensions", "size"
276
+ 53
277
+ when "file_size"
278
+ 54
279
+ when "compression"
280
+ 55
281
+ when "color_profile", "color"
282
+ 56
283
+ when "purpose", "context", "description"
284
+ 57
285
+ else
286
+ field_name.to_i if field_name.to_s.match?(/^\d+$/)
287
+ end
288
+
289
+ if field_id
290
+ update_response = client.resources.update_field(resource_id, field_id, value.to_s)
291
+ updates << { field_id: field_id, field_name: field_name, response: update_response }
292
+ end
293
+ end
294
+
295
+ updates
296
+ end
297
+ end
298
+ end
@@ -0,0 +1,285 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ResourceSpace
4
+ # Resource management interface for ResourceSpace API
5
+ #
6
+ # @example
7
+ # resources = client.resources
8
+ #
9
+ # # Create a new resource
10
+ # resource = resources.create_resource(name: "My Image")
11
+ #
12
+ # # Upload a file
13
+ # uploaded = resources.upload_file(File.open("image.jpg"))
14
+ #
15
+ # # Get resource data
16
+ # data = resources.get_resource_data(123)
17
+ class Resource
18
+ # @return [Client] the ResourceSpace client
19
+ attr_reader :client
20
+
21
+ # Initialize the resource interface
22
+ #
23
+ # @param client [Client] ResourceSpace client instance
24
+ def initialize(client)
25
+ @client = client
26
+ end
27
+
28
+ # Create a new resource
29
+ #
30
+ # @param name [String] resource name
31
+ # @param resource_type [Integer] resource type ID (default: 1)
32
+ # @param collection [Integer] collection ID to add resource to
33
+ # @param metadata [Hash] metadata fields to set
34
+ # @return [Hash] created resource data
35
+ def create_resource(name: nil, resource_type: 1, collection: nil, metadata: {})
36
+ params = {
37
+ param1: resource_type.to_s
38
+ }
39
+
40
+ params[:param2] = collection.to_s if collection
41
+
42
+ response = client.post("create_resource", params)
43
+ resource_id = response.is_a?(Hash) ? response["ref"] || response["id"] : response
44
+
45
+ # Set resource name if provided
46
+ if name && resource_id
47
+ update_field(resource_id, 8, name) # Field 8 is typically the title/name field
48
+ end
49
+
50
+ # Set additional metadata if provided
51
+ metadata.each do |field, value|
52
+ update_field(resource_id, field, value)
53
+ end if metadata.any?
54
+
55
+ get_resource_data(resource_id)
56
+ end
57
+
58
+ # Upload a file to ResourceSpace
59
+ #
60
+ # @param file [File, String] file object or file path
61
+ # @param caption [String] file caption
62
+ # @param no_exif [Boolean] whether to skip EXIF data extraction
63
+ # @return [Hash] uploaded file data
64
+ def upload_file(file, caption: nil, no_exif: false)
65
+ params = {}
66
+ params[:param1] = caption if caption
67
+ params[:param2] = "1" if no_exif
68
+
69
+ client.upload_file(file, params)
70
+ end
71
+
72
+ # Get resource data
73
+ #
74
+ # @param resource_id [Integer] resource ID
75
+ # @return [Hash] resource data
76
+ def get_resource_data(resource_id)
77
+ client.get("get_resource_data", { param1: resource_id.to_s })
78
+ end
79
+
80
+ # Get resource field data
81
+ #
82
+ # @param resource_id [Integer] resource ID
83
+ # @param field_id [Integer] field ID (optional)
84
+ # @return [Hash] field data
85
+ def get_resource_field_data(resource_id, field_id = nil)
86
+ params = { param1: resource_id.to_s }
87
+ params[:param2] = field_id.to_s if field_id
88
+
89
+ client.get("get_resource_field_data", params)
90
+ end
91
+
92
+ # Update a resource field
93
+ #
94
+ # @param resource_id [Integer] resource ID
95
+ # @param field_id [Integer] field ID
96
+ # @param value [String] field value
97
+ # @param node_values [Boolean] whether value contains node IDs
98
+ # @return [Hash] response
99
+ def update_field(resource_id, field_id, value, node_values: false)
100
+ params = {
101
+ param1: resource_id.to_s,
102
+ param2: field_id.to_s,
103
+ param3: value.to_s
104
+ }
105
+ params[:param4] = node_values.to_s if node_values
106
+
107
+ client.post("update_field", params)
108
+ end
109
+
110
+ # Delete a resource
111
+ #
112
+ # @param resource_id [Integer] resource ID
113
+ # @return [Hash] response
114
+ def delete_resource(resource_id)
115
+ client.post("delete_resource", { param1: resource_id.to_s })
116
+ end
117
+
118
+ # Copy a resource
119
+ #
120
+ # @param resource_id [Integer] source resource ID
121
+ # @param resource_type [Integer] destination resource type (optional)
122
+ # @return [Hash] new resource data
123
+ def copy_resource(resource_id, resource_type: nil)
124
+ params = { param1: resource_id.to_s }
125
+ params[:param2] = resource_type.to_s if resource_type
126
+
127
+ client.post("copy_resource", params)
128
+ end
129
+
130
+ # Get resource download path
131
+ #
132
+ # @param resource_id [Integer] resource ID
133
+ # @param size [String] image size ('', 'pre', 'scr', 'thm', 'col')
134
+ # @param page [Integer] page number for multi-page documents
135
+ # @param ext [String] file extension override
136
+ # @return [String] download path
137
+ def get_resource_path(resource_id, size: "", page: 1, ext: "")
138
+ params = {
139
+ param1: resource_id.to_s,
140
+ param2: size.to_s,
141
+ param3: page.to_s
142
+ }
143
+ params[:param4] = ext if ext && !ext.empty?
144
+
145
+ response = client.get("get_resource_path", params)
146
+ response.is_a?(String) ? response : response["path"]
147
+ end
148
+
149
+ # Get alternative files for a resource
150
+ #
151
+ # @param resource_id [Integer] resource ID
152
+ # @return [Array] alternative files data
153
+ def get_alternative_files(resource_id)
154
+ client.get("get_alternative_files", { param1: resource_id.to_s })
155
+ end
156
+
157
+ # Add an alternative file to a resource
158
+ #
159
+ # @param resource_id [Integer] resource ID
160
+ # @param file [File, String] file object or file path
161
+ # @param name [String] alternative file name
162
+ # @param description [String] alternative file description
163
+ # @return [Hash] response
164
+ def add_alternative_file(resource_id, file, name: nil, description: nil)
165
+ params = { param1: resource_id.to_s }
166
+ params[:param2] = name if name
167
+ params[:param3] = description if description
168
+
169
+ client.upload_file(file, params.merge(function: "add_alternative_file"))
170
+ end
171
+
172
+ # Delete an alternative file
173
+ #
174
+ # @param resource_id [Integer] resource ID
175
+ # @param alt_file_id [Integer] alternative file ID
176
+ # @return [Hash] response
177
+ def delete_alternative_file(resource_id, alt_file_id)
178
+ client.post("delete_alternative_file", {
179
+ param1: resource_id.to_s,
180
+ param2: alt_file_id.to_s
181
+ })
182
+ end
183
+
184
+ # Get resource types
185
+ #
186
+ # @return [Array] resource types
187
+ def get_resource_types
188
+ client.get("get_resource_types")
189
+ end
190
+
191
+ # Update resource type
192
+ #
193
+ # @param resource_id [Integer] resource ID
194
+ # @param resource_type [Integer] new resource type ID
195
+ # @return [Hash] response
196
+ def update_resource_type(resource_id, resource_type)
197
+ client.post("update_resource_type", {
198
+ param1: resource_id.to_s,
199
+ param2: resource_type.to_s
200
+ })
201
+ end
202
+
203
+ # Get resource log
204
+ #
205
+ # @param resource_id [Integer] resource ID
206
+ # @param entries [Integer] number of entries to return
207
+ # @return [Array] log entries
208
+ def get_resource_log(resource_id, entries: 50)
209
+ client.get("get_resource_log", {
210
+ param1: resource_id.to_s,
211
+ param2: entries.to_s
212
+ })
213
+ end
214
+
215
+ # Get all image sizes for a resource
216
+ #
217
+ # @param resource_id [Integer] resource ID
218
+ # @return [Hash] image sizes data
219
+ def get_resource_all_image_sizes(resource_id)
220
+ client.get("get_resource_all_image_sizes", { param1: resource_id.to_s })
221
+ end
222
+
223
+ # Replace resource file
224
+ #
225
+ # @param resource_id [Integer] resource ID
226
+ # @param file [File, String] new file
227
+ # @param no_exif [Boolean] skip EXIF extraction
228
+ # @return [Hash] response
229
+ def replace_resource_file(resource_id, file, no_exif: false)
230
+ params = { param1: resource_id.to_s }
231
+ params[:param2] = "1" if no_exif
232
+
233
+ client.upload_file(file, params.merge(function: "replace_resource_file"))
234
+ end
235
+
236
+ # Upload file by URL
237
+ #
238
+ # @param resource_id [Integer] resource ID
239
+ # @param url [String] file URL
240
+ # @param save_as [String] filename to save as
241
+ # @param no_exif [Boolean] skip EXIF extraction
242
+ # @return [Hash] response
243
+ def upload_file_by_url(resource_id, url, save_as: nil, no_exif: false)
244
+ params = {
245
+ param1: resource_id.to_s,
246
+ param2: url
247
+ }
248
+ params[:param3] = save_as if save_as
249
+ params[:param4] = "1" if no_exif
250
+
251
+ client.post("upload_file_by_url", params)
252
+ end
253
+
254
+ # Check if user has edit access to resource
255
+ #
256
+ # @param resource_id [Integer] resource ID
257
+ # @return [Boolean] true if user has edit access
258
+ def edit_access?(resource_id)
259
+ response = client.get("get_edit_access", { param1: resource_id.to_s })
260
+ response == true || response == "true" || response == 1 || response == "1"
261
+ end
262
+
263
+ # Get resource access level
264
+ #
265
+ # @param resource_id [Integer] resource ID
266
+ # @return [Integer] access level
267
+ def get_resource_access(resource_id)
268
+ response = client.get("get_resource_access", { param1: resource_id.to_s })
269
+ response.to_i
270
+ end
271
+
272
+ # Download a resource file
273
+ #
274
+ # @param resource_id [Integer] resource ID
275
+ # @param file_path [String] local file path to save to
276
+ # @param size [String] image size
277
+ # @return [Boolean] true if successful
278
+ def download_resource(resource_id, file_path, size: "")
279
+ download_path = get_resource_path(resource_id, size: size)
280
+ download_url = "#{client.config.url.gsub('/api/', '')}#{download_path}"
281
+
282
+ client.download_file(download_url, file_path)
283
+ end
284
+ end
285
+ end