verify-parse-rest.ts 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import 'dotenv/config';
  2. import { loadConfig } from '../src/config/env.js';
  3. import { ParseRestClient } from '../src/db/parse-rest.client.js';
  4. import { requiredVocClassNames, VOC_PARSE_CLASSES } from '../src/db/parse-rest.schema.js';
  5. const config = loadConfig();
  6. if (config.storageDriver !== 'parse_rest') throw new Error('STORAGE_DRIVER must be parse_rest');
  7. const workspaceId = process.argv[2] || config.auth.defaultWorkspaceId;
  8. const platform = process.argv[3] || 'jd';
  9. const client = new ParseRestClient({
  10. serverUrl: config.parse.serverUrl,
  11. appId: config.parse.appId,
  12. masterKey: config.parse.masterKey,
  13. timeoutMs: config.parse.timeoutMs,
  14. });
  15. const schemaResponse = await client.request<{
  16. results: Array<{
  17. className: string;
  18. classLevelPermissions?: Record<string, Record<string, unknown>>;
  19. }>;
  20. }>('/schemas');
  21. const vocSchemas = schemaResponse.results.filter((schema) => requiredVocClassNames.includes(schema.className));
  22. const operations = ['find', 'get', 'count', 'create', 'update', 'delete', 'addField'];
  23. const masterOnly = vocSchemas.every((schema) => operations.every((operation) => (
  24. Object.keys(schema.classLevelPermissions?.[operation] ?? {}).length === 0
  25. )));
  26. const where = { workspaceId, platform };
  27. const [
  28. ownProducts,
  29. competitorProducts,
  30. competitorDetailsReady,
  31. metrics,
  32. relations,
  33. reviews,
  34. promptConfigs,
  35. defaultModelPrompt,
  36. productKnowledge,
  37. workspace,
  38. completedImport,
  39. ] = await Promise.all([
  40. client.count(VOC_PARSE_CLASSES.product, { ...where, role: 'own' }),
  41. client.count(VOC_PARSE_CLASSES.product, { ...where, role: 'competitor' }),
  42. client.count(VOC_PARSE_CLASSES.product, { ...where, role: 'competitor', source: 'fmode_gateway' }),
  43. client.count(VOC_PARSE_CLASSES.dailyMetric, where),
  44. client.count(VOC_PARSE_CLASSES.productRelation, where),
  45. client.count(VOC_PARSE_CLASSES.review, where),
  46. client.count(VOC_PARSE_CLASSES.promptConfig, { workspaceId }),
  47. client.findOne<{ template?: string; model?: string }>(VOC_PARSE_CLASSES.promptConfig, {
  48. workspaceId,
  49. promptKey: 'global.analysis.defaultModel',
  50. }),
  51. client.count(VOC_PARSE_CLASSES.productKnowledge, { workspaceId }),
  52. client.findOne(VOC_PARSE_CLASSES.workspace, { publicId: workspaceId, status: 'active' }),
  53. client.findOne(VOC_PARSE_CLASSES.importBatch, { workspaceId, platform, status: 'completed' }),
  54. ]);
  55. const publicResponse = await fetch(
  56. `${config.parse.serverUrl.replace(/\/+$/, '')}/classes/${VOC_PARSE_CLASSES.workspace}?limit=1`,
  57. {
  58. headers: { 'X-Parse-Application-Id': config.parse.appId },
  59. signal: AbortSignal.timeout(config.parse.timeoutMs),
  60. },
  61. );
  62. const publicPayload = await publicResponse.json().catch(() => ({})) as { code?: number };
  63. console.log(JSON.stringify({
  64. schemas: {
  65. expected: requiredVocClassNames.length,
  66. actual: vocSchemas.length,
  67. masterOnly,
  68. },
  69. workspaceReady: Boolean(workspace),
  70. completedImport: Boolean(completedImport),
  71. counts: {
  72. ownProducts,
  73. competitorProducts,
  74. competitorDetailsReady,
  75. competitorDetailsPending: competitorProducts - competitorDetailsReady,
  76. products: ownProducts + competitorProducts,
  77. metrics,
  78. relations,
  79. reviews,
  80. },
  81. aiConfiguration: {
  82. promptConfigs,
  83. defaultModel: defaultModelPrompt?.model ?? defaultModelPrompt?.template ?? null,
  84. ready: promptConfigs === 13 && Boolean(defaultModelPrompt),
  85. },
  86. productKnowledge,
  87. publicReadBlocked: !publicResponse.ok,
  88. publicReadStatus: publicResponse.status,
  89. publicReadCode: publicPayload.code ?? null,
  90. }, null, 2));