t65-backend-detail-contract.mjs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. /** Cross-repo contract guard for issue 65 detail endpoints (cockpit 免鉴权只读域). */
  2. import assert from 'node:assert/strict'
  3. import fs from 'node:fs'
  4. const root = 'E:/pipe-ner-server/pipe-network-service/'
  5. const read = (p) => fs.readFileSync(root + p, 'utf8')
  6. const entity = read('zksy-admin/src/main/java/com/zksy/web/controller/cockpit/CockpitEntityDetailController.java')
  7. const event = read('zksy-admin/src/main/java/com/zksy/web/controller/cockpit/CockpitEventDetailController.java')
  8. const order = read('zksy-admin/src/main/java/com/zksy/web/controller/cockpit/CockpitWorkOrderDetailController.java')
  9. const eventService = read('zksy-system/src/main/java/com/zksy/cockpit/event/CockpitEventDetailService.java')
  10. const entityService = read('zksy-system/src/main/java/com/zksy/cockpit/entity/CockpitEntityDetailService.java')
  11. const alarmMapper = read('zksy-system/src/main/resources/mapper/base/AlarmOperationsMapper.xml')
  12. // 三个详情路由都在免鉴权的 /api/cockpit/v1 下
  13. assert.ok(entity.includes('/api/cockpit/v1/entities/{entityId}/detail'))
  14. assert.ok(event.includes('/api/cockpit/v1'))
  15. assert.ok(event.includes('/events/{eventId}/detail'))
  16. assert.ok(order.includes('/work-orders/{orderId}/detail'))
  17. assert.ok(order.includes('workOrders.getDetail'), '工单详情必须用无鉴权的 getDetail')
  18. // 事件详情不得再**调用**需要登录用户的移动端方法(注释里说明原因不算)。
  19. const calls = eventService.replace(/\/\*[\s\S]*?\*\//g, '').replace(/^\s*\/\/.*$/gm, '')
  20. assert.ok(!calls.includes('getMobileWarningDetail('))
  21. assert.ok(!calls.includes('.mobileDetail('))
  22. assert.ok(eventService.includes('selectCockpitDetail'), '报警详情必须走无范围裁剪的查询')
  23. // 预警各分区都从底层 mapper 取(不经 requireVisible)
  24. assert.ok(eventService.includes('selectDisposalList'))
  25. assert.ok(eventService.includes('selectAlarmListByWarningId'))
  26. assert.ok(eventService.includes('selectByWarningId'))
  27. // 无范围报警详情 SQL 不得包含按用户的 scope 片段
  28. const cockpitSql = alarmMapper.split('<select id="selectCockpitDetail"')[1].split('</select>')[0]
  29. assert.ok(!cockpitSql.includes('mobileScope'))
  30. assert.ok(!cockpitSql.includes('AlarmReviewMapper.scope'))
  31. for (const category of ['PIPE_NETWORK', 'WATER_PLANT', 'PUMP_STATION', 'ENGINEERING_FACILITY', 'EMERGENCY_RESOURCE', 'HAZARD', 'PROTECTION_TARGET']) {
  32. assert.ok(entityService.includes(category), '实体详情缺类别: ' + category)
  33. }
  34. console.log('t65-backend-detail-contract: 18/18')