From a275b5e72a3c8f48d1b499de6abf89bc4b1a46cd Mon Sep 17 00:00:00 2001 From: Zsolt Tasnadi Date: Fri, 31 Jul 2026 18:36:12 +0200 Subject: [PATCH] add bevy and phaser engine support --- apps/api/app/admin/softwares.rb | 4 ++-- .../controllers/api/software_controller.rb | 2 +- .../api/software_highlighted_controller.rb | 2 +- apps/api/app/controllers/update_controller.rb | 2 +- .../services/software_updater/bevy_service.rb | 22 +++++++++++++++++ .../software_updater/phaser_service.rb | 22 +++++++++++++++++ apps/api/app/services/update_service.rb | 4 +++- apps/api/spec/services/update_service_spec.rb | 24 +++++++++++++++++++ 8 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 apps/api/app/services/software_updater/bevy_service.rb create mode 100644 apps/api/app/services/software_updater/phaser_service.rb diff --git a/apps/api/app/admin/softwares.rb b/apps/api/app/admin/softwares.rb index ca53579..3c13b30 100644 --- a/apps/api/app/admin/softwares.rb +++ b/apps/api/app/admin/softwares.rb @@ -37,7 +37,7 @@ ActiveAdmin.register Software do filter :name filter :title filter :author - filter :platform, as: :select, collection: %w[tic80 ebitengine love c64 godot] + filter :platform, as: :select, collection: %w[tic80 ebitengine love c64 godot bevy phaser] filter :status, as: :select, collection: %w[development demo released archived] filter :highlighted @@ -93,7 +93,7 @@ ActiveAdmin.register Software do f.input :name f.input :title f.input :author - f.input :platform, as: :select, collection: %w[tic80 ebitengine love c64 godot] + f.input :platform, as: :select, collection: %w[tic80 ebitengine love c64 godot bevy phaser] f.input :status, as: :select, collection: %w[development demo released archived] f.input :highlighted f.input :license diff --git a/apps/api/app/controllers/api/software_controller.rb b/apps/api/app/controllers/api/software_controller.rb index 0e30f1b..20c5ebe 100644 --- a/apps/api/app/controllers/api/software_controller.rb +++ b/apps/api/app/controllers/api/software_controller.rb @@ -37,7 +37,7 @@ class Api::SoftwareController < ApiController property :desc, String, desc: "Short description" property :story, String, desc: "Long description / story" property :license, String, desc: "License type" - property :platform, String, desc: "Platform (tic80, love, ebitengine, c64, godot)" + property :platform, String, desc: "Platform (tic80, love, ebitengine, c64, godot, bevy, phaser)" property :status, String, desc: "Status (active, inactive)" property :highlighted, :boolean, desc: "Currently highlighted" property :imageUrl, String, desc: "Default image URL" diff --git a/apps/api/app/controllers/api/software_highlighted_controller.rb b/apps/api/app/controllers/api/software_highlighted_controller.rb index 4af2f8a..59ae8f3 100644 --- a/apps/api/app/controllers/api/software_highlighted_controller.rb +++ b/apps/api/app/controllers/api/software_highlighted_controller.rb @@ -13,7 +13,7 @@ class Api::SoftwareHighlightedController < ApiController property :desc, String, desc: "Short description" property :story, String, desc: "Long description / story" property :license, String, desc: "License type" - property :platform, String, desc: "Platform (tic80, love, ebitengine, c64, godot)" + property :platform, String, desc: "Platform (tic80, love, ebitengine, c64, godot, bevy, phaser)" property :status, String, desc: "Status" property :highlighted, :boolean, desc: "Highlighted flag" property :imageUrl, String, desc: "Default image URL" diff --git a/apps/api/app/controllers/update_controller.rb b/apps/api/app/controllers/update_controller.rb index 381742b..94c1efd 100644 --- a/apps/api/app/controllers/update_controller.rb +++ b/apps/api/app/controllers/update_controller.rb @@ -6,7 +6,7 @@ class UpdateController < ApiController api :GET, "/update", "Update software version in database" param :secret, String, required: true, desc: "Authorization secret" - param :platform, String, required: false, desc: "Platform (tic80, love, ebitengine, c64, godot)" + param :platform, String, required: false, desc: "Platform (tic80, love, ebitengine, c64, godot, bevy, phaser)" param :name, String, required: false, desc: "Software name" param :version, String, required: true, desc: "Version string" returns code: 200, desc: "Plain text 'Updated'" diff --git a/apps/api/app/services/software_updater/bevy_service.rb b/apps/api/app/services/software_updater/bevy_service.rb new file mode 100644 index 0000000..f43ed5c --- /dev/null +++ b/apps/api/app/services/software_updater/bevy_service.rb @@ -0,0 +1,22 @@ +module SoftwareUpdater + class BevyService < BaseService + def update(name, version) + versioned = "#{name}-#{version}" + extract_zip_to_dir("#{versioned}.html.zip", versioned) + + metadata = parse_json_metadata(full_path("#{versioned}.metadata.json")) + site_url = metadata.delete(:site) + + ActiveRecord::Base.transaction do + software = update_or_create_software(metadata.merge(platform: "bevy")) + upsert_external_link(software.id, "Source Code", site_url) if site_url.present? + + create_release_if_not_exists( + software_id: software.id, + version: version, + html_folder_path: full_path(versioned) + ) + end + end + end +end diff --git a/apps/api/app/services/software_updater/phaser_service.rb b/apps/api/app/services/software_updater/phaser_service.rb new file mode 100644 index 0000000..f72d3f9 --- /dev/null +++ b/apps/api/app/services/software_updater/phaser_service.rb @@ -0,0 +1,22 @@ +module SoftwareUpdater + class PhaserService < BaseService + def update(name, version) + versioned = "#{name}-#{version}" + extract_zip_to_dir("#{versioned}.html.zip", versioned) + + metadata = parse_json_metadata(full_path("#{versioned}.metadata.json")) + site_url = metadata.delete(:site) + + ActiveRecord::Base.transaction do + software = update_or_create_software(metadata.merge(platform: "phaser")) + upsert_external_link(software.id, "Source Code", site_url) if site_url.present? + + create_release_if_not_exists( + software_id: software.id, + version: version, + html_folder_path: full_path(versioned) + ) + end + end + end +end diff --git a/apps/api/app/services/update_service.rb b/apps/api/app/services/update_service.rb index 39ef998..a43b5f6 100644 --- a/apps/api/app/services/update_service.rb +++ b/apps/api/app/services/update_service.rb @@ -4,7 +4,9 @@ class UpdateService "ebitengine" => "SoftwareUpdater::EbitengineService", "love" => "SoftwareUpdater::LoveService", "c64" => "SoftwareUpdater::C64Service", - "godot" => "SoftwareUpdater::GodotService" + "godot" => "SoftwareUpdater::GodotService", + "bevy" => "SoftwareUpdater::BevyService", + "phaser" => "SoftwareUpdater::PhaserService" }.freeze def update(input) diff --git a/apps/api/spec/services/update_service_spec.rb b/apps/api/spec/services/update_service_spec.rb index c195d8b..af29d4c 100644 --- a/apps/api/spec/services/update_service_spec.rb +++ b/apps/api/spec/services/update_service_spec.rb @@ -31,5 +31,29 @@ RSpec.describe UpdateService do expect(mock_service).to have_received(:update).with("game", "1.0") end + + it "routes bevy platform to BevyService" do + input = UpdateInputDto.new(platform: "bevy", name: "game", version: "1.0") + mock_service = instance_double(SoftwareUpdater::BevyService) + + allow(SoftwareUpdater::BevyService).to receive(:new).and_return(mock_service) + allow(mock_service).to receive(:update) + + described_class.new.update(input) + + expect(mock_service).to have_received(:update).with("game", "1.0") + end + + it "routes phaser platform to PhaserService" do + input = UpdateInputDto.new(platform: "phaser", name: "game", version: "1.0") + mock_service = instance_double(SoftwareUpdater::PhaserService) + + allow(SoftwareUpdater::PhaserService).to receive(:new).and_return(mock_service) + allow(mock_service).to receive(:update) + + described_class.new.update(input) + + expect(mock_service).to have_received(:update).with("game", "1.0") + end end end