1# frozen_string_literal: true
2
3require "jennifer"
4require_relative "message"
5
6class Webhook
7 # @param redis [RedisClient]
8 def initialize(redis)
9 @redis = redis
10 end
11
12 INBOUND_TYPES = ["message-received"]
13 OUTBOUND_TYPES = ["message-delivered", "message-failed"]
14
15 include Jennifer.rant(self) {
16 time { iso8601 }
17 type {
18 choose(*(INBOUND_TYPES + OUTBOUND_TYPES))
19 }
20 direction derived_from(:type) { |type|
21 if INBOUND_TYPES.include?(type)
22 "in"
23 elsif OUTBOUND_TYPES.include?(type)
24 "out"
25 else
26 raise "Generated bad webhook type #{type}"
27 end
28 }, transient: true
29 description { string }
30 to { nanpa_phone }
31
32 jid(transient: true) { bare_jid }
33 registered(transient: true) { true }
34 resend_id(transient: true) {
35 "#{sized(13) { string(/[0-9]/) }}-#{range(0, 99)}"
36 }
37 message derived_from(:registered, :jid, :direction, :to) { |registered, jid, direction, to|
38 Message.new(@redis).generate(registered, jid, direction, to)
39 }
40 written_state(transient: true) {
41 SGXbwmsgsv2.instance_variable_set(:@written, [])
42 }
43 }
44end