constants.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /*
  2. * Shared constants for SaaS VOC Cloud Functions
  3. * These constants are shared across all cloud functions
  4. */
  5. // Allowed actions - each action maps to a specific cloud function
  6. const ACTIONS = new Set([
  7. // Context & Workspace
  8. 'context.get', 'workspace.list', 'workspace.member.update',
  9. // Data Source & Import
  10. 'data-source.list', 'import.list', 'audit.list',
  11. // Domestic VOC
  12. 'domestic.snapshot', 'domestic.products.list', 'domestic.product.get', 'domestic.reviews.list', 'domestic.relations.list',
  13. // Sync
  14. 'sync.enqueue', 'sync.jobs.list', 'sync.job.get', 'sync.job.events', 'sync.job.retry', 'sync.job.cancel',
  15. // Analysis
  16. 'analysis.list', 'analysis.create', 'analysis.update',
  17. 'insight-decision.list', 'insight-decision.get', 'insight-decision.create',
  18. // Actions & Alerts
  19. 'action.list', 'action.create', 'action.update',
  20. 'alert.list', 'alert.create', 'alert.update',
  21. // Knowledge
  22. 'knowledge.products.list', 'knowledge.product.upsert', 'knowledge.product.delete',
  23. // Competitor
  24. 'competitor.overview', 'competitor.refresh', 'competitor.history', 'competitor.alerts', 'competitor.impacts',
  25. 'competitor.tasks.list', 'competitor.tasks.create', 'competitor.tasks.update', 'competitor.run.get',
  26. // Listing
  27. 'listing.overview', 'listing.products.list', 'listing.product.get', 'listing.product.score',
  28. 'listing.jd-voc-score.get', 'listing.jd-voc-image-review.run',
  29. 'listing.score-job.create',
  30. 'listing.score-job.list', 'listing.score-job.get', 'listing.score-job.items', 'listing.score-job.retry', 'listing.score-job.cancel',
  31. 'listing.versions.list', 'listing.version.create', 'listing.version.adopt',
  32. // AI
  33. 'ai.status', 'ai.test', 'ai.prompts.list', 'ai.prompt.update', 'ai.chat',
  34. // Upstream
  35. 'upstream.amazon', 'upstream.sorftime', 'upstream.tikhub', 'upstream.domestic',
  36. ]);
  37. // Map actions to Parse class names for generic read operations
  38. const CLASS_BY_READ_ACTION = {
  39. 'workspace.list': 'VocWorkspace',
  40. 'workspace.members.list': 'VocWorkspaceMember',
  41. 'data-source.list': 'VocSourceConnection',
  42. 'import.list': 'VocImportBatch',
  43. 'audit.list': 'VocAuditLog',
  44. 'domestic.products.list': 'VocProduct',
  45. 'domestic.reviews.list': 'VocReview',
  46. 'domestic.relations.list': 'VocProductRelation',
  47. 'sync.jobs.list': 'VocSyncJob',
  48. 'sync.job.events': 'VocSyncJobEvent',
  49. 'analysis.list': 'VocAnalysisRun',
  50. 'insight-decision.list': 'VocInsightDecision',
  51. 'action.list': 'VocActionItem',
  52. 'alert.list': 'VocAlert',
  53. 'knowledge.products.list': 'VocProductKnowledge',
  54. 'ai.prompts.list': 'VocPromptConfig',
  55. 'listing.products.list': 'VocListingSourceSnapshot',
  56. 'listing.score-job.list': 'VocListingScoreJob',
  57. 'listing.versions.list': 'VocListingVersion',
  58. 'competitor.tasks.list': 'VocCompetitorOptimizationTask',
  59. };
  60. // Roles that can perform write operations
  61. const WRITE_ROLES = new Set(['owner', 'admin', 'editor']);
  62. const ADMIN_ROLES = new Set(['owner', 'admin']);
  63. // Fields used for product scope filtering
  64. const PRODUCT_SCOPE_FIELDS = {
  65. VocProduct: 'productId',
  66. VocReview: 'productId',
  67. VocDailyMetric: 'productId',
  68. VocProductRelation: 'ownProductId',
  69. VocProductKnowledge: 'productId',
  70. VocListingSourceSnapshot: 'productId',
  71. VocListingCurrentScore: 'productId',
  72. VocListingVersion: 'productId',
  73. VocCompetitorListingSnapshot: 'productId',
  74. VocCompetitorListingChange: 'productId',
  75. VocCompetitorOptimizationTask: 'ownProductId',
  76. };
  77. // Fields used for read filtering by class
  78. const READ_FILTER_FIELDS = {
  79. VocProduct: ['platform', 'role'],
  80. VocReview: ['platform', 'productId'],
  81. VocProductRelation: ['platform', 'ownProductId', 'competitorProductId'],
  82. VocSyncJob: ['status', 'platform'],
  83. VocSyncJobEvent: ['jobId', 'eventType'],
  84. VocAnalysisRun: ['status', 'analysisType', 'targetKind'],
  85. VocInsightDecision: ['sourceAnalysisId', 'sourceInsightId', 'isCurrent'],
  86. VocActionItem: ['status', 'actionType', 'productKey'],
  87. VocAlert: ['status', 'alertType', 'productKey'],
  88. VocProductKnowledge: ['productId', 'productKey', 'status'],
  89. VocListingSourceSnapshot: ['platform', 'productId', 'isCurrent', 'scoreStatus', 'aiScoreStatus', 'coverageStatus'],
  90. VocListingScoreJob: ['status', 'platform'],
  91. VocListingVersion: ['productId', 'status'],
  92. VocCompetitorListingSnapshot: ['platform', 'productId'],
  93. VocCompetitorListingChange: ['platform', 'productId'],
  94. VocCompetitorOptimizationTask: ['status', 'ownProductId'],
  95. };
  96. // Allowed paths for upstream providers
  97. const UPSTREAM_PATHS = {
  98. amazon: [
  99. /^\/test$/,
  100. /^\/orders(?:\/[A-Za-z0-9._~-]+)?(?:\/items)?$/,
  101. /^\/sales\/orderMetrics$/,
  102. /^\/catalog\/items(?:\/[A-Za-z0-9._~-]+)?$/,
  103. /^\/listings\/items\/[A-Za-z0-9._~-]+(?:\/[A-Za-z0-9._~-]+)?$/,
  104. /^\/customerFeedback\/items\/[A-Za-z0-9._~-]+\/reviews\/(?:topics|trends|browseNode)$/,
  105. /^\/sellers\/marketplaceParticipations$/,
  106. /^\/returns$/,
  107. ],
  108. sorftime: [
  109. /^\/api\/(?:CategoryTree|CategoryRequest|CategoryProducts|ProductQuery|ProductRequest|AsinSalesVolume|SimilarProductRealtimeRequest|SimilarProductRealtimeRequestStatusQuery|SimilarProductRealtimeRequestCollection|ProductReviewsQuery|MonitorQuery|KeywordQuery|ASINRequestKeyword|KeywordProductRanking|KeywordSearchResultTrend|ProductVariationHistory)$/,
  110. ],
  111. tikhub: [
  112. /^\/v1\/(?:tiktok|instagram)\/[A-Za-z0-9._~/-]+$/,
  113. ],
  114. domestic: [
  115. /^\/jd\/(?:get-item-detail|get-item-comments|search-item-list)\/v1$/,
  116. ],
  117. };
  118. // Allowed operations for upstream providers
  119. const UPSTREAM_OPERATIONS = {
  120. amazon: new Set(['get', 'post']),
  121. sorftime: new Set(['get', 'post', 'forward']),
  122. tikhub: new Set(['get', 'post', 'forward']),
  123. domestic: new Set(['gateway.get']),
  124. };
  125. // Fields excluded from body data for security
  126. const EXCLUDED_BODY_FIELDS = [
  127. 'action', 'workspaceId', 'platform', 'payload', 'idempotencyKey',
  128. 'userId', 'jobId', 'productId', 'decisionId', 'analysisId',
  129. 'actionId', 'alertId', 'taskId', 'runId', 'versionId',
  130. ];
  131. // Fields excluded from storage data
  132. const EXCLUDED_STORAGE_FIELDS = ['action', 'workspaceId', 'userId'];
  133. // Cloud function mapping - action prefix to function name
  134. const ACTION_TO_FUNCTION = {
  135. // Context & Workspace
  136. 'context': 'vContext',
  137. 'workspace': 'vContext',
  138. // Domestic VOC
  139. 'domestic': 'vDomesticVoc',
  140. 'data-source': 'vDomesticVoc',
  141. 'import': 'vDomesticVoc',
  142. 'audit': 'vDomesticVoc',
  143. // Sync
  144. 'sync': 'vSync',
  145. // Competitor
  146. 'competitor': 'vCompetitor',
  147. // Listing
  148. 'listing.product': 'vListing',
  149. 'listing.overview': 'vListing',
  150. 'listing.products': 'vListing',
  151. // Listing Job
  152. 'listing.score-job': 'vListingJob',
  153. 'listing.version': 'vListingJob',
  154. // Analysis
  155. 'analysis': 'vAnalysis',
  156. 'insight-decision': 'vAnalysis',
  157. // Actions
  158. 'action': 'vActions',
  159. 'alert': 'vActions',
  160. // Knowledge
  161. 'knowledge': 'vKnowledge',
  162. // AI
  163. 'ai': 'vAI',
  164. // Upstream
  165. 'upstream': 'vUpstream',
  166. };
  167. /*
  168. // module.exports = {
  169. // ACTIONS,
  170. // CLASS_BY_READ_ACTION,
  171. // WRITE_ROLES,
  172. // ADMIN_ROLES,
  173. // PRODUCT_SCOPE_FIELDS,
  174. // READ_FILTER_FIELDS,
  175. // UPSTREAM_PATHS,
  176. // UPSTREAM_OPERATIONS,
  177. // EXCLUDED_BODY_FIELDS,
  178. // EXCLUDED_STORAGE_FIELDS,
  179. // ACTION_TO_FUNCTION,
  180. // };
  181. */