feat(doctor): claim captcha+mobile, owner profile delete, admin map zoom fix

- DoctorClaimController: ALTCHA CaptchaGuard on /claim (dev no-op via
  ALTCHA_ENABLED=false); optional `mobile` field must match the logged-in
  user's number (422 ERR_CONFLICT_001 on mismatch)
- DoctorController::delete: now IS_AUTHENTICATED_FULLY — admin (any) or the
  owner of a claimed profile (IDOR-guarded); FK appointment guard kept
- DoctorDetailPage address map: MapController calls map.invalidateSize()
  before flyTo (fixes needing to pick a city twice on a freshly-mounted map);
  geocode retries once (nominatim empty/429 on first hit)
- tests: mobile mismatch, owner-delete allowed + others 403, unclaimed not
  deletable by random user
- docs: doctor-claim.md (mobile+captcha), doctor.md (delete permission)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
hamed
2026-07-11 14:57:41 +03:30
co-authored by Claude Opus 4.8
parent 3dcd4f3b26
commit 2f0131171d
20 changed files with 1204 additions and 570 deletions
+21 -16
View File
@@ -230,8 +230,8 @@
"semantic_hash": ""
},
"assets/admin/pages/DoctorDetailPage.tsx": {
"mtime": 1783189217.065477,
"ast_hash": "d10e0ec287b6d42011d384e3e8d8583b",
"mtime": 1783768892.4257572,
"ast_hash": "9e14c9cc70e4707bddaab0a5267e54c0",
"semantic_hash": ""
},
"assets/admin/pages/DoctorFormPage.tsx": {
@@ -1180,8 +1180,8 @@
"semantic_hash": ""
},
"src/Doctor/Controller/DoctorController.php": {
"mtime": 1783747336.6328127,
"ast_hash": "7828b41ebfdf61e887bf38d360c8a8e1",
"mtime": 1783769018.613043,
"ast_hash": "57c2d4ba148aa5084683dbfd08f8e2b0",
"semantic_hash": ""
},
"src/Doctor/Entity/Doctor.php": {
@@ -2395,8 +2395,8 @@
"semantic_hash": ""
},
"docs/api/doctor.md": {
"mtime": 1783757329.0750217,
"ast_hash": "cb33dfc5636d36fdb6c98402cb789340",
"mtime": 1783769157.105152,
"ast_hash": "572576e30db5b049cb62ba8d54bdf8a5",
"semantic_hash": ""
},
"docs/api/insurance.md": {
@@ -3900,8 +3900,8 @@
"semantic_hash": ""
},
"src/Doctor/Controller/DoctorClaimController.php": {
"mtime": 1783757329.0908747,
"ast_hash": "ed52d6bb87506e44be9f86adffee5645",
"mtime": 1783768981.0086484,
"ast_hash": "997576824b9039e977fd58efb417cf70",
"semantic_hash": ""
},
"src/Doctor/Controller/DoctorImportController.php": {
@@ -3930,8 +3930,8 @@
"semantic_hash": ""
},
"src/Doctor/Service/DoctorImportService.php": {
"mtime": 1783765876.696864,
"ast_hash": "56bacf3ad261680191151c347f8cd411",
"mtime": 1783766986.8738186,
"ast_hash": "a675ebe7e1acac7da14cc8de3364757e",
"semantic_hash": ""
},
"src/Shared/Util/PersianText.php": {
@@ -3940,13 +3940,13 @@
"semantic_hash": ""
},
"tests/Doctor/DoctorClaimTest.php": {
"mtime": 1783757329.09223,
"ast_hash": "5973aa00e5a19406cd79f93be5455b76",
"mtime": 1783769087.937134,
"ast_hash": "50ea89c2d246faf98dc843152d51a0c5",
"semantic_hash": ""
},
"tests/Doctor/DoctorImportTest.php": {
"mtime": 1783765976.698628,
"ast_hash": "1d99f84ff5b37dacd93000fa8562f994",
"mtime": 1783766996.494613,
"ast_hash": "997b8d698c8eb4bbf69652bdcead514d",
"semantic_hash": ""
},
"tests/Shared/PersianTextTest.php": {
@@ -3960,8 +3960,8 @@
"semantic_hash": ""
},
"docs/api/doctor-claim.md": {
"mtime": 1783757329.090325,
"ast_hash": "1cc55e0c447ec1d4176adc0700b8da54",
"mtime": 1783769130.2951994,
"ast_hash": "2f4e095e4e0cac673062cc48b0577d5d",
"semantic_hash": ""
},
"docs/scenarios/climed.md": {
@@ -3993,5 +3993,10 @@
"mtime": 1783765695.1482882,
"ast_hash": "b03ab1640dc46aa51114fbc3eba51870",
"semantic_hash": ""
},
".claude/prompt/doctor-map-claim-captcha-delete.md": {
"mtime": 1783768547.5967684,
"ast_hash": "d4531629fe5bf2befc994f1a3f2a34ff",
"semantic_hash": ""
}
}