Skip to content

Commit 37ab5a7

Browse files
feat: add orderBy support to chat.getMessages (#34)
* feat: add orderBy support to chat.getMessages * refactor: consolidate message listing logic in ChatService
1 parent 28116a9 commit 37ab5a7

4 files changed

Lines changed: 59 additions & 40 deletions

File tree

gemini-extension.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
{
22
"name": "google-workspace",
3-
"version": "DEV",
3+
"version": "0.0.2",
44
"contextFileName": "workspace-server${/}WORKSPACE-Context.md",
55
"mcpServers": {
66
"google-workspace": {
77
"program": "./workspace-server/dist/index.js",
88
"command": "node",
9-
"args": ["scripts${/}start.js"],
9+
"args": [
10+
"scripts${/}start.js"
11+
],
1012
"cwd": "${extensionPath}"
1113
}
1214
}
13-
}
15+
}

workspace-server/src/__tests__/services/ChatService.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,33 @@ describe('ChatService', () => {
354354
const response = JSON.parse(result.content[0].text);
355355
expect(response.messages).toEqual(mockMessages);
356356
});
357+
358+
it('should pass orderBy to the API', async () => {
359+
const mockMessages = [
360+
{ name: 'spaces/space1/messages/msg1', text: 'Hello' },
361+
];
362+
363+
mockChatAPI.spaces.messages.list.mockResolvedValue({
364+
data: {
365+
messages: mockMessages,
366+
},
367+
});
368+
369+
const result = await chatService.getMessages({
370+
spaceName: 'spaces/space1',
371+
orderBy: 'createTime desc',
372+
});
373+
374+
expect(mockChatAPI.spaces.messages.list).toHaveBeenCalledWith({
375+
parent: 'spaces/space1',
376+
pageSize: undefined,
377+
pageToken: undefined,
378+
orderBy: 'createTime desc',
379+
});
380+
381+
const response = JSON.parse(result.content[0].text);
382+
expect(response.messages).toEqual(mockMessages);
383+
});
357384
});
358385

359386
describe('sendDm', () => {

workspace-server/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,7 @@ async function main() {
470470
unreadOnly: z.boolean().optional().describe('Whether to return only unread messages.'),
471471
pageSize: z.number().optional().describe('The maximum number of messages to return.'),
472472
pageToken: z.string().optional().describe('The token for the next page of results.'),
473+
orderBy: z.string().optional().describe('The order to list messages in (e.g., "createTime desc").'),
473474
}
474475
},
475476
chatService.getMessages

workspace-server/src/services/ChatService.ts

Lines changed: 26 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,12 @@ export class ChatService {
176176
}
177177
}
178178

179-
public getMessages = async ({ spaceName, unreadOnly, pageSize, pageToken }: { spaceName: string, unreadOnly?: boolean, pageSize?: number, pageToken?: string }) => {
179+
public getMessages = async ({ spaceName, unreadOnly, pageSize, pageToken, orderBy }: { spaceName: string, unreadOnly?: boolean, pageSize?: number, pageToken?: string, orderBy?: string }) => {
180180
logToFile(`Listing messages for space: ${spaceName}`);
181181
try {
182182
const chat = await this.getChatClient();
183+
let filter: string | undefined;
184+
183185
if (unreadOnly) {
184186
const people = await this.getPeopleClient();
185187
const person = await people.people.get({
@@ -203,47 +205,33 @@ export class ChatService {
203205

204206
const lastReadTime = currentUserMember?.lastReadTime;
205207

206-
if (!lastReadTime) {
208+
if (lastReadTime) {
209+
filter = `createTime > "${lastReadTime}"`;
210+
} else {
207211
logToFile(`No last read time found for user in space: ${spaceName}`);
208-
// This can happen if the user has never read messages in the space.
209-
// In this case, all messages are unread.
210-
const res = await chat.spaces.messages.list({ parent: spaceName, pageSize, pageToken });
211-
const messages = res.data.messages || [];
212-
logToFile(`Successfully listed ${messages.length} unread messages for space: ${spaceName}`);
213-
return { content: [{ type: "text" as const, text: JSON.stringify({ messages, nextPageToken: res.data.nextPageToken }) }] };
214212
}
213+
}
215214

216-
const res = await chat.spaces.messages.list({
217-
parent: spaceName,
218-
filter: `createTime > "${lastReadTime}"`,
219-
pageSize,
220-
pageToken,
221-
});
215+
const res = await chat.spaces.messages.list({
216+
parent: spaceName,
217+
filter,
218+
pageSize,
219+
pageToken,
220+
orderBy,
221+
});
222222

223-
const messages = res.data.messages || [];
224-
logToFile(`Successfully listed ${messages.length} unread messages for space: ${spaceName}`);
225-
return {
226-
content: [{
227-
type: "text" as const,
228-
text: JSON.stringify({ messages, nextPageToken: res.data.nextPageToken })
229-
}]
230-
};
223+
const messages = res.data.messages || [];
224+
const logMessage = unreadOnly
225+
? `Successfully listed ${messages.length} unread messages for space: ${spaceName}`
226+
: `Successfully listed ${messages.length} messages for space: ${spaceName}`;
227+
logToFile(logMessage);
231228

232-
} else {
233-
const res = await chat.spaces.messages.list({
234-
parent: spaceName,
235-
pageSize,
236-
pageToken,
237-
});
238-
const messages = res.data.messages || [];
239-
logToFile(`Successfully listed ${messages.length} messages for space: ${spaceName}`);
240-
return {
241-
content: [{
242-
type: "text" as const,
243-
text: JSON.stringify({ messages, nextPageToken: res.data.nextPageToken })
244-
}]
245-
};
246-
}
229+
return {
230+
content: [{
231+
type: "text" as const,
232+
text: JSON.stringify({ messages, nextPageToken: res.data.nextPageToken })
233+
}]
234+
};
247235
} catch (error) {
248236
const errorMessage = error instanceof Error ? error.message : String(error);
249237
logToFile(`Error during chat.getMessages: ${errorMessage}`);
@@ -263,6 +251,7 @@ export class ChatService {
263251
}
264252
}
265253

254+
266255
public sendDm = async ({ email, message }: { email: string, message: string }) => {
267256
logToFile(`chat.sendDm called with: email=${email}, message=${message}`);
268257
try {

0 commit comments

Comments
 (0)