From 61ae7e669eed409f8f16ddbda6e4dade498e9184 Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Thu, 30 Apr 2015 17:08:52 +0200 Subject: [PATCH] v3: allow expanding build.commit --- lib/travis/api/v3/models/commit.rb | 14 +++++++++ lib/travis/api/v3/queries/repositories.rb | 10 ++++-- lib/travis/api/v3/queries/user.rb | 11 ++++++- lib/travis/api/v3/renderer/avatar_url.rb | 1 + lib/travis/api/v3/renderer/build.rb | 2 +- lib/travis/api/v3/renderer/commit.rb | 31 +++++++++++++++++++ .../api/v3/services/owner/repositories.rb | 1 + 7 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 lib/travis/api/v3/renderer/commit.rb diff --git a/lib/travis/api/v3/models/commit.rb b/lib/travis/api/v3/models/commit.rb index ac1add22..6305d380 100644 --- a/lib/travis/api/v3/models/commit.rb +++ b/lib/travis/api/v3/models/commit.rb @@ -2,5 +2,19 @@ module Travis::API::V3 class Models::Commit < Model belongs_to :repository has_one :request + has_many :builds + + has_one :branch, + foreign_key: [:repository_id, :name], + primary_key: [:repository_id, :branch], + class_name: 'Travis::API::V3::Models::Branch'.freeze + + def branch_name + read_attribute(:branch) + end + + def branch_name=(value) + write_attribute(:branch, value) + end end end diff --git a/lib/travis/api/v3/queries/repositories.rb b/lib/travis/api/v3/queries/repositories.rb index ef503ad5..2e5c1194 100644 --- a/lib/travis/api/v3/queries/repositories.rb +++ b/lib/travis/api/v3/queries/repositories.rb @@ -17,9 +17,15 @@ module Travis::API::V3 def filter(list) list = list.where(active: bool(active)) unless active.nil? list = list.where(private: bool(private)) unless private.nil? - list = list.includes(:owner) if includes? 'repository.owner'.freeze - list = list.includes(:last_build) if includes? 'repository.last_build'.freeze + list = list.includes(:owner) if includes? 'repository.owner'.freeze + + if includes? 'repository.last_build'.freeze + list = list.includes(:last_build) + list = list.includes(last_build: :commit) if includes? 'build.commit'.freeze + end + list = list.includes(default_branch: :last_build) + list = list.includes(default_branch: { last_build: :commit }) if includes? 'build.commit'.freeze list end end diff --git a/lib/travis/api/v3/queries/user.rb b/lib/travis/api/v3/queries/user.rb index f3ddb631..5f5760c2 100644 --- a/lib/travis/api/v3/queries/user.rb +++ b/lib/travis/api/v3/queries/user.rb @@ -1,11 +1,20 @@ module Travis::API::V3 class Queries::User < Query - params :id, :login + params :id, :login, :email def find return Models::User.find_by_id(id) if id return Models::User.where('lower(login) = ?'.freeze, login.downcase).first if login + return find_by_email(email) if email raise WrongParams, 'missing user.id or user.login'.freeze end + + def find_by_email(email) + if email_model = Models::Email.find_by_email(email) + email_model.user + else + User.find_by_email(email) + end + end end end diff --git a/lib/travis/api/v3/renderer/avatar_url.rb b/lib/travis/api/v3/renderer/avatar_url.rb index 5226962f..bf1d6e67 100644 --- a/lib/travis/api/v3/renderer/avatar_url.rb +++ b/lib/travis/api/v3/renderer/avatar_url.rb @@ -13,6 +13,7 @@ module Travis::API::V3 when has(:gravatar_url) then object.gravatar_url when has(:gravatar_id) then GRAVATAR_URL % object.gravatar_id when has(:email) then GRAVATAR_URL % Digest::MD5.hexdigest(object.email) + when String then GRAVATAR_URL % Digest::MD5.hexdigest(object) end end diff --git a/lib/travis/api/v3/renderer/build.rb b/lib/travis/api/v3/renderer/build.rb index 789c501c..0151e65f 100644 --- a/lib/travis/api/v3/renderer/build.rb +++ b/lib/travis/api/v3/renderer/build.rb @@ -3,6 +3,6 @@ require 'travis/api/v3/renderer/model_renderer' module Travis::API::V3 class Renderer::Build < Renderer::ModelRenderer representation(:minimal, :id, :number, :state, :duration, :event_type, :previous_state, :started_at, :finished_at) - representation(:standard, *representations[:minimal], :repository, :branch) + representation(:standard, *representations[:minimal], :repository, :branch, :commit) end end diff --git a/lib/travis/api/v3/renderer/commit.rb b/lib/travis/api/v3/renderer/commit.rb new file mode 100644 index 00000000..70276a98 --- /dev/null +++ b/lib/travis/api/v3/renderer/commit.rb @@ -0,0 +1,31 @@ +require 'travis/api/v3/renderer/model_renderer' + +module Travis::API::V3 + class Renderer::Commit < Renderer::ModelRenderer + representation(:minimal, :id, :sha, :ref, :message, :compare_url, :committed_at) + representation(:standard, *representations[:minimal], :repository, :branch, :committer, :author) + + def sha + model.commit + end + + def committer + user_data(model.committer_name, model.committer_email) + end + + def author + user_data(model.author_name, model.author_email) + end + + private + + def user_data(name, email) + # query(:user).find_by_email(email) <= this triggers an N+1 query + { + #:@type => 'user'.freeze, + :name => name, + :avatar_url => Renderer::AvatarURL.avatar_url(email) + } + end + end +end diff --git a/lib/travis/api/v3/services/owner/repositories.rb b/lib/travis/api/v3/services/owner/repositories.rb index 1a025163..6942c383 100644 --- a/lib/travis/api/v3/services/owner/repositories.rb +++ b/lib/travis/api/v3/services/owner/repositories.rb @@ -1,5 +1,6 @@ module Travis::API::V3 class Services::Owner::Repositories < Service + params :active, :private, prefix: :repository result_type :repositories def run!