first commit

This commit is contained in:
mobinesaghi
2025-10-21 18:47:36 +03:30
commit f50df9d6ad
+106
View File
@@ -0,0 +1,106 @@
# سامانه استعلام کد ملی
API با Hono + Zod + OpenAPI + MySQL + Docker
## نصب و اجرا (Local)
```bash
npm install
npm run dev
```
سرور روی پورت پیش‌فرض `20205` اجرا می‌شود (قابل تغییر با `PORT`).
## اجرای Docker
```bash
docker compose up -d --build
```
Environmentهای مهم (در docker-compose قابل تنظیم):
- PORT (پیش‌فرض: 20205)
- DB_NAME, DB_USER, DB_PASS, DB_HOST, DB_PORT
- JIBIT_API_KEY, JIBIT_SECRET_KEY
## استفاده
- احراز هویت با هدر Authorization الزامی است (Bearer token).
- اگر در body فیلد `host` ارسال شود، درخواست‌ها به نام کاربر همان host ثبت می‌شود؛ اگر وجود نداشته باشد ساخته می‌شود.
مثال:
```bash
curl --location 'http://localhost:20205/check_user' \
--header 'Authorization: Bearer admin-token' \
--header 'Content-Type: application/json' \
--data '{
"number": "09372281182",
"national": "1274467144",
"host": "golak"
}'
```
پاسخ:
```json
{ "matched": true | false }
```
نکات:
- اگر رکورد قبلاً برای همان host (کاربر) ثبت شده باشد، از کش `persons` بازمی‌گردد.
- اگر نبود، از سرویس جیبیت استعلام می‌شود؛ در صورت 401/403 ابتدا refresh سپس generate token و مجدد تلاش می‌شود.
- ارورهای جیبیت به صورت `{ error, code, status }` پاس داده می‌شوند.
## مستندات (OpenAPI)
Swagger UI: `http://localhost:20205/`
OpenAPI JSON: `http://localhost:20205/doc`
## محل کدها و روتر
- نقطه شروع سرور: `src/index.ts`
- روترها: `src/routes/user.routes.ts`
- کنترلر استعلام: `src/controllers/user.controller.ts`
- سرویس توکن جیبیت: `src/services/jibit.service.ts`
- مدل‌ها (Sequelize):
- کاربران: `src/models/User.model.ts`
- افراد (persons): `src/models/Person.model.ts`
- کارت‌ها: `src/models/Card.model.ts`
- لاگ‌ها: `src/models/Log.model.ts`
- تنظیمات دیتابیس: `src/config/database.ts`
## دیتابیس و جداول
- users: مدیریت کاربران سیستم و hostها
- id, username, domain, host, token, isAdmin, queryCount, timestamps
- persons: کش نتایج استعلام برای هر کاربر (host)
- id, national, number, matched, userId, timestamps
- ایندکس یکتا: (national, number, userId)
- tokens: نگهداری access/refresh توکن جیبیت
- id, accessToken, refreshToken, timestamps
- logs: لاگ همه درخواست‌ها
- type (incoming|outgoing), method, path, headers, body, response, status, durationMs, ip, userId, targetUrl, timestamps
- محدودیت سقف 85,000 رکورد (قدیمی‌ها پاک می‌شوند)
## تنظیمات محیطی
- PORT: پورت سرویس (پیش‌فرض 20205)
- DB_*: تنظیمات اتصال MySQL
- JIBIT_API_KEY, JIBIT_SECRET_KEY: کلیدهای سرویس جیبیت
## رفتارهای کلیدی
- Authorization: کاربر درخواست‌کننده از روی توکن یافت می‌شود.
- host در body: کاربر هدف بر اساس host ساخته/یافته می‌شود و استعلام به نام او ثبت می‌گردد.
- persons: کش به ازای هر کاربر جداست؛ تداخل بین hostها وجود ندارد.
- روی خطای یکتا/اعتبار هنگام ذخیره `Person`، نتیجه از رکورد موجود خوانده و بازگردانده می‌شود، بدون خطای Validation.
## تست سریع
```bash
curl --location 'http://localhost:20205/check_user' \
--header 'Authorization: Bearer admin-token' \
--header 'Content-Type: application/json' \
--data '{
"number": "09372281182",
"national": "1274467144",
"host": "golak"
}'
```