class StarkBank::Event

# Webhook Event object

An Event is the notification received from the subscription to the Webhook. Events cannot be created, but may be retrieved from the Stark Bank API to list all generated updates on entities.

## Attributes:

Attributes

created[R]
id[R]
is_delivered[R]
log[R]
subscription[R]
workspace_id[R]

Public Class Methods

delete(id, user: nil) click to toggle source

# Delete a notification Event

Delete a of notification Event entity previously created in the Stark Bank API by its ID

## Parameters (required):

  • id [string]: Event unique id. ex: '5656565656565656'

## Parameters (optional):

## Return:

# File lib/event/event.rb, line 144
def self.delete(id, user: nil)
  StarkBank::Utils::Rest.delete_id(id: id, user: user, **resource)
end
get(id, user: nil) click to toggle source

# Retrieve a specific notification Event

Receive a single notification Event object previously created in the Stark Bank API by passing its id

## Parameters (required):

  • id [string]: object unique id. ex: '5656565656565656'

## Parameters (optional):

## Return:

  • Event object with updated attributes

# File lib/event/event.rb, line 73
def self.get(id, user: nil)
  StarkBank::Utils::Rest.get_id(id: id, user: user, **resource)
end
new(id:, log:, created:, is_delivered:, workspace_id:, subscription:) click to toggle source
Calls superclass method StarkBank::Utils::Resource::new
# File lib/event/event.rb, line 37
def initialize(id:, log:, created:, is_delivered:, workspace_id:, subscription:)
  super(id)
  @created = StarkBank::Utils::Checks.check_datetime(created)
  @is_delivered = is_delivered
  @workspace_id = workspace_id
  @subscription = subscription

  resource = {
    'transfer': StarkBank::Transfer::Log.resource,
    'invoice': StarkBank::Invoice::Log.resource,
    'deposit': StarkBank::Deposit::Log.resource,
    'brcode-payment': StarkBank::BrcodePayment::Log.resource,
    'boleto': StarkBank::Boleto::Log.resource,
    'boleto-payment': StarkBank::BoletoPayment::Log.resource,
    'utility-payment': StarkBank::UtilityPayment::Log.resource,
    'tax-payment': StarkBank::TaxPayment::Log.resource,
    'darf-payment': StarkBank::DarfPayment::Log.resource,
    'boleto-holmes': StarkBank::BoletoHolmes::Log.resource
  }[subscription.to_sym]

  @log = log
  @log = StarkBank::Utils::API.from_api_json(resource[:resource_maker], log) unless resource.nil?
end
page(cursor: nil, limit: nil, after: nil, before: nil, is_delivered: nil, user: nil) click to toggle source

# Retrieve paged Events

Receive a list of up to 100 Event objects previously created in the Stark Bank API and the cursor to the next page. Use this function instead of query if you want to manually page your requests.

## Parameters (optional):

  • cursor [string, default nil]: cursor returned on the previous page function call

  • limit [integer, default nil]: maximum number of objects to be retrieved. Unlimited if nil. ex: 35

  • after [Date, DateTime, Time or string, default nil]: date filter for objects created only after specified date. ex: Date.new(2020, 3, 10)

  • before [Date, DateTime, Time or string, default nil]: date filter for objects created only before specified date. ex: Date.new(2020, 3, 10)

  • is_delivered [bool, default nil]: bool to filter successfully delivered events. ex: True or False

  • user [Organization/Project object]: Organization or Project object. Not necessary if StarkBank.user was set before function call

## Return:

  • list of Event objects with updated attributes and cursor to retrieve the next page of Event objects

# File lib/event/event.rb, line 118
def self.page(cursor: nil, limit: nil, after: nil, before: nil, is_delivered: nil, user: nil)
  after = StarkBank::Utils::Checks.check_date(after)
  before = StarkBank::Utils::Checks.check_date(before)
  return StarkBank::Utils::Rest.get_page(
    cursor: cursor,
    limit: limit,
    after: after,
    before: before,
    is_delivered: is_delivered,
    user: user,
    **resource
  )
end
parse(content:, signature:, user: nil) click to toggle source

# Create single notification Event from a content string

