File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ class Api ::V1 ::AmbassadorReferralsController < Api ::V1 ::BaseController
2+ def index
3+ render json : referral_payload ( Rsvp . ambassador_referrals )
4+ end
5+
6+ def show
7+ if params [ :id ] . to_s . start_with? ( Rsvp ::AMBASSADOR_REFERRAL_PREFIX )
8+ render json : referral_payload ( Rsvp . ambassador_referrals . where ( "LOWER(ref) = ?" , params [ :id ] . to_s . downcase ) )
9+ else
10+ render json : { error : "Not found" } , status : :not_found
11+ end
12+ end
13+
14+ private
15+ def referral_payload ( referrals )
16+ referrals = referrals . order ( :id )
17+
18+ {
19+ prefix : Rsvp ::AMBASSADOR_REFERRAL_PREFIX ,
20+ count : referrals . size ,
21+ referrals : referrals . map ( &:ambassador_referral_payload )
22+ }
23+ end
24+ end
Original file line number Diff line number Diff line change 1+ class Api ::V1 ::BaseController < ActionController ::API
2+ before_action :authenticate_api_key
3+
4+ private
5+ def authenticate_api_key
6+ if valid_api_key?
7+ true
8+ else
9+ render json : { error : "Unauthorized" } , status : :unauthorized
10+ end
11+ end
12+
13+ def valid_api_key?
14+ if bearer_token . present? && api_keys . any?
15+ api_keys . any? do |api_key |
16+ if api_key . bytesize == bearer_token . bytesize
17+ ActiveSupport ::SecurityUtils . secure_compare ( api_key , bearer_token )
18+ else
19+ false
20+ end
21+ end
22+ else
23+ false
24+ end
25+ end
26+
27+ def bearer_token
28+ request . authorization . to_s [ /\A Bearer (.+)\z / , 1 ]
29+ end
30+
31+ def api_keys
32+ @api_keys ||= credential_api_keys . map ( &:to_s ) . map ( &:strip ) . select ( &:present? )
33+ end
34+
35+ def credential_api_keys
36+ Array . wrap ( Rails . application . credentials . dig ( :ambassador_referrals , :api_keys ) )
37+ end
38+ end
Original file line number Diff line number Diff line change 2525# index_rsvps_on_confirmation_token (confirmation_token) UNIQUE
2626#
2727class Rsvp < ApplicationRecord
28+ AMBASSADOR_REFERRAL_PREFIX = "a-" . freeze
2829 USER_REF_OPTIONS = %w[ Teacher NASA GitHub AMD HackClub Friend ] . freeze
2930
3031 has_paper_trail ignore : [ :ip_address , :user_agent ]
@@ -42,6 +43,27 @@ class Rsvp < ApplicationRecord
4243 after_commit :enqueue_geocode_job , on : :create
4344 after_create_commit :broadcast_counter_update
4445
46+ class << self
47+ def ambassador_referrals
48+ where ( "LOWER(ref) LIKE ?" , "#{ AMBASSADOR_REFERRAL_PREFIX } %" )
49+ end
50+ end
51+
52+ def ambassador_referral_payload
53+ {
54+ id : id ,
55+ email : email ,
56+ ref : ref ,
57+ user_ref : user_ref ,
58+ click_confirmed_at : click_confirmed_at ,
59+ reply_confirmed_at : reply_confirmed_at ,
60+ signup_confirmation_sent_at : signup_confirmation_sent_at ,
61+ synced_at : synced_at ,
62+ created_at : created_at ,
63+ updated_at : updated_at
64+ }
65+ end
66+
4567 def deliver_signup_confirmation
4668 return if signup_confirmation_sent_at?
4769
Original file line number Diff line number Diff line change 1- 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--dsqmtB9JJ1G6b/EM--sqDw/k3YEHh8calMI2Sc6w==
1+ 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--YG8oMNQcE9q9NNPk--9p+1maj/n+LUJ/TXheHW7A==
Original file line number Diff line number Diff line change @@ -394,6 +394,12 @@ def self.matches?(request)
394394 get "rsvps/confirm/:token" , to : "rsvps#confirm" , as : :confirm_rsvp
395395 get "tic_tac" , to : "rsvps#tic_tac" , as : :tic_tac , defaults : { format : :text }
396396
397+ namespace :api , defaults : { format : :json } do
398+ namespace :v1 do
399+ resources :ambassador_referrals , only : [ :index , :show ]
400+ end
401+ end
402+
397403 # Shop
398404 get "shop" , to : "shop#index"
399405 get "shop/my_orders" , to : "shop#my_orders"
You can’t perform that action at this time.
0 commit comments