Skip to content

Commit 5e548ba

Browse files
committed
added /Milestones/dzcode endpoint
1 parent 1f1df53 commit 5e548ba

File tree

7 files changed

+89
-1
lines changed

7 files changed

+89
-1
lines changed

api/src/app/endpoints.ts

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { LanguageEntity } from "@dzcode.io/models/dist/language";
33
import { GetContributionsResponseDto } from "../contribution/types";
44
import { GetContributorsResponseDto } from "../contributor/types";
55
import { GetUserResponseDto } from "../github-user/types";
6+
import { GetMilestonesResponseDto } from "../milestone/types";
67
import { GetTeamResponseDto } from "../team/types";
78
import { Article, Document, Project } from "./types/legacy";
89

@@ -49,4 +50,7 @@ export interface Endpoints {
4950
"api:Team": {
5051
response: GetTeamResponseDto;
5152
};
53+
"api:MileStones/dzcode": {
54+
response: GetMilestonesResponseDto;
55+
};
5256
}

api/src/app/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { ContributorController } from "../contributor/controller";
1212
import { GithubController } from "../github/controller";
1313
import { GithubUserController } from "../github-user/controller";
1414
import { LoggerService } from "../logger/service";
15+
import { MilestoneController } from "../milestone/controller";
1516
import { TeamController } from "../team/controller";
1617
import { DocsMiddleware } from "./middlewares/docs";
1718
import { ErrorMiddleware } from "./middlewares/error";
@@ -44,6 +45,7 @@ export const routingControllersOptions: RoutingControllersOptions = {
4445
GithubUserController,
4546
TeamController,
4647
GithubController,
48+
MilestoneController,
4749
],
4850
middlewares: [
4951
SentryRequestHandlerMiddleware,

api/src/app/types/legacy.ts

+14
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,17 @@ export interface GithubIssue {
6363
html_url: "https://github.com/ZibanPirate/l2t/pull/9";
6464
};
6565
}
66+
67+
export interface GithubMilestone {
68+
html_url: string;
69+
number: number;
70+
title: string;
71+
description: string;
72+
state: "closed" | "open";
73+
open_issues: number;
74+
closed_issues: number;
75+
created_at: string;
76+
updated_at: string;
77+
closed_at: string | null;
78+
due_on: string | null;
79+
}

api/src/github/service.ts

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import { Service } from "typedi";
22

3-
import { GithubIssue, GithubUser } from "../app/types/legacy";
3+
import { GithubIssue, GithubMilestone, GithubUser } from "../app/types/legacy";
44
import { ConfigService } from "../config/service";
55
import { FetchService } from "../fetch/service";
66
import {
77
GeneralGithubQuery,
88
GetUserInput,
99
GitHubListRepositoryIssuesInput,
1010
GitHubListRepositoryLanguagesInput,
11+
GitHubListRepositoryMilestonesInput,
1112
GitHubRateLimitApiResponse,
1213
GitHubUserApiResponse,
1314
ListContributorsResponse,
@@ -108,6 +109,20 @@ export class GithubService {
108109
};
109110
};
110111

112+
public listRepositoryMilestones = async ({
113+
owner,
114+
repo,
115+
}: GitHubListRepositoryMilestonesInput): Promise<GithubMilestone[]> => {
116+
const milestones = await this.fetchService.get<GithubMilestone[]>(
117+
`${this.apiURL}/repos/${owner}/${repo}/milestones`,
118+
{
119+
headers: this.githubToken ? { Authorization: `Token ${this.githubToken}` } : {},
120+
params: { state: "all", per_page: 100 }, // eslint-disable-line camelcase
121+
},
122+
);
123+
return milestones;
124+
};
125+
111126
private githubToken = this.configService.env().GITHUB_TOKEN;
112127
private apiURL = "https://api.github.com";
113128
}

api/src/github/types.ts

+2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ export interface GitHubListRepositoryIssuesInput {
6161

6262
export type GitHubListRepositoryLanguagesInput = GitHubListRepositoryIssuesInput;
6363

64+
export type GitHubListRepositoryMilestonesInput = GitHubListRepositoryIssuesInput;
65+
6466
export interface GitHubRateLimitApiResponse {
6567
resources: {
6668
core: {

api/src/milestone/controller.ts

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { Controller, Get } from "routing-controllers";
2+
import { OpenAPI, ResponseSchema } from "routing-controllers-openapi";
3+
import { Service } from "typedi";
4+
5+
import { GithubService } from "../github/service";
6+
import { GetMilestonesResponseDto } from "./types";
7+
8+
@Service()
9+
@Controller("/Milestones")
10+
export class MilestoneController {
11+
constructor(private readonly githubService: GithubService) {}
12+
13+
@Get("/dzcode")
14+
@OpenAPI({
15+
summary: "Return a list of milestones for all dzcode.io repo",
16+
})
17+
@ResponseSchema(GetMilestonesResponseDto)
18+
public async getMilestones(): Promise<GetMilestonesResponseDto> {
19+
const githubMilestones = await this.githubService.listRepositoryMilestones({
20+
owner: "dzcode-io",
21+
repo: "dzcode.io",
22+
});
23+
return {
24+
// @TODO-ZM: sort milestones based on: status:closed by closedAt,and status:open: dueAt, createdAt
25+
milestones: githubMilestones.map((githubMilestone) => ({
26+
id: `${githubMilestone.number}`,
27+
title: githubMilestone.title,
28+
description: githubMilestone.description,
29+
url: githubMilestone.html_url,
30+
status: githubMilestone.state,
31+
closedIssuesCount: githubMilestone.closed_issues,
32+
openIssuesCount: githubMilestone.open_issues,
33+
createdAt: githubMilestone.created_at,
34+
closedAt: githubMilestone.closed_at || undefined,
35+
dueAt: githubMilestone.due_on || undefined,
36+
})),
37+
};
38+
}
39+
}

api/src/milestone/types.ts

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Model } from "@dzcode.io/models/dist/_base";
2+
import { MilestoneEntity } from "@dzcode.io/models/dist/milestone";
3+
import { Type } from "class-transformer";
4+
import { ValidateNested } from "class-validator";
5+
6+
import { GeneralResponseDto } from "../app/types";
7+
8+
export class GetMilestonesResponseDto extends GeneralResponseDto {
9+
@ValidateNested({ each: true })
10+
@Type(() => MilestoneEntity)
11+
milestones!: Model<MilestoneEntity>[];
12+
}

0 commit comments

Comments
 (0)