Skip to content

Commit 0783955

Browse files
committed
fix(feishu): surface API errors in merge_forward message parsing
1 parent 54d41da commit 0783955

2 files changed

Lines changed: 65 additions & 7 deletions

File tree

packages/cli/src/services/feishu/gateway.test.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,62 @@ describe('FeishuGateway - Message Parsing', () => {
523523
expect(receivedMsg.text).toContain('[图片_1]');
524524
expect(receivedMsg.text).toContain('[图片_2]');
525525
});
526+
527+
it('correctly reports error when fetching merged_forward fails', async () => {
528+
await gateway.connect();
529+
530+
const mockFetchError = (body: any) => ({
531+
ok: true,
532+
json: async () => body,
533+
});
534+
535+
const fetchMock = vi.fn().mockImplementation(async (url: string) => {
536+
if (url.includes('/merged_forward')) {
537+
return mockFetchError({
538+
code: 99991403,
539+
msg: 'No permission for merged_forward API',
540+
});
541+
}
542+
if (url.includes('/tenant_access_token')) {
543+
return mockFetchError({
544+
tenant_access_token: 't-mock-token',
545+
expire: 7200,
546+
});
547+
}
548+
return mockFetchError({ code: 0 });
549+
});
550+
551+
vi.stubGlobal('fetch', fetchMock);
552+
553+
const mockEvent = {
554+
event: {
555+
message: {
556+
message_id: 'om_merge_error',
557+
message_type: 'merge_forward',
558+
content: 'Merged with error',
559+
chat_id: 'oc_456',
560+
chat_type: 'p2p',
561+
},
562+
sender: {
563+
sender_id: {
564+
open_id: 'ou_789',
565+
},
566+
},
567+
},
568+
};
569+
570+
let receivedMsg: any = null;
571+
gateway.onMessage = async (msg) => {
572+
receivedMsg = msg;
573+
return null;
574+
};
575+
576+
await messageCallback(mockEvent);
577+
578+
expect(receivedMsg).not.toBeNull();
579+
expect(receivedMsg.messageType).toBe('merge_forward');
580+
expect(receivedMsg.text).toContain('原因: 飞书接口返回错误 (code: 99991403): No permission for merged_forward API');
581+
});
526582
});
527583

528584
// ---------------------------------------------------------------------------

packages/cli/src/services/feishu/gateway.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -622,10 +622,12 @@ export class FeishuGateway {
622622
/**
623623
* 获取合并转发消息的子消息列表
624624
*/
625-
async getMergedForwardMessages(messageId: string): Promise<any[]> {
625+
async getMergedForwardMessages(messageId: string): Promise<{ items: any[]; error?: string }> {
626626
try {
627627
const token = await this.getTenantToken();
628-
if (!token) return [];
628+
if (!token) {
629+
return { items: [], error: '无法获取 tenant_access_token' };
630+
}
629631

630632
const res = await fetch(
631633
`${this.apiBaseUrl}/open-apis/im/v1/messages/${encodeURIComponent(messageId)}/merged_forward`,
@@ -638,14 +640,14 @@ export class FeishuGateway {
638640

639641
if (data.code !== 0) {
640642
dlog(`[Feishu] getMergedForwardMessages(${messageId}) failed: ${JSON.stringify(data)}`);
641-
return [];
643+
return { items: [], error: `飞书接口返回错误 (code: ${data.code}): ${data.msg || '未知错误'}` };
642644
}
643645

644646
const items = data.data?.items || data.data?.messages || (Array.isArray(data.data) ? data.data : []);
645-
return items;
647+
return { items };
646648
} catch (e: any) {
647649
dlog(`[Feishu] getMergedForwardMessages(${messageId}) threw: ${e?.message || e}`);
648-
return [];
650+
return { items: [], error: `网络或未知请求异常: ${e?.message || e}` };
649651
}
650652
}
651653

@@ -865,7 +867,7 @@ export class FeishuGateway {
865867
if (msgType === 'merge_forward') {
866868
try {
867869
dlog(`Received merge_forward message, fetching sub-messages for ${message.message_id}...`);
868-
const subMessages = await this.getMergedForwardMessages(message.message_id);
870+
const { items: subMessages, error } = await this.getMergedForwardMessages(message.message_id);
869871
if (subMessages && subMessages.length > 0) {
870872
const parts: string[] = [];
871873
parts.push(`📢 **[合并转发的消息记录]**`);
@@ -890,7 +892,7 @@ export class FeishuGateway {
890892
}
891893
text = parts.join('\n');
892894
} else {
893-
text = `[合并转发消息,但未获取到任何子消息内容]`;
895+
text = `[合并转发消息,但未获取到任何子消息内容${error ? `。原因: ${error}` : ''}]`;
894896
}
895897
} catch (err: any) {
896898
derror(`Failed to parse merge_forward message:`, err);

0 commit comments

Comments
 (0)