Add web app model, service to fetch metadata

This commit is contained in:
Râu Cao 2023-10-19 16:18:13 +02:00
parent e1b7e1b2ef
commit e56c9bd0d5
Signed by: raucao
GPG Key ID: 15E65F399D084BA9
8 changed files with 81 additions and 1 deletions

View File

@ -0,0 +1,5 @@
module AppCatalog
def self.table_name_prefix
"app_catalog_"
end
end

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,2 @@
class AppCatalogManagerService < ApplicationService
end

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -0,0 +1,5 @@
require 'rails_helper'
RSpec.describe AppCatalog::WebApp, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end