# Modul tərifi

> CoSuite modullarını manifestdə təsvir et (müqavilə 1.7). Funksiyalar, OpenAPI 3.1 və scope-lu API, webhook-lar, provides, məlumat kateqoriyaları, bazarlar.

Source: https://cosuite.io/az/developers/module-definition

Müqavilənin **1.7** versiyasından etibarən [manifestindəki](https://cosuite.io/az/developers/contract#manifest) hər modul özünü ətraflı təsvir edə bilər. CoSuite kataloqu, qeydiyyat axını, tətbiqinin CoSuite-dəki səhifəsi, cosuite.io məhsul səhifələri və (2-ci mərhələdə) müştəri API arayışı bu sahələrdən yaradılır. **Bütün sahələr istəyə bağlıdır**; 1.6 manifesti olduğu kimi etibarlı qalır.

## Nümunə {#example}

```json
{
  "key": "dent.treatment",
  "name": { "tr": "Hasta ve tedavi planı", "en": "Patients and treatment plans", "az": "Xəstə və müalicə planı" },
  "description": { "tr": "Hasta kartı ve tedavi planı.", "en": "Patient records and treatment plans.", "az": "Xəstə kartı və müalicə planı." },
  "limits": [{ "key": "smsPerMonth", "unit": "count_per_month" }],
  "features": [
    { "key": "plan_pdf", "name": { "tr": "Tedavi planı PDF'i", "en": "Treatment plan PDF", "az": "Müalicə planı PDF" } },
    { "key": "sms", "name": { "tr": "SMS hatırlatma", "en": "SMS reminders", "az": "SMS xatırlatma" }, "limit": "smsPerMonth" }
  ],
  "api": { "version": "2026-11", "openapi": "/openapi.json", "scopes": [{ "key": "patients:read" }, { "key": "patients:write" }] },
  "webhooks": [{ "type": "treatment.completed", "scope": "patients:read", "schema": { "type": "object" } }],
  "provides": [],
  "dataCategories": ["identity", "contact", "health"],
  "markets": [
    { "country": "TR", "locales": ["tr"] },
    { "country": "AZ", "locales": ["az"], "price": { "currency": "AZN", "amount": 25 } }
  ]
}
```

## Sahələr {#fields}

| Sahə | Mənası |
|---|---|
| `key`, `name`, `limits`, `usage` | Əvvəlki versiyalardakı kimi qalır (bax: [müqavilə](https://cosuite.io/az/developers/contract#manifest)). Modul açarı `<appKey>.<module>`; `name` hər dil üçün ayrıca, 200 simvola qədər. |
| `description` | Hər dil üçün təsvir, 1000 simvola qədər. |
| `features[]` | Modulun imkanları: `key` (kiçik hərflərlə, `^[a-z][a-z0-9_]*$`), hər dil üçün `name`, istəyə bağlı hər dil üçün `description` və asılı olduğu istəyə bağlı `limit` (eyni modulun `limits[].key` dəyərlərindən biri). |
| `api` | Modulun müştərilərə açdığı endpoint-lər. `openapi`: OpenAPI **3.1** sənədi; ya URL (https və ya `baseUrl`-ə nisbətən yol; yalnız JSON, ən çoxu 2 MB), ya da daxil edilmiş obyekt. `scopes[]`: modulun `resource:action` formasında scope-ları (`patients:read`), hər birinin istəyə bağlı hər dil üçün `name` dəyəri ilə. `version`: sənin API versiyan. |
| `webhooks[]` | Modulun yaydığı hadisələr: `type` (nöqtəli, kiçik hərflərlə, məsələn, `treatment.completed`), istəyə bağlı hər dil üçün `name` və `description`, istəyə bağlı abunə `scope` dəyəri (`api.scopes` siyahısından biri) və `data` üçün JSON Schema. |
| `provides[]` | Modulun CoSuite-də öz üzərinə götürdüyü ortaq biznes funksiyaları: `crm`, `quotes`, `einvoice`, `expenses`, `inventory`, `projects`, `inbox`, `booking`, `reviews`, `payments`, `reports`, `website`, `seo`, `social`, `shipping`, `hr`, `pos`. İki modul eyni biznes üçün eyni anda eyni funksiyanı heç vaxt təmin etmir. |
| `dataCategories[]` | Modulun emal etdiyi şəxsi məlumatlar: `identity`, `contact`, `financial`, `health`, `location`, `biometric`, `children`, `communications`, `media`, `usage`, `employment`, `legal`. Məxfilik bildirişləri (GDPR, KVKK) və yoxlama üçün istifadə olunur. |
| `markets[]` | Modulun təklif olunduğu ölkələr (`country`, ISO 3166-1 alpha-2) və onların dilləri (`locales`, manifestin `locales` siyahısından götürülür); istəyə bağlı ölkə qiyməti `{ currency, amount }`. Boşdursa, bazar CoSuite-də müəyyən edilir. |

Limitlər bir baxışda: hər modul üçün 64 funksiya, 64 scope, 64 webhook, 16 `provides`, 32 məlumat kateqoriyası və 100 bazara qədər.

## Uyğunluq testinin tətbiq etdiyi qaydalar {#rules}

[Uyğunluq testi](https://cosuite.io/az/developers/sdk#conformance) yalnız doldurduğun sahələri yoxlayır. Partnyor portalı da göndərəndə eyni yoxlamaları işə salır.

- **Hər bazar dilində mətnlər.** `markets` siyahısında istifadə olunan hər dil üçün modulun `name`, `description` dəyərləri və hər funksiyanın `name` dəyəri doldurulmalıdır.
- **Bazar dilləri manifestdən gəlir.** `markets[].locales` siyahısındakı hər dil manifestin `locales` siyahısında da olmalıdır.
- **Təkrarlanan açar yoxdur:** `features`, `api.scopes`, `webhooks` (`type` üzrə) və `markets` (`country` üzrə) siyahılarında; `provides` siyahısında təkrar yoxdur.
- **Funksiya limitləri mövcuddur.** Funksiyanın `limit` dəyəri modulun `limits[].key` dəyərlərindən biri olmalıdır.
- **Webhook scope-ları mövcuddur.** Webhook-un `scope` dəyəri `api` tərifini tələb edir və `api.scopes` siyahısından biri olmalıdır.
- **Yalnız tanınan dəyərlər.** `provides` və `dataCategories` yalnız yuxarıda sadalanan dəyərləri qəbul edir. CoSuite özü naməlum dəyərləri nəzərə almır (irəli uyğunluq), amma test yazı səhvlərini tutmaq üçün onları rədd edir.
- **OpenAPI yoxlanılır:** `api` olan hər modul üçün sənəd yüklənir (və ya daxildən oxunur) və aşağıda təsvir olunduğu kimi yoxlanılır.

## OpenAPI tələbləri {#openapi}

Test CoSuite-in güvəndiyi hissələri yoxlayır; bu, tam sxem yoxlaması deyil.

- `openapi` `3.1.x` olur; `info.title` və `info.version` mövcuddur; `paths` boş deyil və hər yol `/` ilə başlayır.
- **Hər əməliyyat `cosuite` təhlükəsizlik sxemi vasitəsilə ən azı bir scope tələb edir:** `security: [{ "cosuite": ["<scope>"] }]`. Öz `security` dəyəri olmayan əməliyyat kök səviyyəsindəki `security` dəyərini miras alır.
- Sənəddə istifadə olunan hər scope modulun `api.scopes` siyahısında elan olunmalıdır.
- `operationId` dəyərləri unikaldır.
- `openapi` URL olduqda: `baseUrl` https-dirsə, o da https olmalıdır, 10 saniyə ərzində yönləndirmə olmadan JSON ilə `200` qaytarmalıdır (YAML dəstəklənmir) və ən çoxu 2 MB olmalıdır.

Minimal etibarlı sənəd:

```json
{
  "openapi": "3.1.0",
  "info": { "title": "DentCloud treatment API", "version": "2026-11" },
  "security": [{ "cosuite": ["patients:read"] }],
  "components": {
    "securitySchemes": {
      "cosuite": { "type": "http", "scheme": "bearer", "bearerFormat": "CoSuite API key", "description": "CoSuite customer API key; the gateway checks the scopes in security" }
    }
  },
  "paths": {
    "/patients": {
      "get": { "operationId": "listPatients", "responses": { "200": { "description": "Patients" } } },
      "post": {
        "operationId": "createPatient",
        "security": [{ "cosuite": ["patients:write"] }],
        "responses": { "201": { "description": "Created" } }
      }
    }
  }
}
```

Yuxarıdakı `cosuite` sxemi yekun tərifdir: müştərilər CoSuite API açarlarını şlüzə bearer token kimi göndərir, şlüz `security`-dəki əhatələri yoxlayır. İstəsəniz `servers[0].url` sahəsinə API-nizin tətbiqinizlə eyni mənbədəki əsas yolunu yazın (məs. `https://app.dentcloud.example/api`); şlüz sorğuları ora ötürür.

## Müştərilər API-nə necə çatır {#gateway}

Müştərilər modulunuzun uc nöqtələrini öz CoSuite açarları ilə `api.cosuite.io` şlüzü vasitəsilə çağırır. Sorğu tətbiqinizə Connect [imzası](https://cosuite.io/az/developers/contract#signature) və hansı biznesin çağırdığını bildirən `X-CoSuite-Tenant` başlığı ilə gəlir. Başlıqlar, öhdəlikləriniz və xəta kodları üçün [Şlüz və müştəri API-si](https://cosuite.io/az/developers/customer-api) səhifəsinə baxın.

## Bazarlar və dillər {#markets}

- Müştəri yalnız **öz ölkəsində** təklif olunan modulları görür. `markets` siyahısını doldursan, modulun yalnız həmin ölkələrdə göstərilir.
- Hər bazarın dillərində mətn **məcburidir** (bax: [qaydalar](#rules)). Digər dillər istəyə bağlıdır.
- `price` həmin ölkə üçün yerli qiymət təyin edir. O olmadıqda CoSuite modulun USD qiymətini cari məzənnə ilə çevirir.
- `markets` boşdursa və ya yoxdursa, modulun harada təklif olunacağına CoSuite qərar verir.

## Açarlar daimidir {#permanent-keys}

Modulun canlıya çıxdıqdan sonra modul, funksiya, limit, scope və webhook açarları müqavilənin bir hissəsinə çevrilir. Onların adını dəyişmə; yeni açar əlavə et və köhnəsini ən azı 6 ay saxla (bax: [versiyalama](https://cosuite.io/az/developers/contract#versioning)).