Create a single Event object received from event listening at subscribed user endpoint. If the provided digital signature does not check out with the StarkBank public key, a starkbank.exception.InvalidSignatureException will be raised.

## Parameters (required):

  • content [string]: response content from request received at user endpoint (not parsed)

  • signature [string]: base-64 digital signature received at response header 'Digital-Signature'

## Parameters (optional):

## Return:

# File lib/event/event.rb, line 181
def self.parse(content:, signature:, user: nil)
  event = StarkBank::Utils::API.from_api_json(resource[:resource_maker], JSON.parse(content)['event'])

  begin
    signature = EllipticCurve::Signature.fromBase64(signature)
  rescue
    raise(StarkBank::Error::InvalidSignatureError, 'The provided signature is not valid')
  end

  return event if verify_signature(content: content, signature: signature, user: user)

  return event if verify_signature(content: content, signature: signature, user: user, refresh: true)

  raise(StarkBank::Error::InvalidSignatureError, 'The provided signature and content do not match the Stark Bank public key')
end
query(limit: nil, after: nil, before: nil, is_delivered: nil, user: nil) click to toggle source

# Retrieve notification Events

Receive a generator of notification Event objects previously created in the Stark Bank API

## Parameters (optional):

  • limit [integer, default nil]: maximum number of objects to be retrieved. Unlimited if nil. ex: 35

  • after [Date, DateTime, Time or string, default nil]: date filter for objects created only after specified date. ex: Date.new(2020, 3, 10)

  • before [Date, DateTime, Time or string, default nil]: date filter for objects created only before specified date. ex: Date.new(2020, 3, 10)

  • is_delivered [bool, default nil]: bool to filter successfully delivered events. ex: True or False

  • user [Organization/Project object]: Organization or Project object. Not necessary if StarkBank.user was set before function call

## Return:

  • generator of Event objects with updated attributes

# File lib/event/event.rb, line 90
def self.query(limit: nil, after: nil, before: nil, is_delivered: nil, user: nil)
  after = StarkBank::Utils::Checks.check_date(after)
  before = StarkBank::Utils::Checks.check_date(before)
  StarkBank::Utils::Rest.get_stream(
    user: user,
    limit: limit,
    after: after,
    before: before,
    is_delivered: is_delivered,
    **resource
  )
end
update(id, is_delivered:, user: nil) click to toggle source

# Update notification Event entity

Update notification Event by passing id. If is_delivered is True, the event will no longer be returned on queries with is_delivered=False.

## Parameters (required):

  • id [list of strings]: Event unique ids. ex: '5656565656565656'

  • is_delivered [bool]: If True and event hasn't been delivered already, event will be set as delivered. ex: True

## Parameters (optional):

## Return:

  • target Event with updated attributes

# File lib/event/event.rb, line 162
def self.update(id, is_delivered:, user: nil)
  StarkBank::Utils::Rest.patch_id(id: id, user: user, is_delivered: is_delivered, **resource)
end

Private Class Methods

get_public_key_pem(user) click to toggle source
# File lib/event/event.rb, line 210
def get_public_key_pem(user)
  StarkBank::Utils::Request.fetch(method: 'GET', path: 'public-key', query: { limit: 1 }, user: user).json['publicKeys'][0]['content']
end
resource() click to toggle source
# File lib/event/event.rb, line 214
def resource
  {
    resource_name: 'Event',
    resource_maker: proc { |json|
      Event.new(
        id: json['id'],
        log: json['log'],
        created: json['created'],
        is_delivered: json['is_delivered'],
        workspace_id: json['workspace_id'],
        subscription: json['subscription']
      )
    }
  }
end
verify_signature(content:, signature:, user:, refresh: false) click to toggle source
# File lib/event/event.rb, line 200
def verify_signature(content:, signature:, user:, refresh: false)
  public_key = StarkBank::Utils::Cache.starkbank_public_key
  if public_key.nil? || refresh
    pem = get_public_key_pem(user)
    public_key = EllipticCurve::PublicKey.fromPem(pem)
    StarkBank::Utils::Cache.starkbank_public_key = public_key
  end
  EllipticCurve::Ecdsa.verify(content, signature, public_key)
end