Commit 5b26c988 authored by Steve Abrams's avatar Steve Abrams

Add versions array to package api response

Include array showing all versions of a given
package when rendering the package entity in the API.
parent 5898f3c6
......@@ -188,7 +188,27 @@ Example response:
"name": "Administrator",
"avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon"
}
}
},
"versions": [
{
"id":2,
"version":"2.0-SNAPSHOT",
"created_at":"2020-04-28T04:42:11.573Z",
"pipeline": {
"id": 234,
"status": "pending",
"ref": "new-pipeline",
"sha": "a91957a858320c0e17f3a0eca7cfacbff50ea29a",
"web_url": "https://example.com/foo/bar/pipelines/58",
"created_at": "2016-08-11T11:28:34.085Z",
"updated_at": "2016-08-11T11:32:35.169Z",
"user": {
"name": "Administrator",
"avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon"
}
}
}
]
}
```
......
......@@ -125,6 +125,18 @@ class Packages::Package < ApplicationRecord
end
end
def versions
project.packages
.with_name(name)
.where.not(version: version)
.with_package_type(package_type)
.order(:version)
end
def pipeline
build_info&.pipeline
end
private
def valid_conan_package_recipe
......
---
title: Add versions array to the package API payload
merge_request: 31231
author:
type: added
......@@ -29,15 +29,13 @@ module EE
expose :pipeline, if: ->(package) { package.build_info }, using: Package::Pipeline
expose :versions, using: ::EE::API::Entities::PackageVersion
private
def project_path
object.project.full_path
end
def pipeline
object.build_info.pipeline
end
end
end
end
......
# frozen_string_literal: true
module EE
module API
module Entities
class PackageVersion < Grape::Entity
expose :id
expose :version
expose :created_at
expose :tags
expose :pipeline, if: ->(package) { package.build_info }, using: Package::Pipeline
end
end
end
end
......@@ -4,7 +4,8 @@
"name",
"version",
"package_type",
"_links"
"_links",
"versions"
],
"properties": {
"name": {
......@@ -29,6 +30,12 @@
},
"created_at": {
"type": "string"
},
"versions": {
"type": "array",
"items": {
"$ref": "package_version.json"
}
}
}
}
{
"type": "object",
"required": [
"version",
"created_at",
"pipeline"
],
"properties": {
"version": {
"type": "string"
},
"created_at": {
"type": "string"
},
"pipeline": {
"$ref": "../pipeline.json"
}
}
}
......@@ -384,4 +384,41 @@ RSpec.describe Packages::Package, type: :model do
expect(packages.pluck(:name)).to match_array([nuget_package.name, maven_package.name])
end
end
describe '#versions' do
let_it_be(:project) { create(:project) }
let_it_be(:package) { create(:maven_package, project: project) }
let_it_be(:package2) { create(:maven_package, project: project) }
let_it_be(:package3) { create(:maven_package, project: project, name: 'foo') }
it 'returns other package versions of the same package name belonging to the project' do
expect(package.versions).to contain_exactly(package2)
end
it 'does not return different packages' do
expect(package.versions).not_to include(package3)
end
end
describe '#pipeline' do
let_it_be(:package) { create(:maven_package) }
context 'package without pipeline' do
it 'returns nil if there is no pipeline' do
expect(package.pipeline).to be_nil
end
end
context 'package with pipeline' do
let_it_be(:pipeline) { create(:ci_pipeline) }
before do
package.create_build_info!(pipeline: pipeline)
end
it 'returns the pipeline' do
expect(package.pipeline).to eq(pipeline)
end
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment