Module: URIResolver

Includes:
JSONModel
Included in:
ArchivesSpaceService
Defined in:
backend/app/lib/uri_resolver.rb

Defined Under Namespace

Classes: URIResolver

Class Method Summary (collapse)

Instance Method Summary (collapse)

Methods included from JSONModel

JSONModel, #JSONModel, add_error_handler, all, allow_unmapped_enum_value, backend_url, client_mode?, custom_validations, destroy_model, enum_default_value, enum_values, handle_error, init, load_schema, #models, models, parse_jsonmodel_ref, parse_reference, repository, repository_for, schema_src, set_repository, strict_mode, strict_mode?, with_repository

Class Method Details

+ (Object) ensure_reference_is_valid(reference, active_repository = nil)



225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
# File 'backend/app/lib/uri_resolver.rb', line 225

def self.ensure_reference_is_valid(reference, active_repository = nil)

  # error on anything that points outside the active repository
  if active_repository && \
    reference.start_with?("/repositories/") && \
    reference !~ /^\/repositories\/#{active_repository}($|\/)/

    raise ReferenceError.new("Inter-repository links are not allowed in this operation! (Bad link: '#{reference}'; Active repo: '#/repositories/#{active_repository}')")
  end

  # ensure the referent record actually exists
  if !self.record_exists?(reference)
    raise ReferenceError.new("Reference does not exist! (Reference: '#{reference}')")
  end
end

+ (Object) forward_rack_request(method, uri, env)



190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# File 'backend/app/lib/uri_resolver.rb', line 190

def self.forward_rack_request(method, uri, env)
  if env
    env = env.merge('ASPACE_REENTRANT' => true, 'PATH_INFO' => uri,
                    'REQUEST_METHOD' => method)
  else
    env = {
      'REQUEST_METHOD' => method,
      'SCRIPT_NAME' => "",
      'PATH_INFO' => uri,
      'QUERY_STRING' => "",
      'SERVER_NAME' => "archivesspace.org",
      'SERVER_PORT' => 80,
      'rack.input' => StringIO.new,
      'ASPACE_REENTRANT' => true
    }
  end

  ArchivesSpaceService.call(env)
end

+ (Boolean) record_exists?(uri)

Returns:

  • (Boolean)


242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
# File 'backend/app/lib/uri_resolver.rb', line 242

def self.record_exists?(uri)
  parsed = JSONModel.parse_reference(uri)

  if parsed
    begin
      model = Kernel.const_get(parsed[:type].camelize)
      return !model[parsed[:id]].nil?
    rescue NameError
      # Questionable, but deal with URIs like /repositories/2/resources/1/tree
      # yielding "ResourceTree" which isn't a real model.
      return true
    end
  end

  false
end

+ (Object) resolve_references(value, properties_to_resolve, env)



211
212
213
214
215
216
217
218
# File 'backend/app/lib/uri_resolver.rb', line 211

def self.resolve_references(value, properties_to_resolve, env)
  # If ASPACE_REENTRANT is set, don't resolve anything or we risk creating
  # loops.
  return value if (properties_to_resolve.nil? || env['ASPACE_REENTRANT'])

  properties = Array(properties_to_resolve).map {|p| p.split(/::/)}
  URIResolver.new(properties, env).resolve_references(value)
end

Instance Method Details

- (Object) resolve_references(*args)



220
221
222
# File 'backend/app/lib/uri_resolver.rb', line 220

def resolve_references(*args)
  ::URIResolver.resolve_references(*args, env)
end