Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
heptapod
heptapod
Commits
c3ffc0a5d840
Commit
7ad93ab2
authored
Aug 17, 2014
by
jubianchi
Browse files
Improve labels validation and expose error messages
parent
f30323d920ce
Changes
6
Hide whitespace changes
Inline
Side-by-side
app/models/concerns/issuable.rb
View file @
c3ffc0a5
...
...
@@ -138,6 +138,10 @@ def label_names
labels
.
order
(
'title ASC'
).
pluck
(
:title
)
end
def
remove_labels
labels
.
delete_all
end
def
add_labels_by_names
(
label_names
)
label_names
.
each
do
|
label_name
|
label
=
project
.
labels
.
create_with
(
...
...
app/models/label.rb
View file @
c3ffc0a5
...
...
@@ -6,14 +6,14 @@ class Label < ActiveRecord::Base
has_many
:issues
,
through: :label_links
,
source: :target
,
source_type:
'Issue'
validates
:color
,
format:
{
with:
/\A
\
#[0-9A-Fa-f]{6}
+
\Z/
},
format:
{
with:
/\A#[0-9A-Fa-f]{6}\Z/
},
allow_blank:
false
validates
:project
,
presence:
true
# Don't allow '?', '&', and ',' for label titles
validates
:title
,
presence:
true
,
format:
{
with:
/\A[^&\?,&]
*
\z/
},
format:
{
with:
/\A[^&\?,&]
+
\z/
},
uniqueness:
{
scope: :project_id
}
scope
:order_by_name
,
->
{
reorder
(
"labels.title ASC"
)
}
...
...
lib/api/helpers.rb
View file @
c3ffc0a5
...
...
@@ -114,17 +114,21 @@ def attributes_for_keys(keys)
# Helper method for validating all labels against its names
def
validate_label_params
(
params
)
errors
=
{}
if
params
[
:labels
].
present?
params
[
:labels
].
split
(
','
).
each
do
|
label_name
|
label
=
user_project
.
labels
.
create_with
(
color:
Label
::
DEFAULT_COLOR
).
find_or_initialize_by
(
title:
label_name
.
strip
)
if
label
.
invalid?
return
true
errors
[
label
.
title
]
=
label
.
errors
end
end
end
false
errors
end
# error helpers
...
...
lib/api/issues.rb
View file @
c3ffc0a5
...
...
@@ -52,8 +52,8 @@ class Issues < Grape::API
attrs
=
attributes_for_keys
[
:title
,
:description
,
:assignee_id
,
:milestone_id
]
# Validate label names in advance
if
validate_label_params
(
params
)
return
render_api_error!
(
'L
abel
names invalid'
,
40
5
)
if
(
errors
=
validate_label_params
(
params
)
).
any?
render_api_error!
(
{
l
abel
s:
errors
}
,
40
0
)
end
issue
=
::
Issues
::
CreateService
.
new
(
user_project
,
current_user
,
attrs
).
execute
...
...
@@ -90,8 +90,8 @@ class Issues < Grape::API
attrs
=
attributes_for_keys
[
:title
,
:description
,
:assignee_id
,
:milestone_id
,
:state_event
]
# Validate label names in advance
if
validate_label_params
(
params
)
return
render_api_error!
(
'L
abel
names invalid'
,
40
5
)
if
(
errors
=
validate_label_params
(
params
)
).
any?
render_api_error!
(
{
l
abel
s:
errors
}
,
40
0
)
end
issue
=
::
Issues
::
UpdateService
.
new
(
user_project
,
current_user
,
attrs
).
execute
(
issue
)
...
...
@@ -99,7 +99,8 @@ class Issues < Grape::API
if
issue
.
valid?
# Find or create labels and attach to issue. Labels are valid because
# we already checked its name, so there can't be an error here
if
params
[
:labels
].
present?
unless
params
[
:labels
].
nil?
issue
.
remove_labels
# Create and add labels to the new created issue
issue
.
add_labels_by_names
(
params
[
:labels
].
split
(
','
))
end
...
...
spec/requests/api/issues_spec.rb
View file @
c3ffc0a5
...
...
@@ -73,12 +73,12 @@
response
.
status
.
should
==
400
end
it
'should return 40
5
on invalid label names'
do
it
'should return 40
0
on invalid label names'
do
post
api
(
"/projects/
#{
project
.
id
}
/issues"
,
user
),
title:
'new issue'
,
labels:
'label, ?'
response
.
status
.
should
==
40
5
json_response
[
'message'
]
.
should
==
'Label name
s invalid'
response
.
status
.
should
==
40
0
json_response
[
'message'
]
[
'labels'
][
'?'
][
'title'
].
should
==
[
'i
s invalid'
]
end
end
...
...
@@ -97,12 +97,56 @@
response
.
status
.
should
==
404
end
it
'should return 40
5
on invalid label names'
do
it
'should return 40
0
on invalid label names'
do
put
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
"
,
user
),
title:
'updated title'
,
labels:
'label, ?'
response
.
status
.
should
==
405
json_response
[
'message'
].
should
==
'Label names invalid'
response
.
status
.
should
==
400
json_response
[
'message'
][
'labels'
][
'?'
][
'title'
].
should
==
[
'is invalid'
]
end
end
describe
'PUT /projects/:id/issues/:issue_id to update labels'
do
let!
(
:label
)
{
create
(
:label
,
title:
'dummy'
,
project:
project
)
}
let!
(
:label_link
)
{
create
(
:label_link
,
label:
label
,
target:
issue
)
}
it
'should not update labels if not present'
do
put
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
"
,
user
),
title:
'updated title'
response
.
status
.
should
==
200
json_response
[
'labels'
].
should
==
[
label
.
title
]
end
it
'should remove all labels'
do
put
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
"
,
user
),
labels:
''
response
.
status
.
should
==
200
json_response
[
'labels'
].
should
==
[]
end
it
'should update labels'
do
put
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
"
,
user
),
labels:
'foo,bar'
response
.
status
.
should
==
200
json_response
[
'labels'
].
should
include
'foo'
json_response
[
'labels'
].
should
include
'bar'
end
it
'should return 400 on invalid label names'
do
put
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
"
,
user
),
labels:
'label, ?'
response
.
status
.
should
==
400
json_response
[
'message'
][
'labels'
][
'?'
][
'title'
].
should
==
[
'is invalid'
]
end
it
'should allow special label names'
do
put
api
(
"/projects/
#{
project
.
id
}
/issues/
#{
issue
.
id
}
"
,
user
),
labels:
'label:foo, label-bar,label_bar,label/bar'
response
.
status
.
should
==
200
json_response
[
'labels'
].
should
include
'label:foo'
json_response
[
'labels'
].
should
include
'label-bar'
json_response
[
'labels'
].
should
include
'label_bar'
json_response
[
'labels'
].
should
include
'label/bar'
end
end
...
...
spec/requests/api/labels_spec.rb
View file @
c3ffc0a5
...
...
@@ -50,6 +50,14 @@
json_response
[
'message'
].
should
==
'Color is invalid'
end
it
'should return 400 for too long color code'
do
post
api
(
"/projects/
#{
project
.
id
}
/labels"
,
user
),
name:
'Foo'
,
color:
'#FFAAFFFF'
response
.
status
.
should
==
400
json_response
[
'message'
].
should
==
'Color is invalid'
end
it
'should return 400 for invalid name'
do
post
api
(
"/projects/
#{
project
.
id
}
/labels"
,
user
),
name:
'?'
,
...
...
@@ -147,5 +155,13 @@
response
.
status
.
should
==
400
json_response
[
'message'
].
should
==
'Color is invalid'
end
it
'should return 400 for too long color code'
do
post
api
(
"/projects/
#{
project
.
id
}
/labels"
,
user
),
name:
'Foo'
,
color:
'#FFAAFFFF'
response
.
status
.
should
==
400
json_response
[
'message'
].
should
==
'Color is invalid'
end
end
end
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