Hydra::RemoteIdentifier
Coordinate the registration and minting of remote identifiers for persisted objects.
Installation
Add this line to your application's Gemfile:
gem 'hydra-remote_identifier'
And then execute:
$ bundle
Or install it yourself as:
$ gem install hydra-remote_identifier
Usage
Configure your remote identifiers with credentials and what have you:
doi_credentials = Psych.load('/path/to/doi_credentials.yml')
Hydra::RemoteIdentifier.configure do |config|
config.remote_service(:doi, doi_credentials) do |doi|
doi.register(Book, Page) do |map|
map.target :url
map.creator {|obj| obj.person_name }
map.title :title
map.publisher :publisher
map.publicationyear :publicationyear
map.set_identifier(:set_identifier=)
end
end
end
If you are using Rails, you can run rails generate hydra:remote_identifier:install
to
create a Rails initializer with a configuration stub file. Also available is
rails generate hydra:remote_identifier:doi
.
In your views allow users to request that a remote identifier be created/assigned:
<%= form_for book do |f| %>
<% Hydra::RemoteIdentifier.registered?(:doi, f.object) do |remote_service| %>
<%= f.input remote_service.accessor_name %>
<% end %>
<% end %>
Where you enqueue an asynchronous worker iterate over the requested identifiers:
Hydra::RemoteIdentifier.applicable_remote_service_names_for(book) do |remote_service|
MintRemoteIdentifierWorker.enqueue(book.to_param, remote_service.name)
end
Where your asynchronous worker does its work request the minting:
# Instantiate target from input
Hydra::RemoteIdentifier.mint(remote_service_name, target)
In your show views you can provide a link to the remote identifier via Hydra::RemoteIdentifier.remote_uri_for:
<%= link_to(object.doi, Hydra::RemoteIdentifier.remote_uri_for(:doi, object.doi)) %>
Extending Hydra::RemoteIdentifier with alternate remote identifiers
If you are interested in creating a new Hydra::RemoteIdentifier::RemoteService, this can be done by creating a class in the Hydra::RemoteIdentifier::RemoteServices namespace. See below:
module Hydra::RemoteIdentifier::RemoteServices
class MyRemoteService < Hydra::RemoteIdentifier::RemoteService
# your code here
end
end
Then configure your RemoteService for your persisted targets. See below:
Hydra::RemoteIdentifier.configure do |config|
config.remote_service(:my_remote_service, credentials) do |mine|
mine.register(Book, Page) do |map|
# map fields of Book, Page to the required payload for MyRemoteService
end
end
end