software_detail_serializer.rb

This commit is contained in:
2026-05-07 09:44:25 +02:00
parent 31f94fab32
commit 7ce94b50b9
4 changed files with 25 additions and 30 deletions
@@ -0,0 +1,6 @@
class SoftwareDetailSerializer < Blueprinter::Base
field(:software) { |sw, _| SoftwareSerializer.render_as_hash(sw) }
field(:releases) { |_, opts| ReleaseSerializer.render_as_hash(opts[:releases]) }
field(:latestRelease) { |_, opts| opts[:latest] ? ReleaseSerializer.render_as_hash(opts[:latest]) : nil }
field(:webPlayableRelease) { |_, opts| opts[:web_playable] ? ReleaseSerializer.render_as_hash(opts[:web_playable]) : nil }
end
@@ -0,0 +1,15 @@
module SoftwareResponseBuilder
private
def build_response(software, releases)
sorted = releases.sort_by { |r| r.created_at || Time.at(0) }.reverse
latest = sorted.reject { |r| r.version.to_s.start_with?("dev-") }.first
web_playable = sorted.find { |r| r.html_folder_path.present? }
SoftwareDetailSerializer.render_as_hash(software,
releases: sorted,
latest: latest,
web_playable: web_playable
)
end
end
@@ -1,4 +1,6 @@
class SoftwareHighlightedService
include SoftwareResponseBuilder
def index
software = Software.includes(:external_links, :image)
.where(highlighted: true)
@@ -9,19 +11,4 @@ class SoftwareHighlightedService
releases = Release.where(software_id: software.id).to_a
build_response(software, releases)
end
private
def build_response(software, releases)
sorted = releases.sort_by { |r| r.created_at || Time.at(0) }.reverse
latest = sorted.reject { |r| r.version.to_s.start_with?("dev-") }.first
web_playable = sorted.find { |r| r.html_folder_path.present? }
{
software: SoftwareSerializer.render_as_hash(software),
releases: ReleaseSerializer.render_as_hash(sorted),
latestRelease: latest ? ReleaseSerializer.render_as_hash(latest) : nil,
webPlayableRelease: web_playable ? ReleaseSerializer.render_as_hash(web_playable) : nil
}
end
end
+2 -15
View File
@@ -1,21 +1,8 @@
class SoftwareService
include SoftwareResponseBuilder
def index
softwares = Software.includes(:releases, :external_links, :image).all
{ softwares: softwares.map { |sw| build_response(sw, sw.releases.to_a) } }
end
private
def build_response(software, releases)
sorted = releases.sort_by { |r| r.created_at || Time.at(0) }.reverse
latest = sorted.reject { |r| r.version.to_s.start_with?("dev-") }.first
web_playable = sorted.find { |r| r.html_folder_path.present? }
{
software: SoftwareSerializer.render_as_hash(software),
releases: ReleaseSerializer.render_as_hash(sorted),
latestRelease: latest ? ReleaseSerializer.render_as_hash(latest) : nil,
webPlayableRelease: web_playable ? ReleaseSerializer.render_as_hash(web_playable) : nil
}
end
end