Skip to content

Commit e5ecb76

Browse files
committed
Merge branch 'master' of https://github.com/cangzhang/coding-vscode into feat/create-mr
2 parents fb5929d + a202e85 commit e5ecb76

25 files changed

+1376
-76
lines changed

.eslintrc.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@ module.exports = {
1111
'@typescript-eslint/no-explicit-any': 0,
1212
'@typescript-eslint/explicit-module-boundary-types': 0,
1313
'@typescript-eslint/no-non-null-assertion': 0,
14+
'no-case-declarations': 0,
1415
},
1516
};

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@
133133
},
134134
"dependencies": {
135135
"@risingstack/react-easy-state": "^6.3.0",
136+
"dayjs": "^1.9.6",
136137
"got": "^11.7.0",
137138
"keytar": "^7.0.0",
138139
"module-alias": "^2.2.2",

src/codingServer.ts

Lines changed: 218 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import {
99
IRepoListResponse,
1010
IMRDiffResponse,
1111
IMRDetailResponse,
12+
IMRActivitiesResponse,
13+
IMRReviewersResponse,
1214
ICreateMRBody,
1315
ICreateMRResp,
1416
IBranchListResp,
@@ -41,7 +43,7 @@ export class CodingServer {
4143
private _pendingStates = new Map<string, string[]>();
4244
private _codeExchangePromises = new Map<string, Promise<AuthSuccessResult>>();
4345

44-
private _loggedIn: boolean = false;
46+
private _loggedIn = false;
4547
private _context: vscode.ExtensionContext;
4648
private _session: ISessionData | null = null;
4749

@@ -238,6 +240,14 @@ export class CodingServer {
238240
return result?.[0];
239241
}
240242

243+
public getApiPrefix() {
244+
const repoInfo = this._context.workspaceState.get(`repoInfo`) as IRepoInfo;
245+
if (!repoInfo?.team) {
246+
throw new Error(`team not exist`);
247+
}
248+
return `https://${repoInfo.team}.coding.net/api/user/${this._session?.user?.team}/project/${repoInfo.project}/depot/${repoInfo.repo}`;
249+
}
250+
241251
public async getMRList(repo?: string, status?: string): Promise<CodingResponse> {
242252
try {
243253
const repoInfo = this._context.workspaceState.get(`repoInfo`) as IRepoInfo;
@@ -300,20 +310,13 @@ export class CodingServer {
300310

301311
public async getMRDiff(iid: number) {
302312
try {
303-
const repoInfo = this._context.workspaceState.get(`repoInfo`) as IRepoInfo;
304-
if (!repoInfo?.team) {
305-
throw new Error(`team not exist`);
306-
}
307-
313+
const url = this.getApiPrefix();
308314
const diff: IMRDiffResponse = await got
309-
.get(
310-
`https://${repoInfo.team}.coding.net/api/user/${this._session?.user?.team}/project/${repoInfo.project}/depot/${repoInfo.repo}/git/merge/${iid}/diff`,
311-
{
312-
searchParams: {
313-
access_token: this._session?.accessToken,
314-
},
315+
.get(`${url}/git/merge/${iid}/diff`, {
316+
searchParams: {
317+
access_token: this._session?.accessToken,
315318
},
316-
)
319+
})
317320
.json();
318321
if (diff.code) {
319322
return Promise.reject(diff);
@@ -326,20 +329,13 @@ export class CodingServer {
326329

327330
public async getMRDetail(iid: string) {
328331
try {
329-
const repoInfo = this._context.workspaceState.get(`repoInfo`) as IRepoInfo;
330-
if (!repoInfo?.team) {
331-
throw new Error(`team not exist`);
332-
}
333-
332+
const url = this.getApiPrefix();
334333
const resp: IMRDetailResponse = await got
335-
.get(
336-
`https://${repoInfo.team}.coding.net/api/user/${this._session?.user?.team}/project/${repoInfo.project}/depot/${repoInfo.repo}/git/merge/${iid}/detail`,
337-
{
338-
searchParams: {
339-
access_token: this._session?.accessToken,
340-
},
334+
.get(`${url}/git/merge/${iid}/detail`, {
335+
searchParams: {
336+
access_token: this._session?.accessToken,
341337
},
342-
)
338+
})
343339
.json();
344340

345341
if (resp.code) {
@@ -352,6 +348,203 @@ export class CodingServer {
352348
}
353349
}
354350

351+
public async getMRActivities(iid: string) {
352+
try {
353+
const url = this.getApiPrefix();
354+
const result: IMRActivitiesResponse = await got
355+
.get(`${url}/git/merge/${iid}/activities`, {
356+
searchParams: {
357+
access_token: this._session?.accessToken,
358+
},
359+
})
360+
.json();
361+
362+
if (result.code) {
363+
return Promise.reject(result);
364+
}
365+
return result;
366+
} catch (err) {
367+
return Promise.reject(err);
368+
}
369+
}
370+
371+
public async getMRReviewers(iid: string) {
372+
try {
373+
const url = this.getApiPrefix();
374+
const result: IMRReviewersResponse = await got
375+
.get(`${url}/git/merge/${iid}/reviewers`, {
376+
searchParams: {
377+
access_token: this._session?.accessToken,
378+
},
379+
})
380+
.json();
381+
382+
if (result.code) {
383+
return Promise.reject(result);
384+
}
385+
return result;
386+
} catch (err) {
387+
return Promise.reject(err);
388+
}
389+
}
390+
391+
public async getMRComments(iid: string) {
392+
try {
393+
const url = this.getApiPrefix();
394+
const result: CodingResponse = await got
395+
.get(`${url}/git/merge/${iid}/comments`, {
396+
searchParams: {
397+
access_token: this._session?.accessToken,
398+
},
399+
})
400+
.json();
401+
402+
if (result.code) {
403+
return Promise.reject(result);
404+
}
405+
return result;
406+
} catch (err) {
407+
return Promise.reject(err);
408+
}
409+
}
410+
411+
public async closeMR(iid: string) {
412+
try {
413+
const url = this.getApiPrefix();
414+
const result: CodingResponse = await got
415+
.post(`${url}/git/merge/${iid}/refuse`, {
416+
searchParams: {
417+
access_token: this._session?.accessToken,
418+
},
419+
})
420+
.json();
421+
422+
if (result.code) {
423+
return Promise.reject(result);
424+
}
425+
return result;
426+
} catch (err) {
427+
return Promise.reject(err);
428+
}
429+
}
430+
431+
public async approveMR(iid: string) {
432+
try {
433+
const url = this.getApiPrefix();
434+
const result: CodingResponse = await got
435+
.post(`${url}/git/merge/${iid}/good`, {
436+
searchParams: {
437+
access_token: this._session?.accessToken,
438+
},
439+
})
440+
.json();
441+
442+
if (result.code) {
443+
return Promise.reject(result);
444+
}
445+
return result;
446+
} catch (err) {
447+
return Promise.reject(err);
448+
}
449+
}
450+
451+
public async disapproveMR(iid: string) {
452+
try {
453+
const url = this.getApiPrefix();
454+
const result: CodingResponse = await got
455+
.delete(`${url}/git/merge/${iid}/good`, {
456+
searchParams: {
457+
access_token: this._session?.accessToken,
458+
},
459+
})
460+
.json();
461+
462+
if (result.code) {
463+
return Promise.reject(result);
464+
}
465+
return result;
466+
} catch (err) {
467+
return Promise.reject(err);
468+
}
469+
}
470+
471+
public async mergeMR(iid: string) {
472+
try {
473+
const url = this.getApiPrefix();
474+
const result: CodingResponse = await got
475+
.post(`${url}/git/merge/${iid}/merge`, {
476+
searchParams: {
477+
access_token: this._session?.accessToken,
478+
},
479+
headers: {
480+
'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
481+
},
482+
})
483+
.json();
484+
485+
if (result.code) {
486+
return Promise.reject(result);
487+
}
488+
return result;
489+
} catch (err) {
490+
return Promise.reject(err);
491+
}
492+
}
493+
494+
public async updateMRTitle(iid: string, title: string) {
495+
try {
496+
const url = this.getApiPrefix();
497+
const result: CodingResponse = await got
498+
.put(`${url}/git/merge/${iid}/update-title`, {
499+
searchParams: {
500+
access_token: this._session?.accessToken,
501+
title,
502+
},
503+
headers: {
504+
'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
505+
},
506+
})
507+
.json();
508+
509+
if (result.code) {
510+
return Promise.reject(result);
511+
}
512+
return result;
513+
} catch (err) {
514+
return Promise.reject(err);
515+
}
516+
}
517+
518+
public async commentMR(mrId: number, comment: string) {
519+
try {
520+
const url = this.getApiPrefix();
521+
const result: CodingResponse = await got
522+
.post(`${url}/git/line_notes`, {
523+
searchParams: {
524+
access_token: this._session?.accessToken,
525+
line: 0,
526+
change_type: 0,
527+
position: 0,
528+
content: comment,
529+
noteable_type: 'MergeRequestBean',
530+
noteable_id: mrId,
531+
parent_id: 0,
532+
},
533+
headers: {
534+
'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
535+
},
536+
})
537+
.json();
538+
539+
if (result.code) {
540+
return Promise.reject(result);
541+
}
542+
return result;
543+
} catch (err) {
544+
return Promise.reject(err);
545+
}
546+
}
547+
355548
public async getRemoteFileContent(path: string) {
356549
try {
357550
const repoInfo = this._context.workspaceState.get(`repoInfo`) as IRepoInfo;

src/extension.ts

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { uriHandler, CodingServer } from 'src/codingServer';
55
import { Panel } from 'src/panel';
66
import { IFileNode, MRTreeDataProvider } from 'src/tree/mrTree';
77
import { ReleaseTreeDataProvider } from 'src/tree/releaseTree';
8-
import { IRepoInfo, IMRWebViewDetail } from 'src/typings/commonTypes';
8+
import { IRepoInfo, IMRWebViewDetail, ISessionData } from 'src/typings/commonTypes';
99
import { GitService } from 'src/common/gitService';
1010

1111
export async function activate(context: vscode.ExtensionContext) {
@@ -46,12 +46,22 @@ export async function activate(context: vscode.ExtensionContext) {
4646
context.subscriptions.push(vscode.window.registerUriHandler(uriHandler));
4747
context.subscriptions.push(
4848
vscode.commands.registerCommand('codingPlugin.showMROverview', async (mr: IMRWebViewDetail) => {
49-
Panel.createOrShow(context);
50-
const resp = await codingSrv.getMRDetail(mr.iid);
51-
mr.data = resp.data.merge_request;
52-
Panel.currentPanel?.broadcast(`action.UPDATE_CURRENT_MR`, {
53-
...mr,
54-
data: resp.data.merge_request,
49+
Panel.createOrShow(context, codingSrv);
50+
codingSrv.getMRDetail(mr.iid).then((detailResp) => {
51+
Panel.currentPanel?.broadcast(`UPDATE_CURRENT_MR`, {
52+
...mr,
53+
data: detailResp.data,
54+
user: context.workspaceState.get(`session`, {} as ISessionData)?.user,
55+
});
56+
});
57+
codingSrv.getMRActivities(mr.iid).then((activityResp) => {
58+
Panel.currentPanel?.broadcast(`UPDATE_MR_ACTIVITIES`, activityResp.data);
59+
});
60+
codingSrv.getMRReviewers(mr.iid).then((reviewerResp) => {
61+
Panel.currentPanel?.broadcast(`mr.update.reviewers`, reviewerResp.data);
62+
});
63+
codingSrv.getMRComments(mr.iid).then((commentResp) => {
64+
Panel.currentPanel?.broadcast(`mr.udpate.comments`, commentResp.data);
5565
});
5666
}),
5767
);
@@ -179,7 +189,7 @@ export async function activate(context: vscode.ExtensionContext) {
179189
// Make sure we register a serializer in activation event
180190
vscode.window.registerWebviewPanelSerializer(Panel.viewType, {
181191
async deserializeWebviewPanel(webviewPanel: vscode.WebviewPanel, state: any) {
182-
Panel.revive(webviewPanel, context.extensionUri, context.extensionPath);
192+
Panel.revive(webviewPanel, codingSrv, context.extensionUri, context.extensionPath);
183193
},
184194
});
185195
}

0 commit comments

Comments
 (0)