Add web_url to tree entry in GraphQL API

This commit is contained in:
Phil Hughes 2019-06-04 14:38:18 +01:00
parent df549eb28c
commit 4644a2daf5
No known key found for this signature in database
GPG key ID: 32245528C52E0F9F
15 changed files with 129 additions and 5 deletions

View file

@ -134,6 +134,7 @@ export default {
:current-path="path"
:path="entry.flatPath"
:type="entry.type"
:url="entry.webUrl"
/>
</template>
</tbody>

View file

@ -21,6 +21,11 @@ export default {
type: String,
required: true,
},
url: {
type: String,
required: false,
default: null,
},
},
computed: {
routerLinkTo() {
@ -59,7 +64,7 @@ export default {
<tr v-once :class="`file_${id}`" class="tree-item" @click="openRow">
<td class="tree-item-file-name">
<i :aria-label="type" role="img" :class="iconName" class="fa fa-fw"></i>
<component :is="linkComponent" :to="routerLinkTo" class="str-truncated">
<component :is="linkComponent" :to="routerLinkTo" :href="url" class="str-truncated">
{{ fullPath }}
</component>
<template v-if="isSubmodule">

View file

@ -23,6 +23,7 @@ query getFiles(
edges {
node {
...TreeEntry
webUrl
}
}
pageInfo {
@ -43,6 +44,7 @@ query getFiles(
edges {
node {
...TreeEntry
webUrl
}
}
pageInfo {

View file

@ -4,7 +4,11 @@ module Types
class BlobType < BaseObject
implements Types::Tree::EntryType
present_using BlobPresenter
graphql_name 'Blob'
field :web_url, GraphQL::STRING_TYPE, null: true
end
end
end

View file

@ -4,8 +4,12 @@ module Types
class TreeEntryType < BaseObject
implements Types::Tree::EntryType
present_using TreeEntryPresenter
graphql_name 'TreeEntry'
description 'Represents a directory'
field :web_url, GraphQL::STRING_TYPE, null: true
end
end
end

View file

@ -4,9 +4,15 @@ module Types
class TreeType < BaseObject
graphql_name 'Tree'
field :trees, Types::Tree::TreeEntryType.connection_type, null: false
field :trees, Types::Tree::TreeEntryType.connection_type, null: false, resolve: -> (obj, args, ctx) do
Gitlab::Graphql::Representation::TreeEntry.decorate(obj.trees, obj.repository)
end
field :submodules, Types::Tree::SubmoduleType.connection_type, null: false
field :blobs, Types::Tree::BlobType.connection_type, null: false
field :blobs, Types::Tree::BlobType.connection_type, null: false, resolve: -> (obj, args, ctx) do
Gitlab::Graphql::Representation::TreeEntry.decorate(obj.blobs, obj.repository)
end
end
end
end

View file

@ -13,4 +13,8 @@ class BlobPresenter < Gitlab::View::Presenter::Simple
plain: plain
)
end
def web_url
Gitlab::Routing.url_helpers.project_blob_url(blob.repository.project, File.join(blob.commit_id, blob.path))
end
end

View file

@ -0,0 +1,9 @@
# frozen_string_literal: true
class TreeEntryPresenter < Gitlab::View::Presenter::Delegated
presents :tree
def web_url
Gitlab::Routing.url_helpers.project_tree_url(tree.repository.project, File.join(tree.commit_id, tree.path))
end
end

View file

@ -0,0 +1,31 @@
# frozen_string_literal: true
module Gitlab
module Graphql
module Representation
class TreeEntry < SimpleDelegator
class << self
def decorate(entries, repository)
return if entries.nil?
entries.map do |entry|
if entry.is_a?(TreeEntry)
entry
else
self.new(entry, repository)
end
end
end
end
attr_accessor :repository
def initialize(raw_entry, repository)
@repository = repository
super(raw_entry)
end
end
end
end
end

View file

@ -86,4 +86,16 @@ describe('Repository table row component', () => {
expect(vm.find('.commit-sha').text()).toContain('1');
});
it('renders link with href', () => {
factory({
id: '1',
path: 'test',
type: 'blob',
url: 'https://test.com',
currentPath: '/',
});
expect(vm.find('a').attributes('href')).toEqual('https://test.com');
});
});

View file

@ -5,5 +5,5 @@ require 'spec_helper'
describe Types::Tree::BlobType do
it { expect(described_class.graphql_name).to eq('Blob') }
it { expect(described_class).to have_graphql_fields(:id, :name, :type, :path, :flat_path) }
it { expect(described_class).to have_graphql_fields(:id, :name, :type, :path, :flat_path, :web_url) }
end

View file

@ -5,5 +5,5 @@ require 'spec_helper'
describe Types::Tree::TreeEntryType do
it { expect(described_class.graphql_name).to eq('TreeEntry') }
it { expect(described_class).to have_graphql_fields(:id, :name, :type, :path, :flat_path) }
it { expect(described_class).to have_graphql_fields(:id, :name, :type, :path, :flat_path, :web_url) }
end

View file

@ -0,0 +1,20 @@
# frozen_string_literal: true
require 'spec_helper'
describe Gitlab::Graphql::Representation::TreeEntry do
let(:project) { create(:project, :repository) }
let(:repository) { project.repository }
describe '.decorate' do
it 'returns NilClass when given nil' do
expect(described_class.decorate(nil, repository)).to be_nil
end
it 'returns array of TreeEntry' do
entries = described_class.decorate(repository.tree.blobs, repository)
expect(entries.first).to be_a(described_class)
end
end
end

View file

@ -14,6 +14,16 @@ describe BlobPresenter, :seed_helper do
end
let(:blob) { Blob.new(git_blob) }
describe '.web_url' do
let(:project) { create(:project, :repository) }
let(:repository) { project.repository }
let(:blob) { Gitlab::Graphql::Representation::TreeEntry.new(repository.tree.blobs.first, repository) }
subject { described_class.new(blob) }
it { expect(subject.web_url).to eq("http://localhost/#{project.full_path}/blob/#{blob.commit_id}/#{blob.path}") }
end
describe '#highlight' do
subject { described_class.new(blob) }

View file

@ -0,0 +1,16 @@
# frozen_string_literal: true
require 'spec_helper'
describe TreeEntryPresenter do
include Gitlab::Routing.url_helpers
let(:project) { create(:project, :repository) }
let(:repository) { project.repository }
let(:tree) { Gitlab::Graphql::Representation::TreeEntry.new(repository.tree.trees.first, repository) }
let(:presenter) { described_class.new(tree) }
describe '.web_url' do
it { expect(presenter.web_url).to eq("http://localhost/#{project.full_path}/tree/#{tree.commit_id}/#{tree.path}") }
end
end