feat(documents): full regional doc set (front/back + criminal record) + CS data-entry + DB pool bump

- doc types with side (front/back/single): license, national_id, vehicle_registration (both sides), criminal_record, selfie, vehicle_photo
- fields: side, holder_name(encrypted), issue_date, extra jsonb; REQUIRED_DOCS checklist + /requirements
- CS/admin: POST /admin/drivers/:id/documents (upload for driver), list, review auto-approves when complete
- face-match endpoint stub (Gemini/Face provider later)
- DB pool extra.max=30 (raises concurrency ceiling); migration DocumentsFields

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-16 19:52:55 +03:00
co-authored by Claude Opus 4.8
parent 7a58a01417
commit 04200db438
5 changed files with 202 additions and 39 deletions
@@ -0,0 +1,18 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
/** حقول إضافية للوثائق: الوجه، اسم الحامل، تاريخ الإصدار، حقول إضافية. */
export class DocumentsFields1721750000000 implements MigrationInterface {
public async up(q: QueryRunner): Promise<void> {
await q.query(`ALTER TABLE tripz_driver_documents ADD COLUMN IF NOT EXISTS side varchar NOT NULL DEFAULT 'single'`);
await q.query(`ALTER TABLE tripz_driver_documents ADD COLUMN IF NOT EXISTS holder_name varchar`);
await q.query(`ALTER TABLE tripz_driver_documents ADD COLUMN IF NOT EXISTS issue_date date`);
await q.query(`ALTER TABLE tripz_driver_documents ADD COLUMN IF NOT EXISTS extra jsonb NOT NULL DEFAULT '{}'`);
}
public async down(q: QueryRunner): Promise<void> {
await q.query(`ALTER TABLE tripz_driver_documents DROP COLUMN IF EXISTS extra`);
await q.query(`ALTER TABLE tripz_driver_documents DROP COLUMN IF EXISTS issue_date`);
await q.query(`ALTER TABLE tripz_driver_documents DROP COLUMN IF EXISTS holder_name`);
await q.query(`ALTER TABLE tripz_driver_documents DROP COLUMN IF EXISTS side`);
}
}