From 9e4a9e8a529d2eeee45d9a4633e91131008e20d0 Mon Sep 17 00:00:00 2001 From: Zsolt Tasnadi Date: Tue, 5 May 2026 23:16:53 +0200 Subject: [PATCH] api refact --- .../app/controllers/api/events_controller.rb | 5 +--- .../app/controllers/api/images_controller.rb | 10 +++---- .../app/controllers/api/members_controller.rb | 11 +------- .../controllers/api/software_controller.rb | 9 +++---- .../api/software_highlighted_controller.rb | 16 +++++------ apps/api/app/serializers/event_serializer.rb | 7 +++++ apps/api/app/serializers/member_serializer.rb | 15 +++++++++++ .../software_serializer.rb | 0 .../api/app/services/software_show_service.rb | 11 -------- .../services/software_updater/base_service.rb | 12 +++++++++ .../software_updater/ebitengine_service.rb | 20 +++----------- .../services/software_updater/love_service.rb | 20 +++----------- .../software_updater/tic80_service.rb | 27 +++++++------------ 13 files changed, 64 insertions(+), 99 deletions(-) create mode 100644 apps/api/app/serializers/event_serializer.rb create mode 100644 apps/api/app/serializers/member_serializer.rb rename apps/api/app/{services => serializers}/software_serializer.rb (100%) delete mode 100644 apps/api/app/services/software_show_service.rb diff --git a/apps/api/app/controllers/api/events_controller.rb b/apps/api/app/controllers/api/events_controller.rb index 703fe8a..8cd03dd 100644 --- a/apps/api/app/controllers/api/events_controller.rb +++ b/apps/api/app/controllers/api/events_controller.rb @@ -1,8 +1,5 @@ class Api::EventsController < ApiController def index - events = Event.upcoming.map do |e| - { name: e.name, date: e.date.utc.strftime("%Y-%m-%dT%H:%M:%SZ") } - end - render json: events + render json: EventSerializer.serialize_all(Event.upcoming) end end diff --git a/apps/api/app/controllers/api/images_controller.rb b/apps/api/app/controllers/api/images_controller.rb index 353cc18..12a0525 100644 --- a/apps/api/app/controllers/api/images_controller.rb +++ b/apps/api/app/controllers/api/images_controller.rb @@ -1,14 +1,10 @@ class Api::ImagesController < ApplicationController - skip_before_action :verify_authenticity_token - def show image = Image.find(params[:id]) - path = image.file_path - - return render plain: "Not Found", status: :not_found unless File.exist?(path) - - send_file path, type: image.content_type, disposition: "inline" + send_file image.file_path, type: image.content_type, disposition: "inline" rescue ActiveRecord::RecordNotFound render plain: "Not Found", status: :not_found + rescue Errno::ENOENT + render plain: "Not Found", status: :not_found end end diff --git a/apps/api/app/controllers/api/members_controller.rb b/apps/api/app/controllers/api/members_controller.rb index ba9720b..56e5853 100644 --- a/apps/api/app/controllers/api/members_controller.rb +++ b/apps/api/app/controllers/api/members_controller.rb @@ -1,14 +1,5 @@ class Api::MembersController < ApiController def index - members = Member.includes(:image).order(:id).map do |m| - { - nick: m.nick, - real_nick: m.real_nick, - motto: m.motto, - avatar_filename: m.avatar_filename, - image_url: m.image_id ? "/api/image/#{m.image_id}" : nil - } - end - render json: members + render json: MemberSerializer.serialize_all(Member.includes(:image).order(:id)) end end diff --git a/apps/api/app/controllers/api/software_controller.rb b/apps/api/app/controllers/api/software_controller.rb index e477c67..668b417 100644 --- a/apps/api/app/controllers/api/software_controller.rb +++ b/apps/api/app/controllers/api/software_controller.rb @@ -1,8 +1,5 @@ -module Api - class SoftwareController < ApiController - def index - result = SoftwareListService.new.call - render json: result - end +class Api::SoftwareController < ApiController + def index + render json: SoftwareListService.new.call end end diff --git a/apps/api/app/controllers/api/software_highlighted_controller.rb b/apps/api/app/controllers/api/software_highlighted_controller.rb index e15be53..cafaf0b 100644 --- a/apps/api/app/controllers/api/software_highlighted_controller.rb +++ b/apps/api/app/controllers/api/software_highlighted_controller.rb @@ -1,12 +1,10 @@ -module Api - class SoftwareHighlightedController < ApiController - def index - result = SoftwareHighlightedService.new.call - if result.nil? - render json: { error: "no highlighted software found" }, status: :not_found - else - render json: result - end +class Api::SoftwareHighlightedController < ApiController + def index + result = SoftwareHighlightedService.new.call + if result + render json: result + else + render json: { error: "no highlighted software found" }, status: :not_found end end end diff --git a/apps/api/app/serializers/event_serializer.rb b/apps/api/app/serializers/event_serializer.rb new file mode 100644 index 0000000..1f06bdd --- /dev/null +++ b/apps/api/app/serializers/event_serializer.rb @@ -0,0 +1,7 @@ +class EventSerializer + DATE_FORMAT = "%Y-%m-%dT%H:%M:%SZ" + + def self.serialize_all(events) + events.map { |e| { name: e.name, date: e.date.utc.strftime(DATE_FORMAT) } } + end +end diff --git a/apps/api/app/serializers/member_serializer.rb b/apps/api/app/serializers/member_serializer.rb new file mode 100644 index 0000000..9ea67eb --- /dev/null +++ b/apps/api/app/serializers/member_serializer.rb @@ -0,0 +1,15 @@ +class MemberSerializer + def self.serialize_all(members) + members.map { |m| serialize(m) } + end + + def self.serialize(m) + { + nick: m.nick, + real_nick: m.real_nick, + motto: m.motto, + avatar_filename: m.avatar_filename, + image_url: m.image_id ? "/api/image/#{m.image_id}" : nil + } + end +end diff --git a/apps/api/app/services/software_serializer.rb b/apps/api/app/serializers/software_serializer.rb similarity index 100% rename from apps/api/app/services/software_serializer.rb rename to apps/api/app/serializers/software_serializer.rb diff --git a/apps/api/app/services/software_show_service.rb b/apps/api/app/services/software_show_service.rb deleted file mode 100644 index 4ec9f0e..0000000 --- a/apps/api/app/services/software_show_service.rb +++ /dev/null @@ -1,11 +0,0 @@ -class SoftwareShowService - def initialize(name) - @name = name - end - - def call - software = Software.includes(:external_links).find_by!(name: @name) - releases = Release.where(software_id: software.id).to_a - SoftwareSerializer.show_data(software, releases) - end -end diff --git a/apps/api/app/services/software_updater/base_service.rb b/apps/api/app/services/software_updater/base_service.rb index 30ad544..2f18f21 100644 --- a/apps/api/app/services/software_updater/base_service.rb +++ b/apps/api/app/services/software_updater/base_service.rb @@ -1,4 +1,5 @@ require "zip" +require "json" require "fileutils" module SoftwareUpdater @@ -36,6 +37,17 @@ module SoftwareUpdater end end + def extract_zip_to_dir(zip_file, dir_name) + delete_dir(dir_name) if dir_exists?(dir_name) + create_dir(dir_name) + unzip_file(zip_file, dir_name) + end + + def parse_json_metadata(path) + raw = JSON.parse(File.read(path), symbolize_names: true) + raw.slice(:name, :title, :author, :desc, :site, :license) + end + def update_or_create_software(attrs) software = Software.unscoped.find_or_initialize_by(name: attrs[:name]) software.assign_attributes(attrs.except(:name)) diff --git a/apps/api/app/services/software_updater/ebitengine_service.rb b/apps/api/app/services/software_updater/ebitengine_service.rb index 555d091..5d50bfb 100644 --- a/apps/api/app/services/software_updater/ebitengine_service.rb +++ b/apps/api/app/services/software_updater/ebitengine_service.rb @@ -1,17 +1,10 @@ -require "json" - module SoftwareUpdater class EbitengineService < BaseService def update(name, version) versioned = "#{name}-#{version}" - zip_file = "#{versioned}.html.zip" - html_dir = versioned + extract_zip_to_dir("#{versioned}.html.zip", versioned) - delete_dir(html_dir) if dir_exists?(html_dir) - create_dir(html_dir) - unzip_file(zip_file, html_dir) - - metadata = parse_metadata(full_path("#{versioned}.metadata.json")) + metadata = parse_json_metadata(full_path("#{versioned}.metadata.json")) site_url = metadata.delete(:site) software = update_or_create_software(metadata.merge(platform: "ebitengine")) @@ -20,15 +13,8 @@ module SoftwareUpdater create_release_if_not_exists( software_id: software.id, version: version, - html_folder_path: full_path(html_dir) + html_folder_path: full_path(versioned) ) end - - private - - def parse_metadata(path) - raw = JSON.parse(File.read(path), symbolize_names: true) - raw.slice(:name, :title, :author, :desc, :site, :license) - end end end diff --git a/apps/api/app/services/software_updater/love_service.rb b/apps/api/app/services/software_updater/love_service.rb index baa0e46..d866ef5 100644 --- a/apps/api/app/services/software_updater/love_service.rb +++ b/apps/api/app/services/software_updater/love_service.rb @@ -1,17 +1,10 @@ -require "json" - module SoftwareUpdater class LoveService < BaseService def update(name, version) versioned = "#{name}-#{version}" - zip_file = "#{versioned}.html.zip" - html_dir = versioned + extract_zip_to_dir("#{versioned}.html.zip", versioned) - delete_dir(html_dir) if dir_exists?(html_dir) - create_dir(html_dir) - unzip_file(zip_file, html_dir) - - metadata = parse_metadata(full_path("#{versioned}.metadata.json")) + metadata = parse_json_metadata(full_path("#{versioned}.metadata.json")) site_url = metadata.delete(:site) software = update_or_create_software(metadata.merge(platform: "love")) @@ -20,15 +13,8 @@ module SoftwareUpdater create_release_if_not_exists( software_id: software.id, version: version, - html_folder_path: full_path(html_dir) + html_folder_path: full_path(versioned) ) end - - private - - def parse_metadata(path) - raw = JSON.parse(File.read(path), symbolize_names: true) - raw.slice(:name, :title, :author, :desc, :site, :license) - end end end diff --git a/apps/api/app/services/software_updater/tic80_service.rb b/apps/api/app/services/software_updater/tic80_service.rb index 01ed427..1bcfda9 100644 --- a/apps/api/app/services/software_updater/tic80_service.rb +++ b/apps/api/app/services/software_updater/tic80_service.rb @@ -1,20 +1,11 @@ module SoftwareUpdater class Tic80Service < BaseService def update(name, version) - versioned = "#{name}-#{version}" - zip_file = "#{versioned}.html.zip" - docs_zip_file = "#{versioned}-docs.zip" - html_dir = versioned - docs_dir = "#{versioned}-docs" + versioned = "#{name}-#{version}" + docs_dir = "#{versioned}-docs" - delete_dir(html_dir) if dir_exists?(html_dir) - delete_dir(docs_dir) if dir_exists?(docs_dir) - - create_dir(html_dir) - unzip_file(zip_file, html_dir) - - create_dir(docs_dir) - unzip_file(docs_zip_file, docs_dir) + extract_zip_to_dir("#{versioned}.html.zip", versioned) + extract_zip_to_dir("#{versioned}-docs.zip", docs_dir) metadata = parse_lua_metadata(full_path("#{versioned}.lua")) site_url = metadata.delete(:site) @@ -23,11 +14,11 @@ module SoftwareUpdater upsert_external_link(software.id, "Source Code", site_url) if site_url.present? create_release_if_not_exists( - software_id: software.id, - version: version, - cartridge_path: full_path("#{versioned}.tic"), - source_path: full_path("#{versioned}.lua"), - html_folder_path: full_path(html_dir), + software_id: software.id, + version: version, + cartridge_path: full_path("#{versioned}.tic"), + source_path: full_path("#{versioned}.lua"), + html_folder_path: full_path(versioned), docs_folder_path: full_path(docs_dir) ) end