class ItemSerializer < ActiveModel::Serializer
attributes :uid, :title, :description, :category
has_one :response
end
Slide 60
Slide 60 text
class API::ItemSerializer < ActiveModel::Serializer
attributes :uid, :title, :description, :category
has_one :response,
serializer: API::ResponseSerializer
def include_category?
scope.api_version > 1
end
end
Slide 61
Slide 61 text
class API::ItemSerializer < ActiveModel::Serializer
attributes :uid, :title, :description, :category
has_one :response,
serializer: API::ResponseSerializer
def include_category?
scope.api_version > 1
end
end
Slide 62
Slide 62 text
class API::ItemSerializer < ActiveModel::Serializer
attributes :uid, :title, :description, :category
has_one :response,
serializer: API::ResponseSerializer
def include_category?
scope.api_version > 1
end
end
Slide 63
Slide 63 text
class API::ItemSerializer < ActiveModel::Serializer
attributes :uid, :title, :description, :category
has_one :response,
serializer: API::ResponseSerializer
def include_category?
scope.api_version > 1
end
end
Slide 64
Slide 64 text
AUTH
VERSIONING
SERIALIZING
PARSING
ERRORS
Slide 65
Slide 65 text
SERIALIZING
OBJ JSON
PARSING
OBJ
JSON
Slide 66
Slide 66 text
gem ‘hashie’
Slide 67
Slide 67 text
class API::ItemCreator
def create(params)
Item.create(parsed_params(params))
end
def parsed_params(params)
ItemParser.new(params).to_hash
end
class ItemParser < Hashie::Trash
property :title, required: true
property :description
end
end
Slide 68
Slide 68 text
class API::ItemCreator
def create(params)
Item.create(parsed_params(params))
end
def parsed_params(params)
ItemParser.new(params).to_hash
end
class ItemParser < Hashie::Trash
property :title, required: true
property :description
end
end
Slide 69
Slide 69 text
class API::ItemCreator
def create(params)
Item.create(parsed_params(params))
end
def parsed_params(params)
ItemParser.new(params).to_hash
end
class ItemParser < Hashie::Trash
property :title, required: true
property :description
end
end
class ItemParser < Hashie::Trash
property :user_attributes,
from: ‘seller’,
with: -> (hash) {
ItemParser::UserParser.new(hash)
}
class UserParser < Hashie::Trash
property :name, required: true
end
end
Slide 75
Slide 75 text
class ItemParser < Hashie::Trash
property :user_attributes,
from: ‘seller’,
with: -> (hash) {
ItemParser::UserParser.new(hash)
}
class UserParser < Hashie::Trash
property :name, required: true
end
end
Slide 76
Slide 76 text
class ItemParser < Hashie::Trash
property :user_attributes,
from: ‘seller’,
with: -> (hash) {
ItemParser::UserParser.new(hash)
}
class UserParser < Hashie::Trash
property :name, required: true
end
end
Slide 77
Slide 77 text
class ItemParser < Hashie::Trash
property :user_attributes,
from: ‘seller’,
with: -> (hash) {
ItemParser::UserParser.new(hash)
}
class UserParser < Hashie::Trash
property :name, required: true
end
end
Slide 78
Slide 78 text
class ItemParser < Hashie::Trash
property :user_attributes,
from: ‘seller’,
with: -> (hash) {
ItemParser::UserParser.new(hash)
}
class UserParser < Hashie::Trash
property :name, required: true
end
end
Slide 79
Slide 79 text
gem ‘representable’
gem ‘roar’
Slide 80
Slide 80 text
AUTH
VERSIONING
SERIALIZING
PARSING
ERRORS
Slide 81
Slide 81 text
ERROR
ERROR
CODE
ERROR
MESSAGE
HTTP
CODE
record not found 1003
The object you are
looking for could not be
found
404
unauthorized 1004
You are not authorized
to do the following
action
403
invalid param 1005 You are missing a
required parameter
400
invalid value 1006 Why are you reading
this slide?
400
Slide 82
Slide 82 text
module API::ErrorSupport
rescue_from Exception, with: :respond_with_error
def respond_with_error(e)
error = translate_exception(e)
render json: error,
status: error.status_code
end
end
Slide 83
Slide 83 text
module API::ErrorSupport
rescue_from Exception, with: :respond_with_error
def respond_with_error(e)
error = translate_exception(e)
render json: error,
status: error.status_code
end
end
Slide 84
Slide 84 text
module API::ErrorSupport
rescue_from Exception, with: :respond_with_error
def respond_with_error(e)
error = translate_exception(e)
render json: error,
status: error.status_code
end
end
Slide 85
Slide 85 text
module API::ErrorSupport
def translate_exception(e)
case e
when ActiveRecord::RecordNotFound
ApiError.new(1003,
I18n.t(‘errors.api.not_found'),
:not_found)
...
end
Slide 86
Slide 86 text
module API::ErrorSupport
def translate_exception(e)
case e
when ActiveRecord::RecordNotFound
ApiError.new(1003,
I18n.t(‘errors.api.not_found'),
:not_found)
...
end
Slide 87
Slide 87 text
module API::ErrorSupport
def translate_exception(e)
case e
when ActiveRecord::RecordNotFound
ApiError.new(1003,
I18n.t(‘errors.api.not_found'),
:not_found)
...
end
Slide 88
Slide 88 text
module API::ErrorSupport
def translate_exception(e)
case e
when ActiveRecord::RecordNotFound
ApiError.new(1003,
I18n.t(‘errors.api.not_found'),
:not_found)
...
end
class LegacyModel < ActiveRecord::Base
!
YAML_FILE = ‘config/legacy_db.yml’
self.abstract_class = true
!
establish_connection(
YAML::load_file(YAML_FILE)[Rails.env]
)
!
end
Slide 107
Slide 107 text
class LegacyItem < LegacyModel
!
self.table_name = ‘items’
!
has_one :estimation,
class_name: ‘LegacyEstimation’
foreign_key: ‘item_id’
!
end
Slide 108
Slide 108 text
class LegacyMigration
!
def run
@output = MigrationOutput.new(@file)
scope = LegacyItem.from_id(@starting_id)
scope.find_each do |legacy_item|
migrator = ItemMigrator.new(legacy_item)
migrator.run
@output.add(migrator.output)
end
end
!
end
Slide 109
Slide 109 text
JSON
DB
SERVER
PRICE ESTIMATION
SERVER
DB DB
Slide 110
Slide 110 text
JSON DB
SERVER
PRICE ESTIMATION
SERVER
DB DB
Slide 111
Slide 111 text
JSON DB
SERVER
PRICE ESTIMATION
SERVER
DB DB
Slide 112
Slide 112 text
JSON DB
SERVER
PRICE ESTIMATION
SERVER
DB DB
Slide 113
Slide 113 text
4h ~300k
Slide 114
Slide 114 text
EBAY GEM
SERVER
PRICE ESTIMATION
SERVER
EBAY SERVICES
GEM
Slide 115
Slide 115 text
EBAY GEM
SERVER
PRICE ESTIMATION
SERVER
EBAY SERVICES
GEM