Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
佳 邓
Gitlab4j Api
Commits
d798c903
Commit
d798c903
authored
Sep 09, 2019
by
Greg Messner
Browse files
Mods to support project and issues statistics (#424).
parent
6d1aa4cd
Changes
7
Hide whitespace changes
Inline
Side-by-side
src/main/java/org/gitlab4j/api/IssuesApi.java
View file @
d798c903
...
...
@@ -13,6 +13,8 @@ import org.gitlab4j.api.models.Duration;
import
org.gitlab4j.api.models.Issue
;
import
org.gitlab4j.api.models.IssueFilter
;
import
org.gitlab4j.api.models.IssueLink
;
import
org.gitlab4j.api.models.IssuesStatistics
;
import
org.gitlab4j.api.models.IssuesStatisticsFilter
;
import
org.gitlab4j.api.models.MergeRequest
;
import
org.gitlab4j.api.models.Participant
;
import
org.gitlab4j.api.models.TimeStats
;
...
...
@@ -22,6 +24,7 @@ import org.gitlab4j.api.utils.DurationUtils;
* This class provides an entry point to all the GitLab API Issue calls.
* @see <a href="https://docs.gitlab.com/ce/api/issues.html">Issues API at GitLab</a>
* @see <a href="https://docs.gitlab.com/ce/api/issue_links.html">Issue Links API at GitLab</a>
* @see <a href="https://docs.gitlab.com/ce/api/issues_statistics.html">Issues Statistics API at GitLab</a>
*/
public
class
IssuesApi
extends
AbstractApi
implements
Constants
{
...
...
@@ -839,4 +842,52 @@ public class IssuesApi extends AbstractApi implements Constants {
public
Stream
<
Participant
>
getParticipantsStream
(
Object
projectIdOrPath
,
Integer
issueIid
)
throws
GitLabApiException
{
return
(
getParticipants
(
projectIdOrPath
,
issueIid
,
getDefaultPerPage
()).
stream
());
}
/**
* Gets issues count statistics on all issues the authenticated user has access to. By default it returns
* only issues created by the current user. To get all issues, use parameter scope=all.
*
* <pre><code>GitLab Endpoint: GET /issues_statistics</code></pre>
*
* @param filter {@link IssuesStatisticsFilter} a IssuesStatisticsFilter instance with the filter settings.
* @return an IssuesStatistics instance with the statistics for the matched issues.
* @throws GitLabApiException if any exception occurs
*/
public
IssuesStatistics
getIssuesStatistics
(
IssuesStatisticsFilter
filter
)
throws
GitLabApiException
{
GitLabApiForm
formData
=
filter
.
getQueryParams
();
Response
response
=
get
(
Response
.
Status
.
OK
,
formData
.
asMap
(),
"issues_statistics"
);
return
(
response
.
readEntity
(
IssuesStatistics
.
class
));
}
/**
* Gets issues count statistics for given group.
*
* <pre><code>GitLab Endpoint: GET /groups/:groupId/issues_statistics</code></pre>
*
* @param groupIdOrPath the group ID, path of the group, or a Group instance holding the group ID or path, required
* @param filter {@link IssuesStatisticsFilter} a IssuesStatisticsFilter instance with the filter settings
* @return an IssuesStatistics instance with the statistics for the matched issues
* @throws GitLabApiException if any exception occurs
*/
public
IssuesStatistics
getGroupIssuesStatistics
(
Object
groupIdOrPath
,
IssuesStatisticsFilter
filter
)
throws
GitLabApiException
{
GitLabApiForm
formData
=
filter
.
getQueryParams
();
Response
response
=
get
(
Response
.
Status
.
OK
,
formData
.
asMap
(),
"groups"
,
this
.
getGroupIdOrPath
(
groupIdOrPath
),
"issues_statistics"
);
return
(
response
.
readEntity
(
IssuesStatistics
.
class
));
}
/**
* Gets issues count statistics for given group.
*
* <pre><code>GitLab Endpoint: GET /projects/:projectId/issues_statistics</code></pre>
*
* @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance, required
* @param filter {@link IssuesStatisticsFilter} a IssuesStatisticsFilter instance with the filter settings.
* @return an IssuesStatistics instance with the statistics for the matched issues
* @throws GitLabApiException if any exception occurs
*/
public
IssuesStatistics
geProjectIssuesStatistics
(
Object
projectIdOrPath
,
IssuesStatisticsFilter
filter
)
throws
GitLabApiException
{
GitLabApiForm
formData
=
filter
.
getQueryParams
();
Response
response
=
get
(
Response
.
Status
.
OK
,
formData
.
asMap
(),
"projects"
,
this
.
getProjectIdOrPath
(
projectIdOrPath
),
"issues_statistics"
);
return
(
response
.
readEntity
(
IssuesStatistics
.
class
));
}
}
src/main/java/org/gitlab4j/api/ProjectApi.java
View file @
d798c903
...
...
@@ -46,6 +46,7 @@ import org.gitlab4j.api.models.Issue;
import
org.gitlab4j.api.models.Member
;
import
org.gitlab4j.api.models.Namespace
;
import
org.gitlab4j.api.models.Project
;
import
org.gitlab4j.api.models.ProjectFetches
;
import
org.gitlab4j.api.models.ProjectFilter
;
import
org.gitlab4j.api.models.ProjectHook
;
import
org.gitlab4j.api.models.ProjectUser
;
...
...
@@ -57,8 +58,9 @@ import org.gitlab4j.api.models.Visibility;
/**
* This class provides an entry point to all the GitLab API project calls.
* @see <a href="https://docs.gitlab.com/ce/api/projects.html">Projects API at GitLab</a>
* @see <a href="https://docs.gitlab.com/ee/api/members.html">Group and project members API at GitLab</a>
* @see <a href="https://docs.gitlab.com/ee/api/access_requests.html#group-and-project-access-requests-api">Group and project access requests API</a>
* @see <a href="https://docs.gitlab.com/ce/api/project_statistics.html">Project statistics API</a>
* @see <a href="https://docs.gitlab.com/ce/api/members.html">Group and project members API at GitLab</a>
* @see <a href="https://docs.gitlab.com/ce/api/access_requests.html#group-and-project-access-requests-api">Group and project access requests API</a>
*/
public
class
ProjectApi
extends
AbstractApi
implements
Constants
{
...
...
@@ -66,6 +68,40 @@ public class ProjectApi extends AbstractApi implements Constants {
super
(
gitLabApi
);
}
/**
* Get the project fetch statistics for the last 30 days. Retrieving the statistics requires
* write access to the repository. Currently only HTTP fetches statistics are returned.
* Fetches statistics includes both clones and pulls count and are HTTP only,
* SSH fetches are not included.
*
* <pre><code>GitLab Endpoint: GET /project/:id/statistics</code></pre>
*
* @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance, required
* @return a ProjectFetches instance with the project fetch statistics for the last 30 days
* @throws GitLabApiException if any exception occurs during execution
*/
public
ProjectFetches
getProjectStatistics
(
Object
projectIdOrPath
)
throws
GitLabApiException
{
Response
response
=
get
(
Response
.
Status
.
OK
,
null
,
"projects"
,
getProjectIdOrPath
(
projectIdOrPath
),
"statistics"
);
return
(
response
.
readEntity
(
ProjectFetches
.
class
));
}
/**
* Get an Optional instance with the value for the project fetch statistics for the last 30 days.
*
* <pre><code>GitLab Endpoint: GET /project/:id/statistics</code></pre>
*
* @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance, required
* @return an Optional instance with the value for the project fetch statistics for the last 30 day
* @throws GitLabApiException if any exception occurs during execution
*/
public
Optional
<
ProjectFetches
>
getOptionalProjectStatistics
(
Object
projectIdOrPath
)
throws
GitLabApiException
{
try
{
return
(
Optional
.
ofNullable
(
getProjectStatistics
(
projectIdOrPath
)));
}
catch
(
GitLabApiException
glae
)
{
return
(
GitLabApi
.
createOptionalFromException
(
glae
));
}
}
/**
* <p>Get a list of projects accessible by the authenticated user.</p>
*
...
...
src/main/java/org/gitlab4j/api/models/IssueFilter.java
View file @
d798c903
...
...
@@ -12,8 +12,6 @@ import org.gitlab4j.api.GitLabApiForm;
import
org.gitlab4j.api.utils.ISO8601
;
/**
* Created by zhengrenjie on 2018/09/11 12:31
*
* This class is used to filter issues when getting lists of them.
*/
public
class
IssueFilter
{
...
...
src/main/java/org/gitlab4j/api/utils/ISO8601.java
View file @
d798c903
...
...
@@ -26,6 +26,7 @@ public class ISO8601 {
public
static
final
String
OUTPUT_PATTERN
=
"yyyy-MM-dd'T'HH:mm:ss'Z'"
;
public
static
final
String
OUTPUT_MSEC_PATTERN
=
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
;
public
static
final
String
UTC_PATTERN
=
"yyyy-MM-dd HH:mm:ss 'UTC'"
;
public
static
final
String
DATE_ONLY_PATTERN
=
"yyyy-MM-dd"
;
private
static
final
DateTimeFormatter
ODT_WITH_MSEC_PARSER
=
new
DateTimeFormatterBuilder
().
appendPattern
(
"yyyy-MM-dd[['T'][ ]HH:mm:ss.SSS[ ][XXXXX][XXXX]]"
).
toFormatter
();
private
static
final
DateTimeFormatter
ODT_PARSER
=
new
DateTimeFormatterBuilder
().
appendPattern
(
"yyyy-MM-dd[['T'][ ]HH:mm:ss[.SSS][ ][XXX][X]]"
)
...
...
@@ -116,6 +117,21 @@ public class ISO8601 {
SafeDateFormatter
.
getDateFormat
(
OUTPUT_PATTERN
).
format
(
date
));
}
/**
* Get a string that includes the date only in yyyy-mm-ss format.
*
* @param date the Date instance to get the date only formatted string for
* @return a string that includes the date only in yyyy-mm-ss format, or null if date is null
*/
public
static
String
dateOnly
(
Date
date
)
{
if
(
date
==
null
)
{
return
(
null
);
}
return
SafeDateFormatter
.
getDateFormat
(
DATE_ONLY_PATTERN
).
format
(
date
);
}
/**
* Get a ISO8601 formatted string for the provided Date instance.
*
...
...
src/main/java/org/gitlab4j/api/utils/JacksonJson.java
View file @
d798c903
...
...
@@ -257,6 +257,18 @@ public class JacksonJson extends JacksonJaxbJsonProvider implements ContextResol
return
(
results
);
}
/**
* JsonSerializer for serializing dates s yyyy-mm-dd in UTC timezone.
*/
public
static
class
DateOnlySerializer
extends
JsonSerializer
<
Date
>
{
@Override
public
void
serialize
(
Date
date
,
JsonGenerator
gen
,
SerializerProvider
provider
)
throws
IOException
,
JsonProcessingException
{
String
dateString
=
ISO8601
.
dateOnly
(
date
);
gen
.
writeString
(
dateString
);
}
}
/**
* JsonSerializer for serializing ISO8601 formatted dates.
*/
...
...
src/test/java/org/gitlab4j/api/TestGitLabApiBeans.java
View file @
d798c903
...
...
@@ -52,6 +52,7 @@ import org.gitlab4j.api.models.Epic;
import
org.gitlab4j.api.models.EpicIssue
;
import
org.gitlab4j.api.models.Event
;
import
org.gitlab4j.api.models.ExportStatus
;
import
org.gitlab4j.api.models.ProjectFetches
;
import
org.gitlab4j.api.models.FileUpload
;
import
org.gitlab4j.api.models.Group
;
import
org.gitlab4j.api.models.HealthCheckInfo
;
...
...
@@ -59,6 +60,7 @@ import org.gitlab4j.api.models.ImpersonationToken;
import
org.gitlab4j.api.models.ImportStatus
;
import
org.gitlab4j.api.models.Issue
;
import
org.gitlab4j.api.models.IssueLink
;
import
org.gitlab4j.api.models.IssuesStatistics
;
import
org.gitlab4j.api.models.Job
;
import
org.gitlab4j.api.models.Key
;
import
org.gitlab4j.api.models.Label
;
...
...
@@ -208,6 +210,18 @@ public class TestGitLabApiBeans {
assertTrue
(
compareJson
(
fileUpload
,
"file-upload.json"
));
}
@Test
public
void
testIssuesStatistics
()
throws
Exception
{
IssuesStatistics
statistics
=
unmarshalResource
(
IssuesStatistics
.
class
,
"issues-statistics.json"
);
assertTrue
(
compareJson
(
statistics
,
"issues-statistics.json"
));
}
@Test
public
void
testProjectFetches
()
throws
Exception
{
ProjectFetches
fetches
=
unmarshalResource
(
ProjectFetches
.
class
,
"project-fetches.json"
);
assertTrue
(
compareJson
(
fetches
,
"project-fetches.json"
));
}
@Test
public
void
testGroup
()
throws
Exception
{
Group
group
=
unmarshalResource
(
Group
.
class
,
"group.json"
);
...
...
src/test/java/org/gitlab4j/api/TestProjectApi.java
View file @
d798c903
...
...
@@ -44,6 +44,7 @@ import org.gitlab4j.api.models.AccessRequest;
import
org.gitlab4j.api.models.Group
;
import
org.gitlab4j.api.models.Member
;
import
org.gitlab4j.api.models.Project
;
import
org.gitlab4j.api.models.ProjectFetches
;
import
org.gitlab4j.api.models.ProjectFilter
;
import
org.gitlab4j.api.models.User
;
import
org.gitlab4j.api.models.Variable
;
...
...
@@ -847,4 +848,11 @@ public class TestProjectApi extends AbstractIntegrationTest {
}
}
}
@Test
public
void
testGetProjectStatistics
()
throws
GitLabApiException
{
assertNotNull
(
testProject
);
Optional
<
ProjectFetches
>
statistics
=
gitLabApi
.
getProjectApi
().
getOptionalProjectStatistics
(
testProject
);
assertTrue
(
statistics
.
isPresent
());
}
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new 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