diff --git a/apps/api/app/serializers/software_detail_serializer.rb b/apps/api/app/serializers/software_detail_serializer.rb new file mode 100644 index 0000000..e94cfdd --- /dev/null +++ b/apps/api/app/serializers/software_detail_serializer.rb @@ -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 diff --git a/apps/api/app/services/concerns/software_response_builder.rb b/apps/api/app/services/concerns/software_response_builder.rb new file mode 100644 index 0000000..184131e --- /dev/null +++ b/apps/api/app/services/concerns/software_response_builder.rb @@ -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 diff --git a/apps/api/app/services/software_highlighted_service.rb b/apps/api/app/services/software_highlighted_service.rb index acc162b..cc3b104 100644 --- a/apps/api/app/services/software_highlighted_service.rb +++ b/apps/api/app/services/software_highlighted_service.rb @@ -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 diff --git a/apps/api/app/services/software_service.rb b/apps/api/app/services/software_service.rb index 9f6438b..06400aa 100644 --- a/apps/api/app/services/software_service.rb +++ b/apps/api/app/services/software_service.rb @@ -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