Контекст
В моем приложении для 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