Skip to content

Commit 0299850

Browse files
author
iamhyc
committed
feat(pro): init review comments related api
1 parent 43dd13e commit 0299850

File tree

5 files changed

+130
-15
lines changed

5 files changed

+130
-15
lines changed

src/api/base.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@ export interface MisspellingItemSchema {
6161
suggestions: string[]
6262
}
6363

64+
export interface UserInfoSchema {
65+
id: string,
66+
first_name: string,
67+
last_name?: string,
68+
email: string,
69+
}
70+
6471
export interface MemberEntity {
6572
_id: string,
6673
first_name: string,
@@ -111,7 +118,7 @@ export interface ProjectLabelResponseSchema {
111118
}
112119

113120
export interface ProjectUpdateMeta {
114-
users: {id:string, first_name:string, last_name?:string, email:string}[],
121+
users: UserInfoSchema[],
115122
start_ts: number,
116123
end_ts: number,
117124
}
@@ -154,7 +161,7 @@ export interface ProjectMessageResponseSchema {
154161
content: string,
155162
timestamp: number,
156163
user_id: string,
157-
user: {id:string, first_name:string, last_name?:string, email:string},
164+
user: UserInfoSchema,
158165
clientId: string,
159166
}
160167

src/api/extendedBase.ts

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* eslint-disable @typescript-eslint/naming-convention */
2-
import { BaseAPI, Identity } from "./base";
2+
import { BaseAPI, Identity, ResponseSchema, UserInfoSchema } from "./base";
33

44
export interface ProjectLinkedFileProvider {
55
provider: 'project_file',
@@ -12,6 +12,44 @@ export interface UrlLinkedFileProvider {
1212
url: string,
1313
}
1414

15+
export interface CommentThreadMessageSchema {
16+
id: string,
17+
content: string,
18+
timestamp: number,
19+
user_id: string,
20+
room_id?: string,
21+
edited_at?: number,
22+
user: UserInfoSchema,
23+
}
24+
25+
export interface DocumentRangesSchema {
26+
changes: {
27+
id: string,
28+
op: {p:number, i?:string, d?:string},
29+
metadata: {user_id:string, ts:string}, //"ts" is ISO format date string
30+
}[],
31+
comments: {
32+
id: string,
33+
// "c" for quoted text, "t" for threadId
34+
op: {p:number, c:string, t:string},
35+
metadata: {user_id:string, ts:string}, //"ts" is ISO format date string
36+
}[],
37+
}
38+
39+
export interface ExtendedResponseSchema extends ResponseSchema {
40+
threads: {[threadId:string]: {
41+
messages: CommentThreadMessageSchema[],
42+
resolved?: boolean,
43+
resolved_at?: string, //ISO format date string
44+
resolved_by_user_id?: string,
45+
resolved_by_user?: UserInfoSchema,
46+
}},
47+
ranges: {
48+
id: string,//document id
49+
ranges: DocumentRangesSchema,
50+
}[],
51+
}
52+
1553
export class ExtendedBaseAPI extends BaseAPI {
1654
async refreshLinkedFile(identity:Identity, project_id:string, file_id:string) {
1755
this.setIdentity(identity);
@@ -28,4 +66,45 @@ export class ExtendedBaseAPI extends BaseAPI {
2866
return {message};
2967
}, {'X-Csrf-Token': identity.csrfToken});
3068
}
69+
70+
async getAllCommentThreads(identity: Identity, project_id: string) {
71+
this.setIdentity(identity);
72+
return await this.request('GET', `project/${project_id}/threads`, undefined, (res) => {
73+
const threads = JSON.parse(res!);
74+
return {threads};
75+
}) as ExtendedResponseSchema;
76+
}
77+
78+
async getAllDocumentRanges(identity: Identity, project_id: string) {
79+
this.setIdentity(identity);
80+
return await this.request('GET', `project/${project_id}/ranges`, undefined, (res) => {
81+
const ranges = JSON.parse(res!);
82+
return {ranges};
83+
}) as ExtendedResponseSchema;
84+
}
85+
86+
async resolveCommentThread(identity: Identity, project_id: string, thread_id: string) {
87+
this.setIdentity(identity);
88+
return await this.request('POST', `project/${project_id}/thread/${thread_id}/resolve`);
89+
}
90+
91+
async reopenResolvedCommentThread(identity: Identity, project_id: string, thread_id: string) {
92+
this.setIdentity(identity);
93+
return await this.request('POST', `project/${project_id}/thread/${thread_id}/reopen`);
94+
}
95+
96+
async deleteResolvedCommentThread(identity: Identity, project_id: string, doc_id: string, thread_id: string) {
97+
this.setIdentity(identity);
98+
return await this.request('DELETE', `project/${project_id}/doc/${doc_id}/thread/${thread_id}`);
99+
}
100+
101+
async postCommentThreadMessage(identity: Identity, project_id: string, thread_id: string, content: string) {
102+
this.setIdentity(identity);
103+
return await this.request('POST', `project/${project_id}/thread/${thread_id}/messages`, {content});
104+
}
105+
106+
async editCommentThreadMessage(identity: Identity, project_id: string, thread_id: string, message_id: string, content: string) {
107+
this.setIdentity(identity);
108+
return await this.request('POST', `project/${project_id}/thread/${thread_id}/messages/${message_id}/edit`, {content});
109+
}
31110
}

src/api/socketio.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
/* eslint-disable @typescript-eslint/naming-convention */
2-
import { Identity, BaseAPI, ProjectMessageResponseSchema } from './base';
2+
import { Identity, BaseAPI, ProjectMessageResponseSchema, UserInfoSchema } from './base';
33
import { FileEntity, DocumentEntity, FileRefEntity, FileType, FolderEntity, ProjectEntity } from '../core/remoteFileSystemProvider';
44
import { EventBus } from '../utils/eventBus';
55
import { SocketIOAlt } from './socketioAlt';
6+
import { CommentThreadMessageSchema } from './extendedBase';
67

78
export interface UpdateUserSchema {
89
id: string,
@@ -66,6 +67,12 @@ export interface EventsHandler {
6667
onSpellCheckLanguageUpdated?: (language:string) => void,
6768
onCompilerUpdated?: (compiler:string) => void,
6869
onRootDocUpdated?: (rootDocId:string) => void,
70+
// [Server Pro] comment
71+
onCommentThreadResolved?: (threadId:string, userInfo:UserInfoSchema) => void,
72+
onCommentThreadReopen?: (threadId:string) => void,
73+
onCommentThreadDeleted?: (threadId:string) => void,
74+
onCommentThreadMessageReceived?: (threadId:string, message:CommentThreadMessageSchema) => void,
75+
onCommentThreadMessageEdited?: (threadId:string, messageId:string, content:string) => void,
6976
}
7077

7178
type ConnectionScheme = 'Alt' | 'v1' | 'v2';
@@ -260,6 +267,31 @@ export class SocketIOAPI {
260267
handler(rootDocId);
261268
});
262269
break;
270+
case handlers.onCommentThreadResolved:
271+
this.socket.on('resolve-thread', (threadId:string, userInfo:UserInfoSchema) => {
272+
handler(threadId, userInfo);
273+
});
274+
break;
275+
case handlers.onCommentThreadReopen:
276+
this.socket.on('reopen-thread', (threadId:string) => {
277+
handler(threadId);
278+
});
279+
break;
280+
case handlers.onCommentThreadDeleted:
281+
this.socket.on('delete-thread', (threadId:string) => {
282+
handler(threadId);
283+
});
284+
break;
285+
case handlers.onCommentThreadMessageReceived:
286+
this.socket.on('new-comment', (threadId:string, message:CommentThreadMessageSchema) => {
287+
handler(threadId, message);
288+
});
289+
break;
290+
case handlers.onCommentThreadMessageEdited:
291+
this.socket.on('edit-message', (threadId:string, messageId:string, content:string) => {
292+
handler(threadId, messageId, content);
293+
});
294+
break;
263295
default:
264296
break;
265297
}

