Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added Media API #1

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [0.0.7]
- Added Media API

## [0.0.3]

### Added
Expand Down
1 change: 1 addition & 0 deletions config/versions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ buy:
commerce:
taxonomy: "1.0.0"
notifications: "1.0.0"
media: "1_beta.1.0"
sell:
account: "1.1.0"
analytics: "1.0.0"
Expand Down
2 changes: 1 addition & 1 deletion ebay_api.gemspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Gem::Specification.new do |gem|
gem.name = "ebay_api"
gem.version = "0.0.6"
gem.version = "0.0.7"
gem.author = "Andrew Kozin (nepalez)"
gem.email = "[email protected]"
gem.homepage = "https://github.com/nepalez/sms_aero"
Expand Down
19 changes: 10 additions & 9 deletions lib/ebay_api.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,13 @@ class << self
end

option :token
option :site, Site, optional: true
option :language, Language, optional: true
option :charset, Charset, default: proc { "utf-8" }
option :sandbox, true.method(:&), default: proc { false }
option :gzip, true.method(:&), default: proc { false }
option :user_agent, method(:String), optional: true
option :site, Site, optional: true
option :language, Language, optional: true
option :api_subdomain, default: proc { "api" }
option :charset, Charset, default: proc { "utf-8" }
option :sandbox, true.method(:&), default: proc { false }
option :gzip, true.method(:&), default: proc { false }
option :user_agent, method(:String), optional: true

validate do
next unless language && site
Expand All @@ -46,9 +47,9 @@ class << self
end

format "json"
path { "https://api#{".sandbox" if sandbox}.ebay.com/" }
path { "https://#{api_subdomain}#{".sandbox" if sandbox}.ebay.com/" }

middleware { [LogRequest, JSONResponse] }
middleware { [LogRequest, AddVideoIdToBody, ReplaceRequestHeaders, JSONResponse] }

security do
token_value = token.respond_to?(:call) ? token.call : token
Expand All @@ -70,7 +71,7 @@ class << self
response(204) { true }

# https://developer.ebay.com/api-docs/static/handling-error-messages.html
response(400, 401, 409) do |_, _, (data, *)|
response(400, 401, 404, 409, 415) do |_, _, (data, *)|
data = data.to_h
error = data.dig("errors", 0) || {}
code = error["errorId"]
Expand Down
2 changes: 2 additions & 0 deletions lib/ebay_api/middlewares.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@
require_relative "middlewares/save_to_file_response"
require_relative "middlewares/paginated_collection"
require_relative "middlewares/log_request"
require_relative "middlewares/add_video_id_to_body"
require_relative "middlewares/replace_request_headers"
22 changes: 22 additions & 0 deletions lib/ebay_api/middlewares/add_video_id_to_body.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
class EbayAPI
class AddVideoIdToBody
def initialize(app)
@app = app
end

def call(env)
status, headers, body = @app.call(env)

body = if status == 201 &&
headers.keys.include?("location") &&
env["REQUEST_METHOD"] == "POST" &&
env["PATH_INFO"] == "/commerce/media/v1_beta/video/"
[{ "id" => headers["location"][0].split("/").last }]
else
body
end

[status, headers, body]
end
end
end
16 changes: 16 additions & 0 deletions lib/ebay_api/middlewares/replace_request_headers.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
class EbayAPI
class ReplaceRequestHeaders
def initialize(app)
@app = app
end

def call(env)
if env["REQUEST_METHOD"] == "POST" &&
env["PATH_INFO"].match?('\A\/commerce\/media\/v1_beta\/video\/[a-z0-9]+\/upload$')
env["HTTP_Variables"]["Content-Type"] = "application/octet-stream"
end

@app.call(env)
end
end
end
1 change: 1 addition & 0 deletions lib/ebay_api/operations/commerce.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ class EbayAPI

require_relative "commerce/notification"
require_relative "commerce/taxonomy"
require_relative "commerce/media"
end
end
14 changes: 14 additions & 0 deletions lib/ebay_api/operations/commerce/media.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
class EbayAPI
scope :commerce do
#
# eBay Commerce Media API
#
# @see https://developer.ebay.com/api-docs/commerce/media/overview.html
#
scope :media do
path { "media/v#{EbayAPI::COMMERCE_MEDIA_VERSION.split('.')[0]}" }

