Class: DedupeRequests::Guard

Inherits:
Object
  • Object
show all
Defined in:
lib/dedupe_requests/guard.rb

Overview

Framework-agnostic core: turns a request into a claim decision, and releases a claim. Knows nothing about Rails rendering — that lives in the concern.

Defined Under Namespace

Classes: Result

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ Guard

Returns a new instance of Guard.



10
11
12
# File 'lib/dedupe_requests/guard.rb', line 10

def initialize(config)
  @config = config
end

Instance Method Details

#claim(request, ttl: @config.ttl, caller_id: nil) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/dedupe_requests/guard.rb', line 14

def claim(request, ttl: @config.ttl, caller_id: nil)
  return Result.new(:skip) unless @config.enabled?
  return Result.new(:skip) unless DedupeRequests::MUTATING_VERBS.include?(request.request_method.to_s)

  store = @config.store
  return Result.new(:skip) unless store

  fingerprint = Fingerprint.for_request(request, @config, caller_id: caller_id)
  token = store.claim(fingerprint, ttl: ttl)

  case token
  when :error then Result.new(:skip) # Redis down → fail open
  when false  then Result.new(:duplicate, fingerprint)
  else             Result.new(:claimed, fingerprint, token)
  end
end

#release(result) ⇒ Object



31
32
33
34
35
# File 'lib/dedupe_requests/guard.rb', line 31

def release(result)
  return false unless result && result.outcome == :claimed

  @config.store.release(result.fingerprint, result.token)
end