feat: use a shared concern

This commit is contained in:
Shivam Mishra
2025-03-04 14:45:15 +05:30
parent 74c611325f
commit 63bea5219b
3 changed files with 51 additions and 42 deletions
@@ -0,0 +1,47 @@
module FacebookConcern
extend ActiveSupport::Concern
class InvalidDigestError < StandardError; end
private
def mark_deleting(id)
key = processing_key(id)
::Redis::Alfred.set(key, true)
end
def unset_deleting(id)
key = processing_key(id)
::Redis::Alfred.del(key)
end
def deleting?(id)
key = processing_key(id)
::Redis::Alfred.get(key).present?
end
def delete_key(id)
format(::Redis::Alfred::META_DELETE_PROCESSING, id: id)
end
def parse_fb_signed_request(signed_request)
encoded_signature, payload = signed_request.split('.', 2)
decoded_signature = Base64.urlsafe_decode64(encoded_signature)
decoded_payload = JSON.parse(Base64.urlsafe_decode64(payload))
expected_signature = OpenSSL::HMAC.digest('sha256', app_secret, payload)
raise InvalidDigestError if decoded_signature != expected_signature
decoded_payload
end
def app_url_base
ENV.fetch('FRONTEND_URL', nil)
end
def app_secret
GlobalConfigService.load('FB_APP_SECRET', '')
end
end
@@ -1,20 +1,13 @@
class Facebook::ConfirmController < ApplicationController
class InvalidDigestError < StandardError; end
include FacebookConcern
def show
@id_to_process = params[:id]
if processing?
if deleting?
render plain: 'Processing', status: :ok
else
render plain: 'Data Deleted Successfully', status: :ok
end
end
private
def processing?
key = format(::Redis::Alfred::META_DELETE_PROCESSING, id: @id_to_process)
::Redis::Alfred.get(key).present?
end
end
+2 -33
View File
@@ -1,12 +1,12 @@
class Facebook::DeleteController < ApplicationController
class InvalidDigestError < StandardError; end
include FacebookConcern
def create
signed_request = params['signed_request']
payload = parse_fb_signed_request(signed_request)
id_to_process = payload['user_id']
mark_processing(id_to_process)
mark_deleting(id_to_process)
Webhooks::FacebookDeleteJob.perform_later(id_to_process)
status_url = "#{app_url_base}/facebook/confirm/#{id_to_process}"
@@ -14,35 +14,4 @@ class Facebook::DeleteController < ApplicationController
rescue InvalidDigestError
render json: { error: 'Invalid signature' }, status: :unprocessable_entity
end
private
def mark_processing(id_to_process)
# we use this key to check if the deletion is completed or not
# Once the key is gone, we know the deletion is completed
# And we can show as such
key = format(::Redis::Alfred::META_DELETE_PROCESSING, id: id_to_process)
::Redis::Alfred.set(key, true)
end
def app_url_base
ENV.fetch('FRONTEND_URL', nil)
end
def parse_fb_signed_request(signed_request)
encoded_signature, payload = signed_request.split('.', 2)
decoded_signature = Base64.urlsafe_decode64(encoded_signature)
decoded_payload = JSON.parse(Base64.urlsafe_decode64(payload))
expected_signature = OpenSSL::HMAC.digest('sha256', app_secret, payload)
raise InvalidDigestError if decoded_signature != expected_signature
decoded_payload
end
def app_secret
GlobalConfigService.load('FB_APP_SECRET', '')
end
end