From f0cfde560ba03351e6d8642a9ef5ff7a2a860d35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Sat, 17 May 2025 14:17:57 +0400 Subject: [PATCH] Add Mastodon API service class, auth token config Add a new REST API service class to keep things DRY --- .../concerns/settings/mastodon_settings.rb | 3 +++ app/services/btcpay_manager_service.rb | 16 +---------- app/services/mastodon_manager_service.rb | 22 +++++++++++++++ app/services/rest_api_service.rb | 27 +++++++++++++++++++ .../settings/services/_mastodon.html.erb | 5 ++++ docs/dev/mastodon.md | 10 +++++++ 6 files changed, 68 insertions(+), 15 deletions(-) create mode 100644 app/services/mastodon_manager_service.rb create mode 100644 app/services/rest_api_service.rb create mode 100644 docs/dev/mastodon.md diff --git a/app/models/concerns/settings/mastodon_settings.rb b/app/models/concerns/settings/mastodon_settings.rb index 7532c15..41a079c 100644 --- a/app/models/concerns/settings/mastodon_settings.rb +++ b/app/models/concerns/settings/mastodon_settings.rb @@ -11,6 +11,9 @@ module Settings field :mastodon_address_domain, type: :string, default: ENV["MASTODON_ADDRESS_DOMAIN"].presence || self.primary_domain + + field :mastodon_auth_token, type: :string, + default: ENV["MASTODON_AUTH_TOKEN"].presence end end end diff --git a/app/services/btcpay_manager_service.rb b/app/services/btcpay_manager_service.rb index 4dedb61..245d784 100644 --- a/app/services/btcpay_manager_service.rb +++ b/app/services/btcpay_manager_service.rb @@ -1,7 +1,7 @@ # # API Docs: https://docs.btcpayserver.org/API/Greenfield/v1/ # -class BtcpayManagerService < ApplicationService +class BtcpayManagerService < RestApiService private def base_url @@ -19,18 +19,4 @@ class BtcpayManagerService < ApplicationService "Authorization" => "token #{auth_token}" } end - - def endpoint_url(path) - "#{base_url}/#{path.gsub(/^\//, '')}" - end - - def get(path, params = {}) - res = Faraday.get endpoint_url(path), params, headers - JSON.parse(res.body) - end - - def post(path, payload) - res = Faraday.post endpoint_url(path), payload.to_json, headers - JSON.parse(res.body) - end end diff --git a/app/services/mastodon_manager_service.rb b/app/services/mastodon_manager_service.rb new file mode 100644 index 0000000..9c7fac9 --- /dev/null +++ b/app/services/mastodon_manager_service.rb @@ -0,0 +1,22 @@ +# +# API Docs: https://docs.joinmastodon.org/methods/ +# +class MastodonManagerService < RestApiService + private + + def base_url + @base_url ||= "#{Setting.mastodon_public_url}/api" + end + + def auth_token + @auth_token ||= Setting.mastodon_auth_token + end + + def headers + { + "Content-Type" => "application/json", + "Accept" => "application/json", + "Authorization" => "Bearer #{auth_token}" + } + end +end diff --git a/app/services/rest_api_service.rb b/app/services/rest_api_service.rb new file mode 100644 index 0000000..c0bd0c6 --- /dev/null +++ b/app/services/rest_api_service.rb @@ -0,0 +1,27 @@ +class RestApiService < ApplicationService + private + + def base_url + raise NotImplementedError + end + + def headers + raise NotImplementedError + end + + def endpoint_url(path) + "#{base_url}/#{path.gsub(/^\//, '')}" + end + + def get(path, params = {}) + res = Faraday.get endpoint_url(path), params, headers + # TODO handle unsuccessful responses with no valid JSON body + JSON.parse(res.body) + end + + def post(path, payload) + res = Faraday.post endpoint_url(path), payload.to_json, headers + # TODO handle unsuccessful responses with no valid JSON body + JSON.parse(res.body) + end +end diff --git a/app/views/admin/settings/services/_mastodon.html.erb b/app/views/admin/settings/services/_mastodon.html.erb index 1266db1..482197f 100644 --- a/app/views/admin/settings/services/_mastodon.html.erb +++ b/app/views/admin/settings/services/_mastodon.html.erb @@ -16,5 +16,10 @@ key: :mastodon_address_domain, title: "User address domain" ) %> + <%= render FormElements::FieldsetResettableSettingComponent.new( + key: :mastodon_auth_token, + type: :password, + title: "API auth token" + ) %> <% end %> diff --git a/docs/dev/mastodon.md b/docs/dev/mastodon.md new file mode 100644 index 0000000..d010da3 --- /dev/null +++ b/docs/dev/mastodon.md @@ -0,0 +1,10 @@ +# Mastodon + +## API access + +(Optional) + +Log in to your Mastodon instance with an admin account and create a new +OAuth application: + +https://kosmos.social/settings/applications/new