From e56c9bd0d5c0f5d5580555d25873338a3dd4f69b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Thu, 19 Oct 2023 16:18:13 +0200 Subject: [PATCH] Add web app model, service to fetch metadata --- app/models/app_catalog.rb | 5 ++++ app/models/app_catalog/web_app.rb | 9 +++++++ .../app_catalog_manager/fetch_metadata.rb | 26 +++++++++++++++++++ app/services/app_catalog_manager_service.rb | 2 ++ ...31019125135_create_app_catalog_web_apps.rb | 11 ++++++++ db/schema.rb | 10 ++++++- spec/factories/app_catalog/web_apps.rb | 14 ++++++++++ spec/models/app_catalog/web_app_spec.rb | 5 ++++ 8 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 app/models/app_catalog.rb create mode 100644 app/models/app_catalog/web_app.rb create mode 100644 app/services/app_catalog_manager/fetch_metadata.rb create mode 100644 app/services/app_catalog_manager_service.rb create mode 100644 db/migrate/20231019125135_create_app_catalog_web_apps.rb create mode 100644 spec/factories/app_catalog/web_apps.rb create mode 100644 spec/models/app_catalog/web_app_spec.rb diff --git a/app/models/app_catalog.rb b/app/models/app_catalog.rb new file mode 100644 index 0000000..e6cd4c5 --- /dev/null +++ b/app/models/app_catalog.rb @@ -0,0 +1,5 @@ +module AppCatalog + def self.table_name_prefix + "app_catalog_" + end +end diff --git a/app/models/app_catalog/web_app.rb b/app/models/app_catalog/web_app.rb new file mode 100644 index 0000000..4287a11 --- /dev/null +++ b/app/models/app_catalog/web_app.rb @@ -0,0 +1,9 @@ +class AppCatalog::WebApp < ApplicationRecord + + store :metadata, coder: JSON + + validates :url, presence: true, uniqueness: true + validates :url, format: { with: URI.regexp }, + if: Proc.new { |a| a.url.present? } + +end diff --git a/app/services/app_catalog_manager/fetch_metadata.rb b/app/services/app_catalog_manager/fetch_metadata.rb new file mode 100644 index 0000000..3e6f11d --- /dev/null +++ b/app/services/app_catalog_manager/fetch_metadata.rb @@ -0,0 +1,26 @@ +require 'manifique' + +module AppCatalogManager + class FetchMetadata < AppCatalogManagerService + def initialize(app) + @app = app + end + + def call + agent = Manifique::Agent.new(url: @app.url) + metadata = agent.fetch_metadata + + @app.name = metadata.name + + [:name, :short_name, :description, :theme_color, :background_color, + :display, :start_url, :scope, :share_target].each do |prop| + @app.metadata[prop] = metadata.send(prop) if prop + end + rescue Manifique::Error => e + msg = "Fetching web app manifest failed for #{e.url}: #{e.type}" + Rails.logger.warn(msg) + Sentry.capture_message(msg) if Setting.sentry_enabled? + false + end + end +end diff --git a/app/services/app_catalog_manager_service.rb b/app/services/app_catalog_manager_service.rb new file mode 100644 index 0000000..f513907 --- /dev/null +++ b/app/services/app_catalog_manager_service.rb @@ -0,0 +1,2 @@ +class AppCatalogManagerService < ApplicationService +end diff --git a/db/migrate/20231019125135_create_app_catalog_web_apps.rb b/db/migrate/20231019125135_create_app_catalog_web_apps.rb new file mode 100644 index 0000000..451a54b --- /dev/null +++ b/db/migrate/20231019125135_create_app_catalog_web_apps.rb @@ -0,0 +1,11 @@ +class CreateAppCatalogWebApps < ActiveRecord::Migration[7.0] + def change + create_table :app_catalog_web_apps do |t| + t.string :url + t.string :name + t.text :metadata + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index bff7e78..acee874 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_09_06_073324) do +ActiveRecord::Schema[7.0].define(version: 2023_10_19_125135) do create_table "active_storage_attachments", force: :cascade do |t| t.string "name", null: false t.string "record_type", null: false @@ -39,6 +39,14 @@ ActiveRecord::Schema[7.0].define(version: 2023_09_06_073324) do t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true end + create_table "app_catalog_web_apps", force: :cascade do |t| + t.string "url" + t.string "name" + t.text "metadata" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "donations", force: :cascade do |t| t.integer "user_id" t.integer "amount_sats" diff --git a/spec/factories/app_catalog/web_apps.rb b/spec/factories/app_catalog/web_apps.rb new file mode 100644 index 0000000..b9ef31a --- /dev/null +++ b/spec/factories/app_catalog/web_apps.rb @@ -0,0 +1,14 @@ +FactoryBot.define do + factory :app_catalog_web_app, class: 'AppCatalog::WebApp' do + url { "https://myfavoritedrinks.remotestorage.io/" } + name { "My Favorite Drinks" } + short_name { "Drinks" } + description { nil } + theme_color { nil } + background_color { nil } + display { nil } + start_url { nil } + scope { nil } + share_target { nil } + end +end diff --git a/spec/models/app_catalog/web_app_spec.rb b/spec/models/app_catalog/web_app_spec.rb new file mode 100644 index 0000000..5d94508 --- /dev/null +++ b/spec/models/app_catalog/web_app_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe AppCatalog::WebApp, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end