Skip to content

Add support for name in badges #898

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Feb 5, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 64 additions & 10 deletions src/main/java/org/gitlab4j/api/GroupApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import javax.ws.rs.core.Form;
Expand Down Expand Up @@ -1576,6 +1577,24 @@ public List<Badge> getBadges(Object groupIdOrPath) throws GitLabApiException {
return (response.readEntity(new GenericType<List<Badge>>() {}));
}

/**
* Gets a list of a group’s badges, case insensitively filtered on name.
*
* <pre><code>GitLab Endpoint: GET /groups/:id/badges</code></pre>
*
* @param groupIdOrPath the group ID, path of the group, or a Group instance holding the group ID or path
* @param name The name to filter on
* @return All badges of the GitLab item, case insensitively filtered on name.
* @throws GitLabApiException If any problem is encountered
*/
public List<Badge> getBadges(Object groupIdOrPath, String name) throws GitLabApiException {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GitLab4j is mostly a wrapper around GitLab API. Actually it seems that there is no possibility to find badges by name. The best way to implement this is to add a filter directly on GitLab. You can create an issue here https://gitlab.com/gitlab-org/gitlab/-/issues
Then when implementing, I will be happy to add the support of this filter.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Have updated my branch to correctly use ?name=foo as per listing project and group badges.

List<Badge> result = getBadges(groupIdOrPath);
if (name != null && name.length()>0) {
return result.stream().filter(b -> b.getName().equalsIgnoreCase(name)).collect(Collectors.toList());
}
return (result);
}

/**
* Gets a badge of a group.
*
Expand Down Expand Up @@ -1620,11 +1639,28 @@ public Optional<Badge> getOptionalBadge(Object groupIdOrPath, Long badgeId) {
* @throws GitLabApiException if any exception occurs
*/
public Badge addBadge(Object groupIdOrPath, String linkUrl, String imageUrl) throws GitLabApiException {
GitLabApiForm formData = new GitLabApiForm()
.withParam("link_url", linkUrl, true)
.withParam("image_url", imageUrl, true);
Response response = post(Response.Status.OK, formData, "groups", getGroupIdOrPath(groupIdOrPath), "badges");
return (response.readEntity(Badge.class));
return addBadge(groupIdOrPath, null, linkUrl, imageUrl);
}

/**
* Add a badge to a group.
*
* <pre><code>GitLab Endpoint: POST /groups/:id/badges</code></pre>
*
* @param groupIdOrPath the group ID, path of the group, or a Group instance holding the group ID or path
* @param name The name to give the badge (may be null)
* @param linkUrl the URL of the badge link
* @param imageUrl the URL of the image link
* @return A Badge instance for the added badge
* @throws GitLabApiException if any exception occurs
*/
public Badge addBadge(Object groupIdOrPath, String name, String linkUrl, String imageUrl) throws GitLabApiException {
GitLabApiForm formData = new GitLabApiForm()
.withParam("name", name, false)
.withParam("link_url", linkUrl, true)
.withParam("image_url", imageUrl, true);
Response response = post(Response.Status.OK, formData, "groups", getGroupIdOrPath(groupIdOrPath), "badges");
return (response.readEntity(Badge.class));
}

/**
Expand All @@ -1640,11 +1676,29 @@ public Badge addBadge(Object groupIdOrPath, String linkUrl, String imageUrl) thr
* @throws GitLabApiException if any exception occurs
*/
public Badge editBadge(Object groupIdOrPath, Long badgeId, String linkUrl, String imageUrl) throws GitLabApiException {
GitLabApiForm formData = new GitLabApiForm()
.withParam("link_url", linkUrl, false)
.withParam("image_url", imageUrl, false);
Response response = putWithFormData(Response.Status.OK, formData, "groups", getGroupIdOrPath(groupIdOrPath), "badges", badgeId);
return (response.readEntity(Badge.class));
return (editBadge(groupIdOrPath, badgeId, null, linkUrl, imageUrl));
}

/**
* Edit a badge of a group.
*
* <pre><code>GitLab Endpoint: PUT /groups/:id/badges</code></pre>
*
* @param groupIdOrPath the group ID, path of the group, or a Group instance holding the group ID or path
* @param badgeId the ID of the badge to edit
* @param name The name of the badge to edit (may be null)
* @param linkUrl the URL of the badge link
* @param imageUrl the URL of the image link
* @return a Badge instance for the edited badge
* @throws GitLabApiException if any exception occurs
*/
public Badge editBadge(Object groupIdOrPath, Long badgeId, String name, String linkUrl, String imageUrl) throws GitLabApiException {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I check on the current documentation of group badges and I don't find the edit with name.
I did not try against latest versions of GitLab. Did you tried?

Copy link
Contributor Author

@roadSurfer roadSurfer Jan 19, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, you cannot directly edit based on name and that is not what this code is doing.
It is still using badgeId to find the badge, and then setting name and other values to that requested.
The name only really matters on creation.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I see what you mean now.
I will go and check.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Testing in Gitlab shows that name does form part of the group badge put request, but this is not reflected in their documentation.
I will also log a bug with them about that, must be just an oversight as it is documented for projects.

edit_group_badge

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have submitted a merge request to update the API documentation.

Copy link
Contributor Author

@roadSurfer roadSurfer Jan 30, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

109473 has now been merged and you can see the updated name information in the Group and Project API docs.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@roadSurfer thanks.

GitLabApiForm formData = new GitLabApiForm()
.withParam("name", name, false)
.withParam("link_url", linkUrl, false)
.withParam("image_url", imageUrl, false);
Response response = putWithFormData(Response.Status.OK, formData, "groups", getGroupIdOrPath(groupIdOrPath), "badges", badgeId);
return (response.readEntity(Badge.class));
}

