Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
6ea168bd
Commit
6ea168bd
authored
Apr 26, 2017
by
Valery Sizov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[Issue multiple assignees] Issue API has both fields assignees and deprecated assignee
parent
d525c9a8
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
189 additions
and
12 deletions
+189
-12
doc/api/issues.md
doc/api/issues.md
+76
-0
lib/api/api.rb
lib/api/api.rb
+2
-0
lib/api/entities.rb
lib/api/entities.rb
+4
-0
lib/api/helpers/common_helpers.rb
lib/api/helpers/common_helpers.rb
+13
-0
lib/api/issues.rb
lib/api/issues.rb
+7
-2
lib/api/v3/helpers.rb
lib/api/v3/helpers.rb
+0
-8
spec/fixtures/api/schemas/public_api/v4/issues.json
spec/fixtures/api/schemas/public_api/v4/issues.json
+12
-0
spec/requests/api/issues_spec.rb
spec/requests/api/issues_spec.rb
+57
-1
spec/requests/api/v3/issues_spec.rb
spec/requests/api/v3/issues_spec.rb
+18
-1
No files found.
doc/api/issues.md
View file @
6ea168bd
...
...
@@ -76,6 +76,14 @@ Example response:
"avatar_url"
:
null
,
"username"
:
"root"
}],
"assignee"
:
{
"state"
:
"active"
,
"id"
:
1
,
"name"
:
"Administrator"
,
"web_url"
:
"https://gitlab.example.com/root"
,
"avatar_url"
:
null
,
"username"
:
"root"
},
"updated_at"
:
"2016-01-04T15:31:51.081Z"
,
"id"
:
76
,
"title"
:
"Consequatur vero maxime deserunt laboriosam est voluptas dolorem."
,
...
...
@@ -91,6 +99,8 @@ Example response:
]
```
**Note**
:
`assignee`
column is deprecated, it shows a first assignee only.
## List group issues
Get a list of a group's issues.
...
...
@@ -158,6 +168,14 @@ Example response:
"id"
:
9
,
"name"
:
"Dr. Luella Kovacek"
}],
"assignee"
:
{
"avatar_url"
:
null
,
"web_url"
:
"https://gitlab.example.com/lennie"
,
"state"
:
"active"
,
"username"
:
"lennie"
,
"id"
:
9
,
"name"
:
"Dr. Luella Kovacek"
},
"labels"
:
[],
"id"
:
41
,
"title"
:
"Ut commodi ullam eos dolores perferendis nihil sunt."
,
...
...
@@ -172,6 +190,8 @@ Example response:
]
```
**Note**
:
`assignee`
column is deprecated, it shows a first assignee only.
## List project issues
Get a list of a project's issues.
...
...
@@ -239,6 +259,14 @@ Example response:
"id"
:
9
,
"name"
:
"Dr. Luella Kovacek"
}],
"assignee"
:
{
"avatar_url"
:
null
,
"web_url"
:
"https://gitlab.example.com/lennie"
,
"state"
:
"active"
,
"username"
:
"lennie"
,
"id"
:
9
,
"name"
:
"Dr. Luella Kovacek"
},
"labels"
:
[],
"id"
:
41
,
"title"
:
"Ut commodi ullam eos dolores perferendis nihil sunt."
,
...
...
@@ -253,6 +281,8 @@ Example response:
]
```
**Note**
:
`assignee`
column is deprecated, it shows a first assignee only.
## Single issue
Get a single project issue.
...
...
@@ -305,6 +335,14 @@ Example response:
"id"
:
9
,
"name"
:
"Dr. Luella Kovacek"
}],
"assignee"
:
{
"avatar_url"
:
null
,
"web_url"
:
"https://gitlab.example.com/lennie"
,
"state"
:
"active"
,
"username"
:
"lennie"
,
"id"
:
9
,
"name"
:
"Dr. Luella Kovacek"
},
"labels"
:
[],
"id"
:
41
,
"title"
:
"Ut commodi ullam eos dolores perferendis nihil sunt."
,
...
...
@@ -319,6 +357,8 @@ Example response:
}
```
**Note**
:
`assignee`
column is deprecated, it shows a first assignee only.
## New issue
Creates a new project issue.
...
...
@@ -357,6 +397,7 @@ Example response:
"title"
:
"Issues with auth"
,
"state"
:
"opened"
,
"assignees"
:
[],
"assignee"
:
null
,
"labels"
:
[
"bug"
],
...
...
@@ -380,6 +421,8 @@ Example response:
}
```
**Note**
:
`assignee`
column is deprecated, it shows a first assignee only.
## Edit issue
Updates an existing project issue. This call is also used to mark an issue as
...
...
@@ -432,6 +475,7 @@ Example response:
],
"id"
:
85
,
"assignees"
:
[],
"assignee"
:
null
,
"milestone"
:
null
,
"subscribed"
:
true
,
"user_notes_count"
:
0
,
...
...
@@ -442,6 +486,8 @@ Example response:
}
```
**Note**
:
`assignee`
column is deprecated, it shows a first assignee only.
## Delete an issue
Only for admins and project owners. Soft deletes the issue in question.
...
...
@@ -504,6 +550,14 @@ Example response:
"avatar_url"
:
"http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon"
,
"web_url"
:
"https://gitlab.example.com/axel.block"
}],
"assignee"
:
{
"name"
:
"Miss Monserrate Beier"
,
"username"
:
"axel.block"
,
"id"
:
12
,
"state"
:
"active"
,
"avatar_url"
:
"http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon"
,
"web_url"
:
"https://gitlab.example.com/axel.block"
},
"author"
:
{
"name"
:
"Kris Steuber"
,
"username"
:
"solon.cremin"
,
...
...
@@ -519,6 +573,8 @@ Example response:
}
```
**Note**
:
`assignee`
column is deprecated, it shows a first assignee only.
## Subscribe to an issue
Subscribes the authenticated user to an issue to receive notifications.
...
...
@@ -560,6 +616,14 @@ Example response:
"avatar_url"
:
"http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon"
,
"web_url"
:
"https://gitlab.example.com/axel.block"
}],
"assignee"
:
{
"name"
:
"Miss Monserrate Beier"
,
"username"
:
"axel.block"
,
"id"
:
12
,
"state"
:
"active"
,
"avatar_url"
:
"http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon"
,
"web_url"
:
"https://gitlab.example.com/axel.block"
},
"author"
:
{
"name"
:
"Kris Steuber"
,
"username"
:
"solon.cremin"
,
...
...
@@ -575,6 +639,8 @@ Example response:
}
```
**Note**
:
`assignee`
column is deprecated, it shows a first assignee only.
## Unsubscribe from an issue
Unsubscribes the authenticated user from the issue to not receive notifications
...
...
@@ -664,6 +730,14 @@ Example response:
"avatar_url"
:
"http://www.gravatar.com/avatar/a7fa515d53450023c83d62986d0658a8?s=80&d=identicon"
,
"web_url"
:
"https://gitlab.example.com/francisca"
}],
"assignee"
:
{
"name"
:
"Jarret O'Keefe"
,
"username"
:
"francisca"
,
"id"
:
14
,
"state"
:
"active"
,
"avatar_url"
:
"http://www.gravatar.com/avatar/a7fa515d53450023c83d62986d0658a8?s=80&d=identicon"
,
"web_url"
:
"https://gitlab.example.com/francisca"
},
"author"
:
{
"name"
:
"Maxie Medhurst"
,
"username"
:
"craig_rutherford"
,
...
...
@@ -688,6 +762,8 @@ Example response:
}
```
**Note**
:
`assignee`
column is deprecated, it shows a first assignee only.
## Set a time estimate for an issue
Sets an estimated time of work for this issue.
...
...
lib/api/api.rb
View file @
6ea168bd
...
...
@@ -6,6 +6,7 @@ module API
version
'v3'
,
using: :path
do
helpers
::
API
::
V3
::
Helpers
helpers
::
API
::
Helpers
::
CommonHelpers
mount
::
API
::
V3
::
AwardEmoji
mount
::
API
::
V3
::
Boards
...
...
@@ -81,6 +82,7 @@ module API
# Ensure the namespace is right, otherwise we might load Grape::API::Helpers
helpers
::
SentryHelper
helpers
::
API
::
Helpers
helpers
::
API
::
Helpers
::
CommonHelpers
# Keep in alphabetical order
mount
::
API
::
AccessRequests
...
...
lib/api/entities.rb
View file @
6ea168bd
...
...
@@ -281,6 +281,10 @@ module API
expose
:milestone
,
using:
Entities
::
Milestone
expose
:assignees
,
:author
,
using:
Entities
::
UserBasic
expose
:assignee
,
using:
::
API
::
Entities
::
UserBasic
do
|
issue
,
options
|
issue
.
assignees
.
first
end
expose
:user_notes_count
expose
:upvotes
,
:downvotes
expose
:due_date
...
...
lib/api/helpers/common_helpers.rb
0 → 100644
View file @
6ea168bd
module
API
module
Helpers
module
CommonHelpers
def
convert_parameters_from_legacy_format
(
params
)
if
params
[
:assignee_id
].
present?
params
[
:assignee_ids
]
=
[
params
.
delete
(
:assignee_id
)]
end
params
end
end
end
end
lib/api/issues.rb
View file @
6ea168bd
...
...
@@ -31,7 +31,8 @@ module API
params
:issue_params
do
optional
:description
,
type:
String
,
desc:
'The description of an issue'
optional
:assignee_ids
,
type:
Array
[
Integer
],
desc:
'The ID of a user to assign issue'
optional
:assignee_ids
,
type:
Array
[
Integer
],
desc:
'The array of user IDs to assign issue'
optional
:assignee_id
,
type:
Integer
,
desc:
'[Deprecated] The ID of a user to assign issue'
optional
:milestone_id
,
type:
Integer
,
desc:
'The ID of a milestone to assign issue'
optional
:labels
,
type:
String
,
desc:
'Comma-separated list of label names'
optional
:due_date
,
type:
String
,
desc:
'Date string in the format YEAR-MONTH-DAY'
...
...
@@ -132,6 +133,8 @@ module API
issue_params
=
declared_params
(
include_missing:
false
)
issue_params
=
convert_parameters_from_legacy_format
(
issue_params
)
issue
=
::
Issues
::
CreateService
.
new
(
user_project
,
current_user
,
issue_params
.
merge
(
request:
request
,
api:
true
)).
execute
...
...
@@ -156,7 +159,7 @@ module API
desc:
'Date time when the issue was updated. Available only for admins and project owners.'
optional
:state_event
,
type:
String
,
values:
%w[reopen close]
,
desc:
'State of the issue'
use
:issue_params
at_least_one_of
:title
,
:description
,
:assignee_ids
,
:milestone_id
,
at_least_one_of
:title
,
:description
,
:assignee_ids
,
:
assignee_id
,
:
milestone_id
,
:labels
,
:created_at
,
:due_date
,
:confidential
,
:state_event
,
:weight
end
...
...
@@ -171,6 +174,8 @@ module API
update_params
=
declared_params
(
include_missing:
false
).
merge
(
request:
request
,
api:
true
)
update_params
=
convert_parameters_from_legacy_format
(
update_params
)
issue
=
::
Issues
::
UpdateService
.
new
(
user_project
,
current_user
,
update_params
).
execute
(
issue
)
...
...
lib/api/v3/helpers.rb
View file @
6ea168bd
...
...
@@ -14,14 +14,6 @@ module API
authorize!
access_level
,
merge_request
merge_request
end
def
convert_parameters_from_legacy_format
(
params
)
if
params
[
:assignee_id
].
present?
params
[
:assignee_ids
]
=
[
params
.
delete
(
:assignee_id
)]
end
params
end
end
end
end
spec/fixtures/api/schemas/public_api/v4/issues.json
View file @
6ea168bd
...
...
@@ -48,6 +48,18 @@
"additionalProperties"
:
false
}
},
"assignee"
:
{
"type"
:
"object"
,
"properties"
:
{
"name"
:
{
"type"
:
"string"
},
"username"
:
{
"type"
:
"string"
},
"id"
:
{
"type"
:
"integer"
},
"state"
:
{
"type"
:
"string"
},
"avatar_url"
:
{
"type"
:
"uri"
},
"web_url"
:
{
"type"
:
"uri"
}
},
"additionalProperties"
:
false
},
"author"
:
{
"type"
:
"object"
,
"properties"
:
{
...
...
spec/requests/api/issues_spec.rb
View file @
6ea168bd
...
...
@@ -789,6 +789,7 @@ describe API::Issues, api: true do
expect
(
json_response
[
'labels'
]).
to
eq
(
issue
.
label_names
)
expect
(
json_response
[
'milestone'
]).
to
be_a
Hash
expect
(
json_response
[
'assignees'
]).
to
be_a
Array
expect
(
json_response
[
'assignee'
]).
to
be_a
Hash
expect
(
json_response
[
'author'
]).
to
be_a
Hash
expect
(
json_response
[
'confidential'
]).
to
be_falsy
expect
(
json_response
[
'weight'
]).
to
be_nil
...
...
@@ -861,9 +862,22 @@ describe API::Issues, api: true do
end
describe
"POST /projects/:id/issues"
do
context
'support for deprecated assignee_id'
do
it
'creates a new project issue'
do
post
api
(
"/projects/
#{
project
.
id
}
/issues"
,
user
),
title:
'new issue'
,
assignee_id:
user2
.
id
expect
(
response
).
to
have_http_status
(
201
)
expect
(
json_response
[
'title'
]).
to
eq
(
'new issue'
)
expect
(
json_response
[
'assignee'
][
'name'
]).
to
eq
(
user2
.
name
)
expect
(
json_response
[
'assignees'
].
first
[
'name'
]).
to
eq
(
user2
.
name
)
end
end
it
'creates a new project issue'
do
post
api
(
"/projects/
#{
project
.
id
}
/issues"
,
user
),
title:
'new issue'
,
labels:
'label, label2'
,
weight:
3
title:
'new issue'
,
labels:
'label, label2'
,
weight:
3
,
assignee_ids:
[
user2
.
id
]
expect
(
response
).
to
have_http_status
(
201
)
expect
(
json_response
[
'title'
]).
to
eq
(
'new issue'
)
...
...
@@ -871,6 +885,8 @@ describe API::Issues, api: true do
expect
(
json_response
[
'labels'
]).
to
eq
(
%w(label label2)
)
expect
(
json_response
[
'confidential'
]).
to
be_falsy
expect
(
json_response
[
'weight'
]).
to
eq
(
3
)
expect
(
json_response
[
'assignee'
][
'name'
]).
to
eq
(
user2
.
name
)
expect
(
json_response
[
'assignees'
].
first
[
'name'
]).
to
eq
(
user2
.
name
)
end
it
'creates a new confidential project issue'
do
...
...
@@ -1160,6 +1176,46 @@ describe API::Issues, api: true do
end
end
describe
'PUT /projects/:id/issues/:issue_iid to update assignee'
do
context
'support for deprecated assignee_id'
do
it
'removes assignee'
do
put
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
iid
}
"
,
user
),
assignee_id:
0
expect
(
response
).
to
have_http_status
(
200
)
expect
(
json_response
[
'assignee'
]).
to
be_nil
end
it
'updates an issue with new assignee'
do
put
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
iid
}
"
,
user
),
assignee_id:
user2
.
id
expect
(
response
).
to
have_http_status
(
200
)
expect
(
json_response
[
'assignee'
][
'name'
]).
to
eq
(
user2
.
name
)
end
end
it
'removes assignee'
do
put
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
iid
}
"
,
user
),
assignee_ids:
[
0
]
expect
(
response
).
to
have_http_status
(
200
)
expect
(
json_response
[
'assignees'
]).
to
be_empty
end
it
'updates an issue with new assignee'
do
put
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
iid
}
"
,
user
),
assignee_ids:
[
user2
.
id
]
expect
(
response
).
to
have_http_status
(
200
)
expect
(
json_response
[
'assignees'
].
first
[
'name'
]).
to
eq
(
user2
.
name
)
end
end
describe
'PUT /projects/:id/issues/:issue_iid to update labels'
do
let!
(
:label
)
{
create
(
:label
,
title:
'dummy'
,
project:
project
)
}
let!
(
:label_link
)
{
create
(
:label_link
,
label:
label
,
target:
issue
)
}
...
...
spec/requests/api/v3/issues_spec.rb
View file @
6ea168bd
...
...
@@ -731,7 +731,7 @@ describe API::V3::Issues, api: true do
describe
"POST /projects/:id/issues"
do
it
'creates a new project issue'
do
post
v3_api
(
"/projects/
#{
project
.
id
}
/issues"
,
user
),
title:
'new issue'
,
labels:
'label, label2'
,
weight:
3
title:
'new issue'
,
labels:
'label, label2'
,
weight:
3
,
assignee_id:
assignee
.
id
expect
(
response
).
to
have_http_status
(
201
)
expect
(
json_response
[
'title'
]).
to
eq
(
'new issue'
)
...
...
@@ -739,6 +739,7 @@ describe API::V3::Issues, api: true do
expect
(
json_response
[
'labels'
]).
to
eq
(
%w(label label2)
)
expect
(
json_response
[
'confidential'
]).
to
be_falsy
expect
(
json_response
[
'weight'
]).
to
eq
(
3
)
expect
(
json_response
[
'assignee'
][
'name'
]).
to
eq
(
assignee
.
name
)
end
it
'creates a new confidential project issue'
do
...
...
@@ -1135,6 +1136,22 @@ describe API::V3::Issues, api: true do
end
end
describe
'PUT /projects/:id/issues/:issue_id to update assignee'
do
it
'updates an issue with no assignee'
do
put
v3_api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
"
,
user
),
assignee_id:
0
expect
(
response
).
to
have_http_status
(
200
)
expect
(
json_response
[
'assignee'
]).
to
eq
(
nil
)
end
it
'updates an issue with assignee'
do
put
v3_api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
"
,
user
),
assignee_id:
user2
.
id
expect
(
response
).
to
have_http_status
(
200
)
expect
(
json_response
[
'assignee'
][
'name'
]).
to
eq
(
user2
.
name
)
end
end
describe
'PUT /projects/:id/issues/:issue_id to update weight'
do
it
'updates an issue with no weight'
do
put
v3_api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
"
,
user
),
weight:
5
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment