Skip to content
This repository was archived by the owner on Nov 27, 2023. It is now read-only.

Commit a87f4c5

Browse files
committed
feat: add support for gitlab issues
List and browse gitlab issues Relates to #166
1 parent 865db4b commit a87f4c5

File tree

2 files changed

+66
-3
lines changed

2 files changed

+66
-3
lines changed

src/provider/gitlab/api.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export interface GitLab {
1212
getMergeRequests(id: string, parameters?: GetMergeRequestParameters): Promise<GitLabResponse<MergeRequest[]>>;
1313
getMergeRequest(id: string, mr_iid: number): Promise<GitLabResponse<MergeRequest>>;
1414
createMergeRequest(id: string, body: CreateMergeRequestBody): Promise<GitLabResponse<MergeRequest>>;
15+
getProjectIssues(id: string, body: ProjectIssuesBody): Promise<GitLabResponse<Issue[]>>;
1516
}
1617

1718
export interface GitLabResponse<T> {
@@ -20,6 +21,18 @@ export interface GitLabResponse<T> {
2021
body: T;
2122
}
2223

24+
export interface ProjectIssuesBody {
25+
state?: 'opened' | 'closed';
26+
order_by?: 'created_at' | 'updated_at';
27+
sort?: 'asc' | 'desc';
28+
}
29+
30+
export interface Issue {
31+
iid: number;
32+
title: string;
33+
web_url: string;
34+
}
35+
2336
export interface CreateMergeRequestBody {
2437
source_branch: string;
2538
target_branch: string;
@@ -137,6 +150,8 @@ namespace impl {
137150
public getMergeRequest(): any {/* */}
138151
@Post('/projects/:id/merge_requests')
139152
public createMergeRequest(): any {/* */}
153+
@Get('/projects/:id/issues')
154+
public getProjectIssues(): any {/* */}
140155
}
141156

142157
}

src/provider/gitlab/repository.ts

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,13 @@ import {
66
CreatePullRequestBody,
77
IssuesParameters
88
} from '../repository';
9-
import { GitLab, Project, GetMergeRequestParameters, CreateMergeRequestBody } from './api';
9+
import {
10+
GitLab,
11+
Project,
12+
GetMergeRequestParameters,
13+
CreateMergeRequestBody,
14+
ProjectIssuesBody
15+
} from './api';
1016
import { GitLabMergeRequest } from './merge-request';
1117

1218
export class GitLabRepository implements Repository {
@@ -118,7 +124,49 @@ export class GitLabRepository implements Repository {
118124
};
119125
}
120126

121-
public async getIssues(_parameters?: IssuesParameters | undefined): Promise<Response<Issue[]>> {
122-
throw new Error('Method not implemented.');
127+
public async getIssues(parameters?: IssuesParameters | undefined): Promise<Response<Issue[]>> {
128+
function getState(state: IssuesParameters['state']): ProjectIssuesBody['state'] {
129+
switch (state) {
130+
case 'open':
131+
return 'opened';
132+
case 'closed':
133+
return 'closed';
134+
}
135+
return undefined;
136+
}
137+
function getOrderBy(orderBy: IssuesParameters['sort']): ProjectIssuesBody['order_by'] {
138+
switch (orderBy) {
139+
case 'created':
140+
return 'created_at';
141+
case 'updated':
142+
return 'updated_at';
143+
default:
144+
return undefined;
145+
}
146+
}
147+
148+
const body: ProjectIssuesBody = {};
149+
if (parameters) {
150+
if (parameters.state && parameters.state !== 'all') {
151+
body.state = getState(parameters.state);
152+
}
153+
if (parameters.sort) {
154+
body.order_by = getOrderBy(parameters.sort);
155+
}
156+
if (parameters.direction) {
157+
body.sort = parameters.direction;
158+
}
159+
}
160+
const response = await this.client.getProjectIssues(
161+
encodeURIComponent(this.project.path_with_namespace),
162+
body
163+
);
164+
return {
165+
body: response.body.map(issue => ({
166+
number: issue.iid,
167+
title: issue.title,
168+
url: issue.web_url
169+
}))
170+
};
123171
}
124172
}

0 commit comments

Comments
 (0)