Управление несколькими вызовами API с помощью Sidekiq - PullRequest
0 голосов
/ 06 апреля 2020

Контекст

В моем приложении для bike_rental_shops я даю возможность этим магазинам управлять прокатом велосипедов. bike_rental_shops также может предлагать свои велосипеды на сайтах сторонних организаций. Поэтому я подключаю свое Rails-приложение к этим внешним веб-сайтам.

Цель Я хотел бы дать bike_rental_shops возможность выбирать внешние веб-сайты, к которым они хотели бы подключиться, и впоследствии создавать вызов API, который выполняется каждые 5 минут.

Текущая настройка

  • Я создал 1 соединение API для 1 bike_rental_shop через Sidekiq. Идея заключалась в том, чтобы создать отдельную работу для внешнего веб-сайта, который нуждается в вызове API.

  • В задании Sidekiq маркер API жестко закодирован, но ему нужно перейти на application.yml на bike_rental_shop.

  • Задание Sidekiq выполняется, когда пользователь открывает reservation index page.

  • Кроме того, я создаю таблицу APIPartners для хранения соединений, которые bike_rental_shop хотел бы создать. (например, id: 1, name: FirstReservationApi). Не использовал эту таблицу до этого момента, так как я не уверен, что делать.

Вопрос

Как разработать какой-то вид таймер, который создает вызовы API для внешних веб-сайтов, к которым bike_rental_shop хотел бы подключиться (например, внешние веб-сайты, хранящиеся в таблице ApiPartners), где

  • вызов API должен создаваться / вызываться только для внешних веб-сайтов bike_rental_shop хотел бы подключиться (поэтому не все возможные вызовы API должны запускаться)

Код

модели

class BikeRentalShop < ApplicationRecord
  has_many :api_partners
end

class APIPartner < ApplicationRecord
  belongs_to :bike_rental_shop
end

reservations_controller.rb

def index
  @bike_rental_shop = BikeRentalShop.find(params[:id])

  # API call first external website
  FirstReservationAPI.perform_later(@bike_rental_shop.id)
  @reservations = @bike_rental_shop.reservations
end

jobs / first_reservation_api.rb

class FirstReservationAPI < ApplicationJob
  def perform(bike_rental_shop_id)
    token = #hardcoded token for test bike_rental_shop

   # rest of the code to create API call for 1 external website for one bike_rental_shop
  end
end
...