api refact
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user