Şlüz və müştəri API-si
Müştərilərin modulunuzun API-sini api.cosuite.io vasitəsilə öz CoSuite açarları ilə necə çağırdığı və tətbiqinizin bu sorğuları necə yoxlayıb cavablandırdığı (müqavilə 1.8).
Müştərilər modulunuzun API-sini https://api.cosuite.io/v1/apps/{app}/{path} ünvanından öz CoSuite API açarları ilə çağırır. CoSuite açarı, abunəliyi və əhatəni yoxlayır, sonra sorğunu tətbiqinizə Connect imzası ilə ötürür; çağıran biznes X-CoSuite-Tenant başlığında göstərilir. Tətbiqiniz müştərinin açarını, müştəri də sizinkini heç vaxt görmür.
Müştəri proqramı ──Bearer cs_api_…──▶ api.cosuite.io/v1/apps/dent/patients
│ açar · abunəlik · yol · əhatə · sürət limiti
▼
{server}/patients ◀── Connect imzası + X-CoSuite-Tenant
Tətbiqiniz üçün: şlüz sorğularına cavab vermək
Şlüz yalnız modulunuzun OpenAPI 3.1 sənədində olan əməliyyatları ötürür. Bunun üçün müştərinin açarında əməliyyatın tələb etdiyi əhatələrdən biri olmalıdır.
Ünvan. OpenAPI sənədinizdəki servers[0].url tətbiqinizin əsas ünvanı ilə eyni mənbədədirsə, sorğular ora gedir; əks halda əsas ünvana. Yol və sorğu parametrləri dəyişmədən əlavə olunur: GET /v1/apps/dent/patients?page=2 → GET {server}/patients?page=2.
Gələn başlıqlar (Connect imza başlıqlarına əlavə olaraq):
| Başlıq | Mənası |
|---|---|
X-CoSuite-Gateway: 1 |
Sorğu Connect çağırışından deyil, şlüzdən gəlir. |
X-CoSuite-Tenant |
Biznesin tenantId-si (POST /tenants-dakı ilə eyni). Yalnız bu biznesin məlumatını qaytarın. |
X-CoSuite-Scopes |
Açarın bu sorğuda keçərli əhatələri, boşluqla ayrılmış. |
X-CoSuite-Api-Key-Id |
Müştərinin CoSuite açarının identifikatoru (açarın özü deyil); qeydlər və limitlər üçün. |
Content-Type, Accept, Accept-Language, If-Match, If-None-Match |
Müştəridən olduğu kimi ötürülür. |
Müştərinin Authorization başlığı heç vaxt ötürülmür.
Öhdəlikləriniz:
- İmzanı yoxlayın və təkrarlanan sorğu identifikatorlarını rədd edin.
verifyGatewayRequesthər ikisini birlikdə edir. - Naməlum və ya bağlanmamış
tenantIdüçün404vətenant_not_foundqaytarın; heç bir məlumat qaytarmayın. - 30 saniyə ərzində, ən çox 10 MB olan cavab verin və heç vaxt yönləndirmə etməyin (3xx xəta sayılır).
- Əməliyyatın əhatəsini şlüz artıq yoxlayıb;
X-CoSuite-Scopesilə əlavə məhdudlaşdıra bilərsiniz.
import { verifyGatewayRequest, MemoryReplayStore } from "@cosuite/connect";
const replay = new MemoryReplayStore(); // bir neçə prosesdə Redis və ya verilənlər bazanızdan istifadə edin
export async function GET(req: Request) {
const url = new URL(req.url);
const body = await req.text();
const v = await verifyGatewayRequest({
method: req.method,
pathAndQuery: url.pathname + url.search,
body,
headers: req.headers,
secretsFor: (keyId) => (keyId === process.env.COSUITE_KEY_ID ? [process.env.COSUITE_SECRET!] : undefined),
replay,
});
if (!v.ok) return Response.json({ ok: false, error: { code: "unauthorized", message: v.reason, retryable: false } }, { status: 401 });
const account = await findAccountByCoSuiteTenant(v.context.tenantId);
if (!account) return Response.json({ ok: false, error: { code: "tenant_not_found", message: "tenant not found", retryable: false } }, { status: 404 });
return Response.json({ items: await listPatients(account.id) });
}
Digər dillərdə imzanı Connect çağırışlarındakı kimi yoxlayın və yuxarıdakı başlıqları oxuyun.
Uyğunluq testi. api tərifi olan hər modulda test parametrsiz ən çox üç GET əməliyyatını çağırır:
- Test biznesi ilə: cavab gözlənilir.
- Naməlum biznes ilə:
404 tenant_not_foundgözlənilir. - İmzasız:
401gözlənilir.
Müştərilər üçün: API-ni çağırmaq
- CoSuite panelində İdarəetmə › API açarları bölməsini açın və açar yaradın. Tətbiqi və yalnız lazım olan əhatələri seçin; mümkünsə etibarlılıq müddəti təyin edin. Açar yalnız bir dəfə göstərilir.
- Açarı bearer token kimi göndərin:
curl -H "Authorization: Bearer $COSUITE_API_KEY" \
"https://api.cosuite.io/v1/apps/dent/patients?page=2"
Açar bu şərtlərlə işləyir:
- Yalnız yaradıldığı tətbiq üçün.
- Yalnız seçdiyiniz əhatələrlə.
- Yalnız modul abunəliyinizdə olduğu müddətcə. Modulu buraxdıqda onun əhatələri işləməz.
Ləğv edilmiş və ya müddəti bitmiş açar dərhal rədd edilir.
Hər çağırış API audit qeydinə yazılır və 12 ay saxlanılır: açar, uc nöqtə, əhatə, status və müddət. Gövdələr heç vaxt saxlanılmır.
Limitlər:
- Sorğu gövdəsi ən çox 2 MB.
- Biznes başına dəqiqədə 600, açar başına dəqiqədə 300 sorğu.
- Ardıcıl 5 dəfə xəta verən tətbiq 60 saniyə dayandırılır.
Veb-hooklar
Tətbiqiniz modulun yaydığı hadisələri manifestdə təyin edir (modules[].webhooks[], bax: modul tərifi). Hər hadisəni CoSuite-ə digər hadisələr kimi göndərir: POST /connect/v1/events, gövdədə tenantId, unikal id, təyin olunmuş type və data. CoSuite hadisəni abunə olan bizneslərə ötürür; gövdəni çatdırıldıqdan sonra saxlamır.
Müştərilər abunəliyi İdarəetmə › API açarları › Veb-hooklar bölməsində qurur: tətbiqi, hadisələri və https ünvanı seçirlər, imza üçün gizli dəyəri bir dəfə alırlar. Hər çatdırılma bir POST sorğusudur. JSON gövdəsi { "id", "type", "app", "occurredAt", "data" } formasındadır və bu başlıqları daşıyır:
| Başlıq | Mənası |
|---|---|
X-CoSuite-Event |
Hadisə növü, məs. treatment.completed |
X-CoSuite-Delivery |
Çatdırılma identifikatoru (hər təkrarda eyni) |
X-CoSuite-Timestamp |
Unix saniyəsi |
X-CoSuite-Signature |
v1= + gizli dəyərlə {vaxt}.{xam gövdə} üzərindən hex HMAC-SHA256 |
İmzanı yoxlayın, vaxt 5 dəqiqə daxilindədirsə qəbul edin və 10 saniyə ərzində 2xx ilə cavab verin. Uğursuz çatdırılmalar 24 saata qədər təkrar sınanır (1, 5, 15, 60, 180, 360 və 720 dəqiqədən sonra). Təkrarları hadisə id-si ilə ayıklayın.
Xətalar
Tətbiqin öz cavabları (status və gövdə) dəyişmədən qaytarılır. Şlüzün yaratdığı xətalar Connect zərfindən istifadə edir: { "ok": false, "error": { "code", "message", "retryable" } }.
| Status | Kod | Nə vaxt |
|---|---|---|
| 401 | unauthorized |
Açar yoxdur, etibarsızdır, ləğv edilib və ya müddəti bitib |
| 403 | forbidden |
Açar başqa tətbiqə aiddir |
| 403 | not_subscribed |
Açarın heç bir əhatəsi cari abunəlikdə yoxdur |
| 403 | insufficient_scope |
Əməliyyat açarda olmayan əhatə tələb edir |
| 404 | app_not_found · route_not_found |
Naməlum tətbiq və ya yol tətbiqin API-sində yoxdur |
| 405 | method_not_allowed |
Yol var, metod yoxdur |
| 409 | not_linked |
Biznes hələ tətbiqə bağlanmayıb (CoSuite-dən bir dəfə açın) |
| 413 | payload_too_large |
Gövdə 2 MB-dan böyükdür |
| 429 | rate_limited |
Sürət limiti aşılıb; Retry-After başlığına baxın |
| 502 | bad_gateway |
Tətbiqə çatmaq olmadı, yönləndirmə etdi və ya 10 MB-dan böyük cavab verdi |
| 503 | app_unavailable |
Tətbiq ardıcıl xətalara görə dayandırılıb; Retry-After başlığına baxın |
| 504 | upstream_timeout |
Tətbiq 30 saniyə ərzində cavab vermədi |
Şlüzün hər cavabında X-CoSuite-Request-Id başlığı var; dəstəklə əlaqə saxlayarkən bu identifikatoru göstərin.