SearchAdd Pre Create Guards

快速結論

這段是在 quote_requests 建立前的所有 early return。命中時不應建立 request。

current 入口:

SearchAddHandler::handle()
-> CategoryQuery
-> FormCategoryValidator
-> RiskControlGuard
-> SameCategoryServiceConflictGuard

新舊程式對應

Legacy PHP 5.6

主要入口:

/Users/mattsu/Documents/Site/get-lancer-php56/app/Plugin/Quotes/Controller/QuoteRequestsController.php::search_add()
legacy guard職責
category not foundcategory 不存在或 form/category 不一致時回 legacy error。
form category mismatch第一題 form 與 category 不一致時擋下。
risk control海外 / duplicate / phone / abuse 類建單前風控。
same category service conflict同分類 provider conflict guard。

Current PHP 8.2

current 位置職責
Lib/SearchAdd/SearchAddHandler.php:139-155category 與 first form field validation。
Lib/SearchAdd/SearchAddHandler.php:195-203RiskControlGuard early return。
Lib/SearchAdd/SearchAddHandler.php:205-214SameCategoryServiceConflictGuard early return。
Lib/SearchAdd/RiskControlGuard.php風控實作。
Lib/SearchAdd/SameCategoryServiceConflictGuard.php同分類 provider conflict。

行號對照

new 行號對應 legacy職責
SearchAddHandler.php:139-147QuoteRequestsController.php:1863-1892category 不存在時回 error=1;有 form 但 category 不合時回 error=13
CategoryQuery.php:12-23QuoteRequestsController.php:1865-1871查 category 是否存在。
SearchAddHandler.php:149-155QuoteRequestsController.php:1894-1911第一個 form field 的 category 必須與 request category 一致。
FormCategoryValidator.php:13-38QuoteRequestsController.php:1894-1911查第一個 form field 所屬 category 並回 validation 結果。
SameCategoryServiceConflictGuard.php:21-58QuoteRequestsController.php:1913-1924, 2424-2437provider / 關聯帳號已有相同專業服務時回 error=10
SearchAddHandler.php:195-203QuoteRequestsController.php:2336-2418建單前主線風控 early return。
RiskControlGuard.php:21-30QuoteRequestsController.php:2336-2347phone 未驗證回 error=6
RiskControlGuard.php:32-41QuoteRequestsController.php:2349-2361blocked user 回 error=5
RiskControlGuard.php:43-67QuoteRequestsController.php:2363-2396海外電話與 12 小時內重複需求回 error=14
RiskControlGuard.php:69-79QuoteRequestsController.php:2398-241824 小時內同 category open request >= 5 回 error=4
SearchAddHandler.php:205-214QuoteRequestsController.php:2420-2437production same-category related account guard。

Side Effects

正常情況不應有 request-side DB write。

如果 guard 前的 actor resolution 已做 auto signup,可能已有 actor-side side effects;但不應有新 quote_requests

不可改變的契約

  • guard 命中時不可建立 quote_requests
  • error code / message 要維持 legacy。
  • category 不存在但有 form 與沒有 form 的錯誤語意不同。
  • form/category mismatch 要在建單前擋下。

Verification

主要測試:

tests/SearchAddStep8IntegrationTest.php

待確認 / 風險

  • 若後續新增 guard,需明確標示它是在 actor 前、actor 後、還是 request create 後,避免 side effect 判讀錯誤。