require_relative "media/video"
end
end
end
18 changes: 18 additions & 0 deletions lib/ebay_api/operations/commerce/media/video.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
class EbayAPI
scope :commerce do
#
# eBay Commerce Media API
#
# @see https://developer.ebay.com/api-docs/commerce/media/overview.html
#
scope :media do
scope :video do
path "video"

require_relative "video/get"
require_relative "video/create"
require_relative "video/upload"
end
end
end
end
19 changes: 19 additions & 0 deletions lib/ebay_api/operations/commerce/media/video/create.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
class EbayAPI
scope :commerce do
scope :media do
scope :video do
# @see https://developer.ebay.com/api-docs/commerce/media/resources/video/methods/createVideo
operation :create do
option :payload, proc(&:to_h) # TODO: add model to validate input

# Create endpoint of Ebay Media API return empty body by it self and id
# of created video is located in location response header.
# We uses AddVideoIdToBody middleware for putting id to body
path { "/" }
http_method :post
body { payload.merge("classification" => ["ITEM"]) }
end
end
end
end
end
15 changes: 15 additions & 0 deletions lib/ebay_api/operations/commerce/media/video/get.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class EbayAPI
scope :commerce do
scope :media do
scope :video do
# @see https://developer.ebay.com/api-docs/commerce/media/resources/video/methods/getVideo
operation :get do
option :id, proc(&:to_s)

path { id }
http_method :get
end
end
end
end
end
23 changes: 23 additions & 0 deletions lib/ebay_api/operations/commerce/media/video/upload.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
class EbayAPI
scope :commerce do
scope :media do
scope :video do
# @see https://developer.ebay.com/api-docs/commerce/media/resources/video/methods/uploadVideo
operation :upload do
option :id, proc(&:to_s)
option :file

path { "#{id}/upload" }
http_method :post
# Upload endpoint of Ebay Media API requires "content-type": "application/octet-stream"
# request header.
# But evil-client hasn't format for "application/octet-stream".
# That's we using "text" format and changing "content-type" header
# in ReplaceRequestHeaders middleware.
format { :text }
body { file }
end
end
end
end
end
4 changes: 2 additions & 2 deletions lib/ebay_api/operations/commerce/taxonomy.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
class EbayAPI
scope :commerce do
#
# eBay Commerce Notifications API
# eBay Commerce Taxonomy API
#
# @see https://developer.ebay.com/api-docs/commerce/notification/overview.html
# @see https://developer.ebay.com/api-docs/commerce/taxonomy/overview.html
#
scope :taxonomy do
path { "taxonomy/v#{EbayAPI::COMMERCE_TAXONOMY_VERSION[/^\d+/]}" }
Expand Down
2 changes: 1 addition & 1 deletion lib/ebay_api/operations/commerce/taxonomy/category_tree.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
class EbayAPI
scope :commerce do
#
# eBay Commerce Notifications API
# eBay Taxonomy API
#
# @see https://developer.ebay.com/api-docs/commerce/taxonomy/overview.html
#
Expand Down
3 changes: 3 additions & 0 deletions spec/fixtures/commerce/media/video/create/success
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
HTTP/1.1 201 OK
Content-Length: 0
Location: https://apim.ebay.com/commerce/media/v1_beta/video/92626cdc1820ab8eac2356d1ffffe6d0
5 changes: 5 additions & 0 deletions spec/fixtures/commerce/media/video/get/success
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
HTTP/1.1 200 OK
Content-Length: 751
Content-Type: application/json

{"videoId": "92626cdc1820ab8eac2356d1ffffe6d0", "size": 3114374, "title": "Test video", "description": "Test video description", "status": "PENDING_UPLOAD", "expirationDate": "2023-08-12T08:41:03Z", "classification": [ "ITEM" ] }
1 change: 1 addition & 0 deletions spec/fixtures/commerce/media/video/upload/success
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
HTTP/1.1 200 OK
2 changes: 1 addition & 1 deletion spec/fixtures/commerce/taxonomy/category_tree/get/success
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ HTTP/1.1 200 OK
Content-Length: 751
Content-Type: application/json

