sync.controller.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import type { Request, Response } from 'express';
  2. import { AppError } from '../../../../shared/errors/app-error.js';
  3. import { sendSuccess } from '../../../../shared/http/response.js';
  4. import { checkParseDatabase } from '../../../../shared/db/parse-health.service.js';
  5. import { reconcileGroupCatalog } from '../services/sync.service.js';
  6. import { backfillGroupChatsFromMessages } from '../services/groups.service.js';
  7. import { getQiWeConfig } from '../services/qiwe-api.service.js';
  8. export async function handleSyncGroups(_req: Request, res: Response): Promise<void> {
  9. const config = getQiWeConfig();
  10. if (!config.token || !config.guid) {
  11. throw new AppError(500, 'MISSING_CONFIG', '请在 .env 中配置 QIWE_TOKEN 和 QIWE_GUID');
  12. }
  13. const dbBefore = await checkParseDatabase();
  14. if (!dbBefore.connected) {
  15. throw new AppError(503, 'DB_UNAVAILABLE', dbBefore.error || '无法连接 Parse 数据库', { database: dbBefore });
  16. }
  17. const catalog = await reconcileGroupCatalog();
  18. const dbAfter = await checkParseDatabase();
  19. sendSuccess(res, { catalog, sync: catalog.rooms, database: dbAfter });
  20. if (catalog.rooms.errors.length > 0) {
  21. console.warn(`[Sync] 部分群写入失败: ${catalog.rooms.errors.length} 条`);
  22. }
  23. }
  24. /** 按 Message 表中的 roomId 补全 GroupChat,不调用企微接口 */
  25. export async function handleBackfillGroupsFromMessages(_req: Request, res: Response): Promise<void> {
  26. const config = getQiWeConfig();
  27. if (!config.guid) {
  28. throw new AppError(500, 'MISSING_CONFIG', '请在 .env 中配置 QIWE_GUID');
  29. }
  30. const created = await backfillGroupChatsFromMessages(config.guid);
  31. sendSuccess(res, { created });
  32. }