src/core/remoteFileSystemProvider.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { GlobalStateManager } from '../utils/globalStateManager';
88
import { ClientManager } from '../collaboration/clientManager';
99
import { EventBus } from '../utils/eventBus';
1010
import { SCMCollectionProvider } from '../scm/scmCollectionProvider';
11-
import { ExtendedBaseAPI, ProjectLinkedFileProvider, UrlLinkedFileProvider } from '../api/extendedBase';
11+
import { DocumentRangesSchema, ExtendedBaseAPI, ProjectLinkedFileProvider, UrlLinkedFileProvider } from '../api/extendedBase';
1212

1313
const __OUTPUTS_ID = `${ROOT_NAME}-outputs`;
1414

@@ -34,6 +34,7 @@ export interface DocumentEntity extends FileEntity {
3434
lastVersion?: number,
3535
localCache?: string,
3636
remoteCache?: string,
37+
ranges?: DocumentRangesSchema,
3738
}
3839

3940
export interface FileRefEntity extends FileEntity {
@@ -518,9 +519,10 @@ export class VirtualFileSystem extends vscode.Disposable {
518519
EventBus.fire('fileWillOpenEvent', {uri});
519520
return new TextEncoder().encode(content);
520521
} else {
521-
const res = await this.socket.joinDoc(fileEntity._id);
522-
const content = res.docLines.join('\n');
523-
doc.version = res.version;
522+
const {docLines,version,ranges} = await this.socket.joinDoc(fileEntity._id);
523+
doc.version = version;
524+
doc.ranges = ranges;
525+
const content = docLines.join('\n');
524526
doc.remoteCache = content;
525527
doc.localCache = content;
526528
EventBus.fire('fileWillOpenEvent', {uri});

src/scm/historyViewProvider.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as vscode from 'vscode';
33
import { EventBus } from '../utils/eventBus';
44
import { VirtualFileSystem, parseUri } from '../core/remoteFileSystemProvider';
55
import { OUTPUT_FOLDER_NAME, ROOT_NAME } from '../consts';
6-
import { ProjectLabelResponseSchema } from '../api/base';
6+
import { ProjectLabelResponseSchema, UserInfoSchema } from '../api/base';
77

88
interface HistoryRecord {
99
before?: number,
@@ -13,12 +13,7 @@ interface HistoryRecord {
1313
[toV:number]: {
1414
fromV: number,
1515
timestamp: number,
16-
users: {
17-
id: string,
18-
first_name: string,
19-
last_name?: string,
20-
email: string,
21-
}[]
16+
users: UserInfoSchema[]
2217
}
2318
},
2419
labels: {[version:number]: ProjectLabelResponseSchema[]},

0 commit comments

Comments
 (0)