This commit is contained in:
Matt Jankowski 2024-04-26 18:07:04 +00:00 committed by GitHub
commit ffd33e53fc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 56 additions and 20 deletions

View File

@ -7,38 +7,40 @@ class Api::V1::MarkersController < Api::BaseController
before_action :require_user!
def index
with_read_replica do
@markers = current_user.markers.where(timeline: Array(params[:timeline])).index_by(&:timeline)
end
render json: serialize_map(@markers)
@markers = current_user_markers
render json: marker_timeline_presenter, serializer: REST::MarkerTimelineSerializer
end
def create
Marker.transaction do
@markers = {}
resource_params.each_pair do |timeline, timeline_params|
@markers[timeline] = current_user.markers.find_or_create_by(timeline: timeline)
@markers[timeline].update!(timeline_params)
end
end
render json: serialize_map(@markers)
@markers = create_markers_from_params
render json: marker_timeline_presenter, serializer: REST::MarkerTimelineSerializer
rescue ActiveRecord::StaleObjectError
render json: { error: 'Conflict during update, please try again' }, status: 409
end
private
def serialize_map(map)
serialized = {}
def marker_timeline_presenter
MarkerTimelinePresenter.new(@markers)
end
map.each_pair do |key, value|
serialized[key] = ActiveModelSerializers::SerializableResource.new(value, serializer: REST::MarkerSerializer).as_json
def current_user_markers
with_read_replica do
current_user.markers.where(timeline: Array(params[:timeline]))
end
end
Oj.dump(serialized)
def create_markers_from_params
[].tap do |markers|
Marker.transaction do
resource_params.each_pair do |timeline, timeline_params|
current_user.markers.find_or_create_by(timeline: timeline).tap do |marker|
marker.update!(timeline_params)
markers << marker
end
end
end
end
end
def resource_params

View File

@ -0,0 +1,23 @@
# frozen_string_literal: true
class MarkerTimelinePresenter
include ActiveModel::Model
alias read_attribute_for_serialization send
attr_reader :markers
def initialize(markers)
@markers = markers
end
Marker::TIMELINES.each do |timeline|
define_method timeline.to_sym do
markers.find { |marker| marker.timeline == timeline }
end
end
def timeline_present?(value)
markers.map(&:timeline).include?(value)
end
end

View File

@ -0,0 +1,11 @@
# frozen_string_literal: true
class REST::MarkerTimelineSerializer < ActiveModel::Serializer
Marker::TIMELINES.each do |timeline|
has_one timeline.to_sym,
if: -> { timeline_present?(timeline) },
serializer: REST::MarkerSerializer
end
delegate :timeline_present?, to: :object
end