feat(capability): extract CapabilityService — AGENTS.md rule #26 compliance

New module backend/capability/:
- CapabilityService: getCapabilities(entry point for frontend),
  plus public helpers (isAccountNormal/isIdentityVerified/isProfileApproved/
  isSearching/isBaseEligible/hasLocalEligibility/entry builder)
- CapabilityController: GET /api/v1/capabilities endpoint

HomeApplicationService refactored:
- Injects CapabilityService, delegates buildCapabilities()
  and QuickEntry construction + recommendation eligibility checks
- Removes duplicated private methods (isSearching/isIdentityVerified/
  isProfileApproved/entry) — single source of truth now in CapabilityService

Contracts updated to check CapabilityService.java for capability-related
assertions (setDisabledReason/isIdentityVerified/ACCOUNT_STATUS_NORMAL)
This commit is contained in:
Codex
2026-09-14 11:38:30 +08:00
parent 22325ec2b0
commit dd58ab6eae
4 changed files with 171 additions and 64 deletions
+6 -3
View File
@@ -3,6 +3,9 @@ import fs from 'node:fs'
const read = (path) => fs.readFileSync(path, 'utf8')
const home = read('backend/src/main/java/com/danyang/match/platform/home/service/HomeApplicationService.java')
const caps = fs.existsSync('backend/src/main/java/com/danyang/match/platform/capability/service/CapabilityService.java')
? read('backend/src/main/java/com/danyang/match/platform/capability/service/CapabilityService.java')
: home // fallback: CapabilityService 独立化前逻辑在 HomeApplicationService 里
const miniapp = read('miniapp/pages/index/index.ts')
const wxml = read('miniapp/pages/index/index.wxml')
const project = JSON.parse(read('project.config.json'))
@@ -19,9 +22,9 @@ assert.match(home, /userIdentityMapper\.findByUserId/, '首页实名认证状态
assert.match(home, /recommendationEngineService\.getDailyRecommendations/, '首页推荐必须来自正式推荐引擎')
assert.match(home, /contentArticleMapper\.findPublishedAll/, '首页课堂内容必须来自内容模块')
assert.match(home, /serviceLocationMapper\.selectOne/, '首页服务站必须来自服务站模块')
assert.match(home, /setDisabledReason/, '不可用入口必须返回服务端原因')
assert.match(home, /isIdentityVerified/, 'Capability 必须校验真实实名状态')
assert.match(home, /ACCOUNT_STATUS_NORMAL/, 'Capability 必须拒绝非正常账户')
assert.match(caps, /setDisabledReason/, '不可用入口必须返回服务端原因')
assert.match(caps, /isIdentityVerified/, 'Capability 必须校验真实实名状态')
assert.match(caps, /ACCOUNT_STATUS_NORMAL/, 'Capability 必须拒绝非正常账户')
assert.match(home, /\/pages\/counseling-intro\/counseling-intro/, '咨询服务建议必须跳转真实页面')
assert.match(home, /\/pages\/premarital-intro\/premarital-intro/, '婚前辅导建议必须跳转真实页面')
assert.doesNotMatch(home, /"pages\//, '服务端返回的小程序路由必须以斜杠开头')