/**
Expand Down
74 changes: 64 additions & 10 deletions src/main/java/org/gitlab4j/api/ProjectApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.GenericType;
Expand Down Expand Up @@ -3314,6 +3315,24 @@ public List<Badge> getBadges(Object projectIdOrPath) throws GitLabApiException {
return (response.readEntity(new GenericType<List<Badge>>() {}));
}

/**
* Gets a list of a project’s badges and its group badges, case insensitively filtered on name.
*
* <pre><code>GitLab Endpoint: GET /projects/:id/badges</code></pre>
*
* @param projectIdOrPath the project in the form of a Long(ID), String(path), or Project instance
* @param name The name to filter on
* @return All badges of the GitLab item, case insensitively filtered on name.
* @throws GitLabApiException If any problem is encountered
*/
public List<Badge> getBadges(Object projectIdOrPath, String name) throws GitLabApiException {
List<Badge> result = getBadges(projectIdOrPath);
if (name != null && name.length()>0) {
return result.stream().filter(b -> b.getName().equalsIgnoreCase(name)).collect(Collectors.toList());
}
return (result);
}

/**
* Gets a badge of a project.
*
Expand Down Expand Up @@ -3358,11 +3377,28 @@ public Optional<Badge> getOptionalBadge(Object projectIdOrPath, Long badgeId) {
* @throws GitLabApiException if any exception occurs
*/
public Badge addBadge(Object projectIdOrPath, String linkUrl, String imageUrl) throws GitLabApiException {
GitLabApiForm formData = new GitLabApiForm()
.withParam("link_url", linkUrl, true)
.withParam("image_url", imageUrl, true);
Response response = post(Response.Status.OK, formData, "projects", getProjectIdOrPath(projectIdOrPath), "badges");
return (response.readEntity(Badge.class));
return addBadge(projectIdOrPath, null, linkUrl, imageUrl);
}

/**
* Add a badge to a project.
*
* <pre><code>GitLab Endpoint: POST /projects/:id/badges</code></pre>
*
* @param projectIdOrPath the project in the form of a Long(ID), String(path), or Project instance
* @param name The name to give the badge (may be null)
* @param linkUrl the URL of the badge link
* @param imageUrl the URL of the image link
* @return A Badge instance for the added badge
* @throws GitLabApiException if any exception occurs
*/
public Badge addBadge(Object projectIdOrPath, String name, String linkUrl, String imageUrl) throws GitLabApiException {
GitLabApiForm formData = new GitLabApiForm()
.withParam("name", name, false)
.withParam("link_url", linkUrl, true)
.withParam("image_url", imageUrl, true);
Response response = post(Response.Status.OK, formData, "projects", getProjectIdOrPath(projectIdOrPath), "badges");
return (response.readEntity(Badge.class));
}

/**
Expand All @@ -3378,11 +3414,29 @@ public Badge addBadge(Object projectIdOrPath, String linkUrl, String imageUrl) t
* @throws GitLabApiException if any exception occurs
*/
public Badge editBadge(Object projectIdOrPath, Long badgeId, String linkUrl, String imageUrl) throws GitLabApiException {
GitLabApiForm formData = new GitLabApiForm()
.withParam("link_url", linkUrl, false)
.withParam("image_url", imageUrl, false);
Response response = putWithFormData(Response.Status.OK, formData, "projects", getProjectIdOrPath(projectIdOrPath), "badges", badgeId);
return (response.readEntity(Badge.class));
return (editBadge(projectIdOrPath, badgeId, null, linkUrl, imageUrl));
}

/**
* Edit a badge of a project.
*
* <pre><code>GitLab Endpoint: PUT /projects/:id/badges</code></pre>
*
* @param projectIdOrPath the project in the form of a Long(ID), String(path), or Project instance
* @param badgeId the ID of the badge to edit
* @param name The name of the badge to edit (may be null)
* @param linkUrl the URL of the badge link
* @param imageUrl the URL of the image link
* @return a Badge instance for the editted badge
* @throws GitLabApiException if any exception occurs
*/
public Badge editBadge(Object projectIdOrPath, Long badgeId, String name, String linkUrl, String imageUrl) throws GitLabApiException {
GitLabApiForm formData = new GitLabApiForm()
.withParam("name", name, false)
.withParam("link_url", linkUrl, false)
.withParam("image_url", imageUrl, false);
Response response = putWithFormData(Response.Status.OK, formData, "projects", getProjectIdOrPath(projectIdOrPath), "badges", badgeId);
return (response.readEntity(Badge.class));
}

/**
Expand Down
4 changes: 3 additions & 1 deletion src/test/resources/org/gitlab4j/api/badges.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
[
{
"id": 1,
"name": "Badge 1",
"link_url": "http://example.com/ci_status.svg?project=%{project_path}&ref=%{default_branch}",
"image_url": "https://shields.io/my/badge",
"rendered_link_url": "http://example.com/ci_status.svg?project=example-org/example-project&ref=master",
Expand All @@ -9,10 +10,11 @@
},
{
"id": 2,
"name": "Badge 2",
"link_url": "http://example.com/ci_status.svg?project=%{project_path}&ref=%{default_branch}",
"image_url": "https://shields.io/my/badge",
"rendered_link_url": "http://example.com/ci_status.svg?project=example-org/example-project&ref=master",
"rendered_image_url": "https://shields.io/my/badge",
"kind": "group"
}
]
]