feat: Gemini AI (doc OCR + face match) + role-assignment endpoints

- GeminiService (integrations/gemini, @Global): extractDocument (OCR fields) + faceMatch; graceful if no GEMINI_API_KEY
- documents: face-match now real via Gemini; POST /admin/documents/:id/ocr extracts fields for CS auto-fill
- roles: PATCH /admin/users/:id/role (admin) + POST /platform/users/role (bootstrap via x-platform-secret)
- config: gemini + platform.secret; .env.example entries

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-16 20:01:26 +03:00
co-authored by Claude Opus 4.8
parent 04200db438
commit 6234e66471
1541 changed files with 267713 additions and 16 deletions
@@ -0,0 +1,16 @@
-----BEGIN CERTIFICATE REQUEST-----
MIICmDCCAYACAQAwUzEmMCQGCSqGSIb3DQEJARYXaGFtemFheWVkZGV2QGljbG91
ZC5jb20xHDAaBgNVBAMME0hhbXphIEFsZWdod2FpcnllZW4xCzAJBgNVBAYTAkpP
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9VnNN4Mp4mQyTHKS4UhX
DDl9zMaBGnlWx7NqJin3Vim+Jq3CvprO3HTx6PG+Ub92VZWOje0fx8v72P87xqG1
eQpbqPnv6rC/8PuQDoKu7GD/vDfAfrculpIJRyVcAew8yCLfDq6VMqP3qjR4j12p
mWfFV48JFuK7pk+qR8LEi5cs42QLIxgEcMEZcJNqZxp7L/cdf+CT7ceA5yoI1RA8
0LP4zGbXdPBFr+2AYWiN5mo06WvK8GRKm2Dzsw9zd2s3nhJoiP98oVr4J5wgG84K
ODp1uHH0HA4+9/IL8NEptstCIxy3Dx7TpRoTG7OcvCLtb5k7hNNMhzI5l6HBvksS
ywIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAGkumJGj7p8pUernVuQVDTbV8sxQ
Bqi60zXjNiKD0L8yxMrk9M4vQDmJGoNtoMRQk29Rqkti1Oeoo5oN65tqgDe6LTA6
+LQAgrd/uKFmki5419mBfCM4nJC98HaLVIv/nfNk7jUd8WDW73EaE5193xHMTYLL
37zZIr3Og0gIWptXeXvBYPVwlS7oZpBODW0qsI+D6oKfGtXQRvxK8IdZhbIaKyZp
6zc5xrBJVvScHuRFSiLqT1Z07cHiMvkOPA3DycfYr+ifPL5aot6GAiqVM4v3y7PS
3/T5UiNi69tdWY2wCOrYnbJTgf7CAyquPjXYfifWA+BrrPxIMKvf1SLz370=
-----END CERTIFICATE REQUEST-----
BIN
View File
Binary file not shown.
+14
View File
@@ -0,0 +1,14 @@
{
"basicAuthCredentials": "wqnmqqsjyvwv:nqrDEV@2101Br",
"accountSIDTwillo": "ACx4qy857juj0903xuy6238q763q2fj4y1Br",
"serverAPI": "AAAAobYrrCi:APA91xF1zwTvmSzSdaxuY6f60D8mz1ZzyIzr9od6br7GDyeCaWPRK0G0hx5SaFyx1eDvQDpQPdGk-697MWLi0zs3iYInBtBLOxswg0GecNmsl0PxE3wI-vOpwu8Vv1dkUkBniuxZYXgHBr",
"mapAPIKEY": "AImqSsCsutRXTtSTLOFQSQkN5v7QZkGJVZbEKa0Br",
"twilloRecoveryCode": "TQF13XUVU2NJ3VFU8JWBWYBSBr",
"authTokenTwillo": "14u39ju4628xx8q4u18469u462u8qu75Br",
"chatGPTkey": "zg-8T67q8YDNGAeUSXqkHowT3BrxgFJfFy3ELw6rm7A6adb0kjwBr",
"transactionCloude": "Ahcwilomqcoib:API_EMDJX6BHQ67DBGT6WV:DG2XPU7YEN02M0VJ2FBr",
"visionApi": "0vALyaDDYHpmv73Q59SIkxmeG7Z2mgwJXlBr",
"stripe_publishableKe": "vg_cjzc_51O4WTODMEVlOCA5SN5j6x8vApF5CPDC3f3Pou18a74NEQAvU5AunZZEN9X2WIqsuIlUTeeh1vUqpnkijLkx3FR5g00vb4iMHGOBr",
"secretKey": "zg_cjzc_51O4WTODMEVlOCA5SBkqiSS69bNFRsuZd2Tr5ODztYseaLvf0RdBHW3wwfP38Tv78TZ1PQiZi7jHFrrRoQy3lMHPN00Ll9WD3b2Br",
"chatGPTkeySefer": "zg-OiL08ooza0Dvhvb3rSk2T3BrxgFJ4l9jLLSrUj0Ae5ABVlqPBr"
}