/
api.rb
112 lines (95 loc) · 2.97 KB
/
api.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
module PrisonVisits
# (in the context of a HTTP API, get_prisons is not bad style)
class Api
include Singleton
def initialize
self.pool = ConnectionPool.new(pool_size: Rails.configuration.max_threads,
timeout: 1) do
PrisonVisits::Client.new(Rails.configuration.api_host)
end
end
def get_prisons
result = pool.with { |client| client.get('/prisons') }
result['prisons'].map { |params| Prison.new(params) }
end
def get_prison(prison_id)
result = pool.with { |client| client.get("/prisons/#{prison_id}") }
Prison.new(result['prison'])
end
def validate_prisoner(number:, date_of_birth:)
result = pool.with { |client|
client.post(
'/validations/prisoner',
params: {
number:,
date_of_birth:
},
idempotent: true
)
}
result.fetch('validation')
end
def validate_visitors(prison_id:, lead_date_of_birth:, dates_of_birth:)
result = pool.with { |client|
client.post(
'/validations/visitors',
params: {
prison_id:,
lead_date_of_birth:,
dates_of_birth:
},
idempotent: true
)
}
result.fetch('validation')
end
def get_slots(prison_id:, prisoner_number:, prisoner_dob:)
response = pool.with { |client|
client.get(
'/slots',
params: {
prison_id:,
prisoner_number:,
prisoner_dob:,
start_date: Time.zone.today.to_date,
end_date: 28.days.from_now.to_date
}
)
}
response['slots'].map { |raw_slot| build_calendar_slot(raw_slot) }
end
def request_visit(params)
response = pool.with { |client| client.post('/visits', params:) }
Visit.new(response.fetch('visit'))
end
def get_visit(id)
response = pool.with { |client| client.get("visits/#{id}") }
Visit.new(response.fetch('visit'))
end
def cancel_visit(id)
response = pool.with { |client| client.delete("visits/#{id}") }
Visit.new(response.fetch('visit'))
end
def create_feedback(feedback_submission)
params = {
feedback: {
body: feedback_submission.body,
prisoner_number: feedback_submission.prisoner_number,
prisoner_date_of_birth: feedback_submission.prisoner_date_of_birth&.to_date,
prison_id: feedback_submission.prison_id,
email_address: feedback_submission.email_address,
referrer: feedback_submission.referrer,
user_agent: feedback_submission.user_agent
}
}
pool.with do |client| client.post('/feedback', params:) end
nil
end
private
def build_calendar_slot(raw_slot)
CalendarSlot.new(slot: ConcreteSlot.parse(raw_slot.first),
unavailability_reasons: raw_slot.last)
end
attr_accessor :pool
end
end