{"applicableMarketplaceIds": ["MarketplaceIdEnum"], "categoryTreeId": "string", "categoryTreeVersion": "string", "rootCategoryNode": {"category": {"categoryId": "string", "categoryName": "string"}, "categoryTreeNodeLevel": "integer", "childCategoryTreeNodes": [{"category": {"categoryId": "string", "categoryName": "string"}, "categoryTreeNodeLevel": "integer", "childCategoryTreeNodes": [{"category": {"categoryId": "string", "categoryName": "string"}, "categoryTreeNodeLevel": "integer", "childCategoryTreeNodes": [{}], "leafCategoryTreeNode": "boolean", "parentCategoryTreeNodeHref": "string"}], "leafCategoryTreeNode": "boolean", "parentCategoryTreeNodeHref": "string"}], "leafCategoryTreeNode": "boolean", "parentCategoryTreeNodeHref": "string"}}
{"applicableMarketplaceIds": ["MarketplaceIdEnum"], "categoryTreeId": "string", "categoryTreeVersion": "string", "rootCategoryNode": {"category": {"categoryId": "string", "categoryName": "string"}, "categoryTreeNodeLevel": "integer", "childCategoryTreeNodes": [{"category": {"categoryId": "string", "categoryName": "string"}, "categoryTreeNodeLevel": "integer", "childCategoryTreeNodes": [{"category": {"categoryId": "string", "categoryName": "string"}, "categoryTreeNodeLevel": "integer", "childCategoryTreeNodes": [{}], "leafCategoryTreeNode": "boolean", "parentCategoryTreeNodeHref": "string"}], "leafCategoryTreeNode": "boolean", "parentCategoryTreeNodeHref": "string"}], "leafCategoryTreeNode": "boolean", "parentCategoryTreeNodeHref": "string"}}
32 changes: 32 additions & 0 deletions spec/operations/commerce/media/video/create_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
RSpec.describe EbayAPI, ".commerce.media.video.create" do
let(:client) { described_class.new(settings) }
let(:scope) { client.commerce.media.video }
let(:settings) { yaml_fixture_file("settings.valid.yml").merge(api_subdomain: "apim") }
let(:url) do
"https://apim.ebay.com/commerce/media/v1_beta/video/"
end
let(:payload) do
{
"size": 3_114_374,
"title": "Test video",
"description": "Test video description"
}
end

before { stub_request(:post, url).to_return(response) }

subject do
scope.create(payload: payload)
end

context "success" do
let(:response) do
open_fixture_file "commerce/media/video/create/success"
end

it "sends a request" do
expect(subject).to eq({ "id" => "92626cdc1820ab8eac2356d1ffffe6d0" })
expect(a_request(:post, url)).to have_been_made
end
end
end
26 changes: 26 additions & 0 deletions spec/operations/commerce/media/video/get_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
RSpec.describe EbayAPI, ".commerce.media.video.get" do
let(:client) { described_class.new(settings) }
let(:scope) { client.commerce.media.video }
let(:settings) { yaml_fixture_file("settings.valid.yml").merge(api_subdomain: "apim") }
let(:video_id) { "92626cdc1820ab8eac2356d1ffffe6d0" }
let(:url) do
"https://apim.ebay.com/commerce/media/v1_beta/video/#{video_id}"
end

before { stub_request(:get, url).to_return(response) }

subject do
scope.get(id: video_id)
end

context "success" do
let(:response) do
open_fixture_file "commerce/media/video/get/success"
end

it "sends a request" do
subject
expect(a_request(:get, url)).to have_been_made
end
end
end
27 changes: 27 additions & 0 deletions spec/operations/commerce/media/video/upload_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
RSpec.describe EbayAPI, ".commerce.media.video.upload" do
let(:client) { described_class.new(settings) }
let(:scope) { client.commerce.media.video }
let(:settings) { yaml_fixture_file("settings.valid.yml").merge(api_subdomain: "apim") }
let(:video_id) { "92626cdc1820ab8eac2356d1ffffe6d0" }
let(:url) do
"https://apim.ebay.com/commerce/media/v1_beta/video/#{video_id}/upload"
end
let(:file) { "file data" }

before { stub_request(:post, url).to_return(response) }

subject do
scope.upload(id: video_id, file: file)
end

context "success" do
let(:response) do
open_fixture_file "commerce/media/video/upload/success"
end

it "sends a request" do
subject
expect(a_request(:post, url)).to have_been_made
end
end
end