From 7720d2d0e77d551f9e5972d162d36dd5e8edd8fe Mon Sep 17 00:00:00 2001 From: panhachom Date: Wed, 18 Dec 2024 09:59:24 +0700 Subject: [PATCH] close #232 link account api --- .../storefront/account_on_files_controller.rb | 12 +++++ app/models/spree/linked_account.rb | 5 ++ app/models/vpago/user_decorator.rb | 9 ++++ config/routes.rb | 1 + ...41218022922_create_spree_linked_account.rb | 9 ++++ lib/vpago/payway_v2/account_linker.rb | 54 +++++++++++++++++++ 6 files changed, 90 insertions(+) create mode 100644 app/controllers/spree/api/v2/storefront/account_on_files_controller.rb create mode 100644 app/models/spree/linked_account.rb create mode 100644 app/models/vpago/user_decorator.rb create mode 100644 db/migrate/20241218022922_create_spree_linked_account.rb create mode 100644 lib/vpago/payway_v2/account_linker.rb diff --git a/app/controllers/spree/api/v2/storefront/account_on_files_controller.rb b/app/controllers/spree/api/v2/storefront/account_on_files_controller.rb new file mode 100644 index 00000000..33a3e08a --- /dev/null +++ b/app/controllers/spree/api/v2/storefront/account_on_files_controller.rb @@ -0,0 +1,12 @@ +module Spree + module Api + module V2 + module Storefront + class AccountOnFilesController < BaseController + def create + end + end + end + end + end +end diff --git a/app/models/spree/linked_account.rb b/app/models/spree/linked_account.rb new file mode 100644 index 00000000..8d284061 --- /dev/null +++ b/app/models/spree/linked_account.rb @@ -0,0 +1,5 @@ +module Spree + class LinkedAccount < Base + belongs_to :user, class_name: 'Spree::User' + end +end diff --git a/app/models/vpago/user_decorator.rb b/app/models/vpago/user_decorator.rb new file mode 100644 index 00000000..eb820ca9 --- /dev/null +++ b/app/models/vpago/user_decorator.rb @@ -0,0 +1,9 @@ +module Vpago + module UserDecorator + def self.prepended(base) + base.has_one :linked_account, dependent: :destroy, class_name: 'Spree::LinkedAccount' + end + end +end + +Spree::Product.prepend(Vpago::UserDecorator) diff --git a/config/routes.rb b/config/routes.rb index 85c78319..5e45b65c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -48,6 +48,7 @@ get :payment_redirect patch :request_update_payment end + resources :account_on_files, only: [:create] end end end diff --git a/db/migrate/20241218022922_create_spree_linked_account.rb b/db/migrate/20241218022922_create_spree_linked_account.rb new file mode 100644 index 00000000..c49e8ebf --- /dev/null +++ b/db/migrate/20241218022922_create_spree_linked_account.rb @@ -0,0 +1,9 @@ +class CreateSpreeLinkedAccount < ActiveRecord::Migration[7.0] + def change + create_table :spree_linked_accounts do |t| + t.references :user, null: false, foreign_key: { to_table: :spree_users } + t.jsonb :response, default: {} + t.timestamps + end + end +end diff --git a/lib/vpago/payway_v2/account_linker.rb b/lib/vpago/payway_v2/account_linker.rb new file mode 100644 index 00000000..75cd0577 --- /dev/null +++ b/lib/vpago/payway_v2/account_linker.rb @@ -0,0 +1,54 @@ +require 'faraday' + +module Vpago + module PaywayV2 + class AccountLinker + def call + context.response = response + end + + def response + conn = Faraday::Connection.new do |faraday| + faraday.request :url_encoded + end + + data = { + request_time: req_time, + merchant_id: merchant_id, + return_params: nil, + return_url: return_url, + hash: hash + } + conn.post(link_account_url, data) + end + + def link_account_url + "#{host}#{ENV.fetch('PAYWAY_V2_LINK_ACCCOUNT_PATH')}" + end + + def merchant_id + ENV.fetch('MERCHANT_ID') + end + + def req_time + Time.current.strftime('%Y%m%d%H%M%S') + end + + def return_url + preferred_return_url = ENV.fetch('PAYWAY_V2_LINK_ACCOUNT_CALLBACK_URL', nil) + return nil if preferred_return_url.blank? + + Base64.encode64(preferred_return_url).delete("\n") + end + + def hash + hash_data = "#{merchant_id}#{req_time}" + Base64.strict_encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha512'), api_key, hash_data)) + end + + def api_key + ENV.fetch('API_KEY') + end + end + end +end