api refact

This commit is contained in:
2026-05-05 23:16:53 +02:00
parent dd9afd3082
commit 9e4a9e8a52
13 changed files with 64 additions and 99 deletions
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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))
@@ -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
@@ -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
@@ -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