-
Notifications
You must be signed in to change notification settings - Fork 1
/
utils.rb
96 lines (83 loc) · 2.44 KB
/
utils.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
require 'base32/url'
require 'securerandom'
require 'bergamasco'
require 'open-uri'
require 'time'
module Cirneco
module Utils
# 32 by the factor of 6
UPPER_LIMIT = 1073741823
def get_dois_by_prefix(prefix, options={})
response = get_dois(options)
if response.body["data"].present?
response.body["data"] = response.body["data"].select { |doi| doi.start_with?(prefix) }
end
response
end
def generate_transfer_template(options={})
response = {
"data" => {
"type" => "dois",
"attributes" => {
"mode" => "transfer"
},
"relationships"=> {
"client"=> {
"data"=> {
"type"=> "clients",
"id"=> options[:target].downcase
}
}
}
}
}
response
end
def generate_state_change_template(options={})
response = {
"data" => {
"type" => "dois",
"attributes" => {
"event" => options[:operation]
}
}
}
response
end
def decode_doi(doi)
prefix, string = doi.split('/', 2)
Base32::URL.decode(string, checksum: true)
end
def encode_doi(prefix, options={})
prefix = validate_prefix(prefix)
return nil unless prefix.present?
number = options[:number].to_s.scan(/\d+/).join("").to_i
number = SecureRandom.random_number(UPPER_LIMIT) unless number > 0
shoulder = options[:shoulder].to_s
shoulder += "-" if shoulder.present?
length = 8
split = 4
prefix.to_s + "/" + shoulder + Base32::URL.encode(number, split: split, length: length, checksum: true)
end
def generate_accession_number(options={})
lower_limit = options[:lower_limit] || 0
namespace = options[:namespace] || 'MS-'
registered_numbers = options[:registered_numbers] || []
if options[:number]
number = options[:number].to_s
else
begin
number = SecureRandom.random_number(1000000) + lower_limit
end while registered_numbers.include? number
number = number.to_s
end
number = number.to_s.rjust(options[:length], '0') if options[:length]
if options[:split]
number = number.reverse
number = number.scan(/.{1,#{options[:split]}}/).map { |x| x.reverse }
number = number.reverse.join("-")
end
namespace + number
end
end
end