From 8375b32915bd38e3232fca3e690f61f0e774f9e8 Mon Sep 17 00:00:00 2001 From: Devin Howard Date: Sat, 20 Aug 2016 13:44:26 +0800 Subject: [PATCH] reusable embedding code --- app/controllers/api/v1/restful_controller.rb | 10 +++++++ .../api/v1/application_serializer.rb | 30 +++++++++++++++++++ app/serializers/api/v1/event_serializer.rb | 2 +- app/serializers/api/v1/map_serializer.rb | 20 +++++++++---- app/serializers/api/v1/mapping_serializer.rb | 21 +++++++------ app/serializers/api/v1/metacode_serializer.rb | 2 +- app/serializers/api/v1/synapse_serializer.rb | 20 ++++++++++--- app/serializers/api/v1/token_serializer.rb | 2 +- app/serializers/api/v1/topic_serializer.rb | 14 +++++++-- app/serializers/api/v1/user_serializer.rb | 2 +- app/serializers/api/v1/webhook_serializer.rb | 2 +- 11 files changed, 98 insertions(+), 27 deletions(-) create mode 100644 app/serializers/api/v1/application_serializer.rb diff --git a/app/controllers/api/v1/restful_controller.rb b/app/controllers/api/v1/restful_controller.rb index e0004444..4cbed5db 100644 --- a/app/controllers/api/v1/restful_controller.rb +++ b/app/controllers/api/v1/restful_controller.rb @@ -34,6 +34,16 @@ module Api "Api::V1::#{resource_name.camelize}Serializer".constantize end + def default_scope + { + embeds: embeds + } + end + + def embeds + (params[:embed] || '').split(',').map(&:to_sym) + end + def token_user token = params[:access_token] access_token = Token.find_by_token(token) diff --git a/app/serializers/api/v1/application_serializer.rb b/app/serializers/api/v1/application_serializer.rb new file mode 100644 index 00000000..fcdb3071 --- /dev/null +++ b/app/serializers/api/v1/application_serializer.rb @@ -0,0 +1,30 @@ +module Api + module V1 + class ApplicationSerializer < ActiveModel::Serializer + def self.embeddable + {} + end + + def embeds + @embeds ||= (scope[:embeds] || []).select { |e| self.class.embeddable.keys.include?(e) } + end + + def self.embed_dat + embeddable.each_pair do |key, opts| + attr = opts.delete(:attr) || key + binding.pry if key == :topic2 + if attr.to_s.pluralize == attr.to_s + attribute "#{attr.to_s.singularize}_ids".to_sym, opts.merge(unless: -> { embeds.include?(key) }) do + object.send(attr).map(&:id) + end + has_many attr, opts.merge(if: -> { embeds.include?(key) }) + else + id_opts = opts.merge(key: "#{key}_id") + attribute "#{attr}_id".to_sym, id_opts.merge(unless: -> { embeds.include?(key) }) + attribute key, opts.merge(if: -> { embeds.include?(key) }) + end + end + end + end + end +end diff --git a/app/serializers/api/v1/event_serializer.rb b/app/serializers/api/v1/event_serializer.rb index 69b34de0..61bf965a 100644 --- a/app/serializers/api/v1/event_serializer.rb +++ b/app/serializers/api/v1/event_serializer.rb @@ -1,6 +1,6 @@ module Api module V1 - class EventSerializer < ActiveModel::Serializer + class EventSerializer < ApplicationSerializer attributes :id, :sequence_id, :kind, :map_id, :created_at has_one :actor, serializer: UserSerializer, root: 'users' diff --git a/app/serializers/api/v1/map_serializer.rb b/app/serializers/api/v1/map_serializer.rb index 1f9ab8d0..9ca94ad8 100644 --- a/app/serializers/api/v1/map_serializer.rb +++ b/app/serializers/api/v1/map_serializer.rb @@ -1,6 +1,6 @@ module Api module V1 - class MapSerializer < ActiveModel::Serializer + class MapSerializer < ApplicationSerializer attributes :id, :name, :desc, @@ -9,11 +9,19 @@ module Api :created_at, :updated_at - has_many :topics, serializer: TopicSerializer - has_many :synapses, serializer: SynapseSerializer - has_many :mappings, serializer: MappingSerializer - has_many :contributors, root: :users, serializer: UserSerializer - has_many :collaborators, root: :users, serializer: UserSerializer + def self.embeddable + { + topics: {}, + synapses: {}, + mappings: {}, + contributors: { serializer: UserSerializer }, + collaborators: { serializer: UserSerializer } + } + end + + self.class_eval do + embed_dat + end end end end diff --git a/app/serializers/api/v1/mapping_serializer.rb b/app/serializers/api/v1/mapping_serializer.rb index d88856c4..203b2330 100644 --- a/app/serializers/api/v1/mapping_serializer.rb +++ b/app/serializers/api/v1/mapping_serializer.rb @@ -1,21 +1,24 @@ module Api module V1 - class MappingSerializer < ActiveModel::Serializer + class MappingSerializer < ApplicationSerializer attributes :id, - :xloc, - :yloc, :created_at, :updated_at, :mappable_id, :mappable_type - has_one :user, serializer: UserSerializer - has_one :map, serializer: MapSerializer + attribute :xloc, if: -> { object.mappable_type == 'Topic' } + attribute :yloc, if: -> { object.mappable_type == 'Topic' } - def filter(keys) - keys.delete(:xloc) unless object.mappable_type == 'Topic' - keys.delete(:yloc) unless object.mappable_type == 'Topic' - keys + def self.embeddable + { + user: {}, + map: {} + } + end + + self.class_eval do + embed_dat end end end diff --git a/app/serializers/api/v1/metacode_serializer.rb b/app/serializers/api/v1/metacode_serializer.rb index e071f7d8..9c6ddc8e 100644 --- a/app/serializers/api/v1/metacode_serializer.rb +++ b/app/serializers/api/v1/metacode_serializer.rb @@ -1,6 +1,6 @@ module Api module V1 - class MetacodeSerializer < ActiveModel::Serializer + class MetacodeSerializer < ApplicationSerializer attributes :id, :name, :manual_icon, diff --git a/app/serializers/api/v1/synapse_serializer.rb b/app/serializers/api/v1/synapse_serializer.rb index 4c3bfa22..96e90197 100644 --- a/app/serializers/api/v1/synapse_serializer.rb +++ b/app/serializers/api/v1/synapse_serializer.rb @@ -1,6 +1,6 @@ module Api module V1 - class SynapseSerializer < ActiveModel::Serializer + class SynapseSerializer < ApplicationSerializer attributes :id, :desc, :category, @@ -9,9 +9,21 @@ module Api :created_at, :updated_at - has_one :topic1, root: :topics, serializer: TopicSerializer - has_one :topic2, root: :topics, serializer: TopicSerializer - has_one :user, serializer: UserSerializer + #has_one :topic1, root: :topics, serializer: TopicSerializer + #has_one :topic2, root: :topics, serializer: TopicSerializer + #has_one :user, serializer: UserSerializer + + def self.embeddable + { + topic1: { attr: :node1, serializer: TopicSerializer }, + topic2: { attr: :node2, serializer: TopicSerializer }, + user: {} + } + end + + self.class_eval do + embed_dat + end end end end diff --git a/app/serializers/api/v1/token_serializer.rb b/app/serializers/api/v1/token_serializer.rb index 117129f6..7cc63770 100644 --- a/app/serializers/api/v1/token_serializer.rb +++ b/app/serializers/api/v1/token_serializer.rb @@ -1,6 +1,6 @@ module Api module V1 - class TokenSerializer < ActiveModel::Serializer + class TokenSerializer < ApplicationSerializer attributes :id, :token, :description, diff --git a/app/serializers/api/v1/topic_serializer.rb b/app/serializers/api/v1/topic_serializer.rb index 7fc09a97..252a8795 100644 --- a/app/serializers/api/v1/topic_serializer.rb +++ b/app/serializers/api/v1/topic_serializer.rb @@ -1,6 +1,6 @@ module Api module V1 - class TopicSerializer < ActiveModel::Serializer + class TopicSerializer < ApplicationSerializer attributes :id, :name, :desc, @@ -9,8 +9,16 @@ module Api :created_at, :updated_at - has_one :user, serializer: UserSerializer - has_one :metacode, serializer: MetacodeSerializer + def self.embeddable + { + user: {}, + metacode: {} + } + end + + self.class_eval do + embed_dat + end end end end diff --git a/app/serializers/api/v1/user_serializer.rb b/app/serializers/api/v1/user_serializer.rb index 9090b697..103ee827 100644 --- a/app/serializers/api/v1/user_serializer.rb +++ b/app/serializers/api/v1/user_serializer.rb @@ -1,6 +1,6 @@ module Api module V1 - class UserSerializer < ActiveModel::Serializer + class UserSerializer < ApplicationSerializer attributes :id, :name, :avatar, diff --git a/app/serializers/api/v1/webhook_serializer.rb b/app/serializers/api/v1/webhook_serializer.rb index 724522ad..ab8bb92c 100644 --- a/app/serializers/api/v1/webhook_serializer.rb +++ b/app/serializers/api/v1/webhook_serializer.rb @@ -1,6 +1,6 @@ module Api module V1 - class WebhookSerializer < ActiveModel::Serializer + class WebhookSerializer < ApplicationSerializer attributes :text, :username, :icon_url # , :attachments end end