-
Notifications
You must be signed in to change notification settings - Fork 17
/
client.rb
138 lines (96 loc) · 3.92 KB
/
client.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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# frozen_string_literal: true
module Castle
# Castle's client.
class Client
class << self
def from_request(request, options = {})
new(options.merge(context: Castle::Context::Prepare.call(request, options)))
end
end
attr_accessor :context
# @param options [Hash]
def initialize(options = {})
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
@do_not_track = options.fetch(:do_not_track, false)
@timestamp = options.fetch(:timestamp) { Castle::Utils::GetTimestamp.call }
@context = options.fetch(:context) { {} }
end
# @param options [Hash]
def authenticate(options = {})
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
return generate_do_not_track_response(options[:user_id]) unless tracked?
add_timestamp_if_necessary(options)
new_context = Castle::Context::Merge.call(@context, options[:context])
Castle::API::Authenticate.call(options.merge(context: new_context, no_symbolize: true))
end
# @param options [Hash]
def track(options = {})
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
return unless tracked?
add_timestamp_if_necessary(options)
new_context = Castle::Context::Merge.call(@context, options[:context])
Castle::API::Track.call(options.merge(context: new_context, no_symbolize: true))
end
# @param options [Hash]
def filter(options = {})
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
return generate_do_not_track_response(options[:user][:id]) unless tracked?
add_timestamp_if_necessary(options)
new_context = Castle::Context::Merge.call(@context, options[:context])
Castle::API::Filter.call(options.merge(context: new_context, no_symbolize: true))
end
# @param options [Hash]
def risk(options = {})
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
return generate_do_not_track_response(options[:user][:id]) unless tracked?
add_timestamp_if_necessary(options)
new_context = Castle::Context::Merge.call(@context, options[:context])
Castle::API::Risk.call(options.merge(context: new_context, no_symbolize: true))
end
# @param options [Hash]
def log(options = {})
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
return generate_do_not_track_response(options[:user][:id]) unless tracked?
add_timestamp_if_necessary(options)
new_context = Castle::Context::Merge.call(@context, options[:context])
Castle::API::Log.call(options.merge(context: new_context, no_symbolize: true))
end
# @param options [Hash]
def start_impersonation(options = {})
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
add_timestamp_if_necessary(options)
new_context = Castle::Context::Merge.call(@context, options[:context])
Castle::API::StartImpersonation.call(options.merge(context: new_context, no_symbolize: true))
end
# @param options [Hash]
def end_impersonation(options = {})
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
add_timestamp_if_necessary(options)
new_context = Castle::Context::Merge.call(@context, options[:context])
Castle::API::EndImpersonation.call(options.merge(context: new_context, no_symbolize: true))
end
def disable_tracking
@do_not_track = true
end
def enable_tracking
@do_not_track = false
end
# @return [Boolean]
def tracked?
!@do_not_track
end
private
# @param user_id [String, Boolean]
def generate_do_not_track_response(user_id)
Castle::Failover::PrepareResponse.new(
user_id,
strategy: :allow,
reason: 'Castle is set to do not track.'
).call
end
# @param options [Hash]
def add_timestamp_if_necessary(options)
options[:timestamp] ||= @timestamp if @timestamp
end
end
end