diff --git a/apps/api/app/services/image_usage.rb b/apps/api/app/services/image_usage.rb deleted file mode 100644 index 958353e..0000000 --- a/apps/api/app/services/image_usage.rb +++ /dev/null @@ -1,30 +0,0 @@ -# A katalóguson kívüli modellek regisztrálják ide, hogy mely Image rekordokat -# használják. A leendő WarpEngine.config.image_owners hook elődje: az admin -# Images oldal In use/Orphan logikája ezen keresztül marad domain-független. -# -# Owner kontraktus: -# image_ids: -> { Array } — az owner által használt image id-k -# usage_label: ->(image) { String vagy nil } — megjelenítendő címke, ha használja -module ImageUsage - Owner = Struct.new(:label, :image_ids, :usage_label, keyword_init: true) - - def self.owners - @owners ||= [] - end - - def self.reset! - @owners = [] - end - - def self.register(label:, image_ids:, usage_label:) - owners << Owner.new(label:, image_ids:, usage_label:) - end - - def self.used_image_ids - owners.flat_map { |o| o.image_ids.call } - end - - def self.usage_labels_for(image) - owners.filter_map { |o| o.usage_label.call(image) } - end -end diff --git a/apps/api/config/initializers/image_usage.rb b/apps/api/config/initializers/image_usage.rb deleted file mode 100644 index 2a6ae0f..0000000 --- a/apps/api/config/initializers/image_usage.rb +++ /dev/null @@ -1,9 +0,0 @@ -# TTG-specifikus image-használók regisztrációja. to_prepare: reload után is újrafut. -Rails.application.config.to_prepare do - ImageUsage.reset! - ImageUsage.register( - label: "member", - image_ids: -> { Member.where.not(image_id: nil).distinct.pluck(:image_id) }, - usage_label: ->(image) { "member" if Member.where(image_id: image.id).exists? } - ) -end diff --git a/apps/api/config/initializers/warp_engine.rb b/apps/api/config/initializers/warp_engine.rb new file mode 100644 index 0000000..fa2278f --- /dev/null +++ b/apps/api/config/initializers/warp_engine.rb @@ -0,0 +1,13 @@ +# WarpEngine host-konfiguráció. to_prepare: reload után is újrafut, ezért +# értékadás (nem <<), hogy idempotens legyen. +Rails.application.config.to_prepare do + WarpEngine.configure do |c| + c.image_owners = [ + { + label: "member", + image_ids: -> { Member.where.not(image_id: nil).distinct.pluck(:image_id) }, + usage_label: ->(image) { "member" if Member.where(image_id: image.id).exists? } + } + ] + end +end diff --git a/apps/api/app/admin/downloads.rb b/libs/ruby/warp_engine/app/admin/downloads.rb similarity index 100% rename from apps/api/app/admin/downloads.rb rename to libs/ruby/warp_engine/app/admin/downloads.rb diff --git a/apps/api/app/admin/external_links.rb b/libs/ruby/warp_engine/app/admin/external_links.rb similarity index 100% rename from apps/api/app/admin/external_links.rb rename to libs/ruby/warp_engine/app/admin/external_links.rb diff --git a/apps/api/app/admin/files.rb b/libs/ruby/warp_engine/app/admin/files.rb similarity index 98% rename from apps/api/app/admin/files.rb rename to libs/ruby/warp_engine/app/admin/files.rb index b88ae08..e81ef94 100644 --- a/apps/api/app/admin/files.rb +++ b/libs/ruby/warp_engine/app/admin/files.rb @@ -147,7 +147,7 @@ ActiveAdmin.register_page "Files" do # Download (files only) if entry[:type] != :directory - a "⬇️", href: "/softwares/#{entry[:path]}", class: "fm-icon-btn", title: "Download", download: entry[:name] + a "⬇️", href: "/file/#{entry[:path]}", class: "fm-icon-btn", title: "Download", download: entry[:name] end # Rename @@ -165,7 +165,7 @@ ActiveAdmin.register_page "Files" do # Picker mode: Select button if picker_mode - abs_path = "/softwares/#{entry[:path]}" + abs_path = File.join(WarpEngine.config.file_container_path, entry[:path]) a "Select", href: "#", class: "fm-btn fm-btn-select", onclick: "var inp=window.parent.document.getElementById('#{j picker_field}');if(inp){inp.value='#{j abs_path}';}var ov=window.parent.document.querySelector('.fm-modal-overlay');if(ov){ov.remove();window.parent.document.body.style.overflow='';}return false;" end diff --git a/apps/api/app/admin/images.rb b/libs/ruby/warp_engine/app/admin/images.rb similarity index 82% rename from apps/api/app/admin/images.rb rename to libs/ruby/warp_engine/app/admin/images.rb index 6dfb38c..3013920 100644 --- a/apps/api/app/admin/images.rb +++ b/libs/ruby/warp_engine/app/admin/images.rb @@ -3,7 +3,12 @@ ActiveAdmin.register WarpEngine::Image, as: "Image" do menu priority: 5, label: "🖼️ Images" - used_ids = -> { WarpEngine::SoftwareImage.distinct.pluck(:image_id) + ImageUsage.used_image_ids } + # SoftwareImage a natív használó; a hoston regisztrált image_owners + # (WarpEngine.config) további használókat adhat hozzá (pl. TTG Member). + used_ids = -> { + WarpEngine::SoftwareImage.unscope(:order).distinct.pluck(:image_id) + + WarpEngine.config.image_owners.flat_map { |o| o[:image_ids].call } + } scope :all, default: true scope("In use") { |scope| scope.where(id: used_ids.call) } @@ -31,7 +36,7 @@ ActiveAdmin.register WarpEngine::Image, as: "Image" do column(:usage) do |img| uses = [] uses << "#{img.software_images.size} software(s)" if img.software_images.any? - uses.concat(ImageUsage.usage_labels_for(img)) + uses.concat(WarpEngine.config.image_owners.filter_map { |o| o[:usage_label].call(img) }) uses.any? ? uses.join(", ") : status_tag("orphan", class: "warning") end column :created_at diff --git a/apps/api/app/admin/platform_links.rb b/libs/ruby/warp_engine/app/admin/platform_links.rb similarity index 100% rename from apps/api/app/admin/platform_links.rb rename to libs/ruby/warp_engine/app/admin/platform_links.rb diff --git a/apps/api/app/admin/releases.rb b/libs/ruby/warp_engine/app/admin/releases.rb similarity index 100% rename from apps/api/app/admin/releases.rb rename to libs/ruby/warp_engine/app/admin/releases.rb diff --git a/apps/api/app/admin/softwares.rb b/libs/ruby/warp_engine/app/admin/softwares.rb similarity index 100% rename from apps/api/app/admin/softwares.rb rename to libs/ruby/warp_engine/app/admin/softwares.rb diff --git a/libs/ruby/warp_engine/lib/warp_engine/engine.rb b/libs/ruby/warp_engine/lib/warp_engine/engine.rb index 9e473cb..b163d6b 100644 --- a/libs/ruby/warp_engine/lib/warp_engine/engine.rb +++ b/libs/ruby/warp_engine/lib/warp_engine/engine.rb @@ -1,5 +1,22 @@ module WarpEngine class Engine < ::Rails::Engine isolate_namespace WarpEngine + + # Az app/admin fájlok ActiveAdmin DSL-t tartalmaznak, nem definiálnak a + # fájlnévnek megfelelő konstansokat — a Zeitwerk (eager load) nem nyúlhat hozzájuk. + initializer "warp_engine.ignore_admin_dir", before: :setup_main_autoloader do + Rails.autoloaders.main.ignore(Engine.root.join("app/admin")) + end + + # Az admin erőforrásokat a HOST ActiveAdmin példánya tölti be; az engine csak + # regisztrálja a saját app/admin könyvtárát. Auth/téma/route-ok a host dolga. + initializer "warp_engine.active_admin" do |app| + if defined?(ActiveAdmin) + admin_dir = Engine.root.join("app/admin").to_s + ActiveAdmin.application.load_paths << admin_dir + # dev módban az engine admin-fájljainak szerkesztése is triggerel reloadot + app.config.watchable_dirs[admin_dir] = [ :rb ] + end + end end end