GH GambleHub

API linting va statik tahlil

1) Nima uchun API lintlash kerak

API - jamoalar va tashqi integratorlar o’rtasidagi kontrakt. Linting va statik tahlil:
  • nomuvofiq va yashirin o’zgarishlarning oldini oladi;
  • maqomlarni, xatolarni, paginatsiyani, xavfsizlikni birxillashtiradi;
  • spetsifikatsiyalarni mashina-tekshiriladigan va relizlarni oldindan aytib bo’ladigan qiladi;
  • ovozi va onbording vaqtini kamaytiradi.

Printsip: "kontraktlar avtomatik tarzda tekshiriladi; Yashil lintingsiz PR saqlanmaydi".


2) Linting obyektlari

1. Kontraktlar: OpenAPI/AsyncAPI/GraphQL SDL, Protobuf/Avro/JSON Schema.
2. Amalga oshirish: REST/gRPC ruchkalar, middleware, maqom kodlari/sarlavhalar.
3. Infratuzilma: xavfsizlik sarlavhalari, limitlar, kesh siyosati.
4. Qo’shimcha artefaktlar: misollar (examples), Postman-kolleksiyalar, xato sxemalari.


3) HTTP API uchun asosiy qoidalar (tavsiya etilgan profil)

3. 1 Nota va URL

snake_case JSON, kebab-case yoki bir xil kebab-case/’/v1/...’.
Resurslar - koʻplik: ’/v1/payments’, ichki - ’/v1/wallets/{ id }/transactions’.
path-params sifatida identifikatorlar: ’/v1/payments/{ payment _ id}’(turi: string, formati: uuid).

3. 2 Usullar va maqomlar

’GET’ - 200/206;’POST’- 201 (+’Location’), mojarolar - 409; validatsiya - 422; limitlar - 429 (+’Retry-After’).
Xato uchun 200 qaytarilmasin. Shartli so’rovlar - 304’If-None-Match’bo’yicha.

3. 3 Xatolar (yagona format)

json
{ "code":"validation_error", "message":"amount must be ≥ 1", "trace_id":"...", "details":[{"field":"amount","reason":"min:1"}] }

Majburiy:’code’,’message’,’trace _ id’; lokal -’Content-Language’orqali.

3. 4 Paginatsiya/filtrlar

Cursor-based: `page_size`, `page_token`, ответ: `next_page_token`.
Filtrlar va saralash -’parameters’da hujjatlashtirilgan whitelists.

3. 5 Xavfsizlik

Yagona security sxemasi: OAuth2/OIDC scopes yoki mTLS; ’http’ (faqat’https’) ni taqiqlash.
Sezgir sarlavhalarni qaytarmaslik, namunalarda tokenlarni yashirish.

3. 6. Cheklovlar va o’lchamlar

Sarlavhalar/tana limitlari: 413/414/431; ruxsat etilgan maksimal qiymatlarni hujjatlashtiring.


4) Asboblar va ekotizim

4. 1 OpenAPI

Spectral (JSON/YAML lint), Redocly linter, oas-diff/openapi-diff (semantic diff), schemathesis/dredd (bajariladigan tekshiruvlar).

4. 2 Protobuf/gRPC

buf (lint + breaking check), protolint, SDK generatorlari; tahlil uchun gnostic.

4. 3 GraphQL

graphql-schema-linter, graphql-inspector (breaking).

4. 4 Kodli linterlar va SAST

ESLint, golangci-lint, Detekt/Ktlint, Pylint/Flake8, Semgrep (API-hidlar va security namunalari).


5) Qoidalar namunalari: Spectral/Redocly

5. 1 Spectral (misol’spectral. yaml`)

yaml extends: ["spectral:oas", "spectral:asyncapi"]
rules:
openapi-tags: off info-contact: error no-http: error path-kebab-case:
description: "Paths must be kebab-case"
given: "$.paths[]~"
severity: error then:
function: pattern functionOptions: { match: "^/(?:[a-z0-9]+(?--[a-z0-9]+)/?)+$" }
response-error-schema:
description: "Error responses must use standard schema"
given: "$.paths[][].responses[?(@property >= '400')]"
then:
field: "content.application/json.schema.$ref"
function: truthy id-as-uuid:
given: "$..parameters[?(@.name =~ /.id$/i)]"
then:
field: schema.format function: enumeration functionOptions: { values: ["uuid"] }

5. 2 Redocly (parcha’.redocly. yaml`)

yaml apis:
main: openapi.yaml lint:
extends:
- recommended rules:
no-ambiguous-paths: error operation-2xx-only: off operation-success-response:
severity: error where:
subject: response filterInParentKeys: ["200","201","204"]
operation-security-defined: error no-plain-http: error

6) Protobuf/gRPC: buf-profil

6. 1 `buf. yaml`

yaml version: v2 modules:
- path: proto lint:
use:
- DEFAULT except:
- PACKAGE_VERSION_SUFFIX # используем v1 в package breaking:
use:
- WIRE_JSON deps: []
Tavsiyalar:
  • Dala raqamlaridan qayta foydalanmaslik; olib tashlanadiganlar -’reserved’.
  • Yangi maydonlar -’optional’yoki defoltli; turlarini/semantikasini o’zgartirmaslik.

7) Semantik diff va «buzuvchi» o’zgarishlar

7. 1 HTTP

Breaking-misollar:
  • maydon turi/majburiyligini o’zgartirish;
  • maqom/yo’nalish/parametrni olib tashlash;
  • enum/diapazon torayishi;
  • id (uuid → string) formatini oʻzgartirish.
Neubreaking:
  • majburiy bo’lmagan maydonlarni qo’shish;
  • happy-path ga ta’sir qilmaydigan yangi maqomlar (masalan, hujjatlashtirilgan’422’);
  • enum kengayishi.

7. 2 gRPC/Protobuf

’reservedsiz’ maydonni olib tashlash/raqamni oʻzgartirish - breaking.
Turni oʻzgartirish (int32 → string) - breaking.
Yangi tagni optional sifatida qoʻshish - odatda safe.


8) Kontraktlar linting va kod aloqasi

Muvofiqlik ikki oqim bilan ta’minlanadi:

1. Shartnoma → kod: SDK/server qulflarini yaratish, testlardagi salbiy misollar.

2. Kod → kontrakt: spetsifikatsion testlar, maqom/sarlavhalarni avtomatik tekshirish.

Semgrep gʻoyalari:
  • taqiqlash’return 200’bilan’error! = nil’;
  • to’lovlarning write-yo’nalishlarida majburiy «Idempotency-Key»;
  • loglarda tokenlarni yashirish.

9) CI/CD paypline (referens)


pre-commit: spectral lint, redocly lint
PR gate:  openapi-diff (base..PR), buf breaking-check, graphql-inspector build:   schemathesis smoke, unit/integration linters (ESLint/golangci-lint)
release:  publish contracts (artifact/broker), sign & tag
PR quyidagi hollarda tushishi kerak:
  • breaking-diff mavjud;
  • bazaviy qoidalar buzilgan (maqomi/xavfsizligi/xatolari);
  • parametrlarning namunalari/tavsiflari mavjud emas.

10) Qoidalar katalogi (tashkilotingiz uchun namunasi)

Identifikatorlar va turlar

`_id` — `string`, `format: uuid`.
Pul maydonlari -’string ’/’ decimal’s scale; valyuta - ISO-4217.

Xatolar

Yagona sxema (§ 3 ga qarang. 3), kodlari:’400/401/403/404/409/422/429/5xx’.
Har doim’trace _ id’;’Retry-After’uchun 429/503.

Paginatsiya

Faqat cursor; max’page _ size’hujjatlashtirilgan.

Xavfsizlik

Barcha operatsiyalar -’security’blok; ’scopes’ tasvirlangan.
Hech qanday’http:’havolalar; TLS 1. 2+.

Kesh/idempotentlik

Для GET — `ETag/Last-Modified`; write uchun -’Idempotency-Key’(qo’llanilishi mumkin bo’lgan joyda).

Hujjatlar

’summary’,’description’, soʻrov/javob namunalari (haqiqiy).


11) Avtomatlashtirilgan tekshirishlar namunalari

11. 1 Majburiy xavfsizlik sarlavhalarini tekshirish (Spectral)

yaml security-headers:
given: "$.paths[][].responses['200'].headers"
then:
function: truthy

11. 2 openapi-diff (psevdo CI-qadam)


openapi-diff --fail-on-incompatible base.yaml pr.yaml

11. 3 buf breaking-check


buf breaking --against '.git#branch=main'

12) Kontraktlar sifatining kuzatilishi

Metriklar: linting xatolari bilan PR ulushi, fix vaqti, breaking-urinishlar soni, qoidalar bo’yicha «qarzlar».
Dashbordlar: yagona xato sxemasiga migratsiya taraqqiyoti, misollar bilan qoplash, versiyalarning barqarorligi.


13) Antipatternlar

«Doc» koddan alohida yashaydi → rassinxronizatsiya. Shartnomani xizmatning yonida saqlang va versiyalangan artefaktni chiqaring.
Linter faqat qoʻlda. Qattiq PR-gate kerak.
Tasodifiy misollar (non-deterministic) - tekshirishlarda fleykalar.
Salbiy misollar va xato kodlari yo’qligi.
Har bir servis uchun xato sxemasini qayta ishlab chiqish.
Protobuf breaking tekshiruvlarini eʼtiborsiz qoldirish.


14) iGaming/Moliya xususiyatlari

Pul maydonlari - belgilangan masshtab/yaxlitlash; float taqiqlanadi.
Majburiy sarlavhalar’X-Tenant’,’X-Region’va trastirovka’traceparent’.
To’lov write-ruchkalar:’Idempotency-Key’,’Retry-After’va to’g "ri 409/201 semantiklar mavjudligini tekshirish.
PSP/KYC: HMAC/mTLS vebxuklari’securitySchemes’da tasvirlangan; anti-replay (’X-Timestamp’, oyna).
Mintaqaviy cheklovlar va xatolarni mahalliylashtirish (’Content-Language’).


15) Prod-tayyorlik chek-varaqasi

  • Spectral/Redocly profillari rasmiylashtirilgan va pre-commit va PR-gate ga ulangan.
  • Xatolar va maqomlarning yagona sxemasi - qayd etildi va tekshirilmoqda.
  • openapi-diff/GraphQL Inspector/buf - breaking-oʻzgarishlarni blokirovka qiladi.
  • So’rovlar/javoblar namunalari validna; paginatsiya/filtrlar hujjatlashtirilgan.
  • SecuritySchemes va scopes to’ldirilgan; Hech qanday http bogʻlamalari yoʻq.
  • Protobuf uchun:’reserved’masofadagi taglarda; yangi maydonlar - optional.
  • Semgrep/kod linterlari kiritilgan; sahifalarda sirlarni yashirish.
  • CI shartnomalar artefaktlari va linting hisobotlarini nashr etadi.
  • Pleybuk: breaking-diffda (rollback, hotfix, integratorlarga bildirishnomalar) qanday harakat qilish kerak.

16) TL; DR

Kontraktlarning avtomatik lintingini (Spectral/Redocly, buf/GraphQL Inspector) va semantik diffni joriy qiling, xatolar/maqomlar/paginatsiya/xavfsizlikning yagona sxemasini qayd eting, PR-gate-ga ulaning va kontraktlarni artefakt sifatida nashr eting. Har qanday breaking-diff - to’xtash signali. Pul/to’lovlar uchun - alohida qoidalar (idempotentlik,’Retry-After’, HMAC/mTLS).

Contact

Biz bilan bog‘laning

Har qanday savol yoki yordam bo‘yicha bizga murojaat qiling.Doimo yordam berishga tayyormiz.

Integratsiyani boshlash

Email — majburiy. Telegram yoki WhatsApp — ixtiyoriy.

Ismingiz ixtiyoriy
Email ixtiyoriy
Mavzu ixtiyoriy
Xabar ixtiyoriy
Telegram ixtiyoriy
@
Agar Telegram qoldirilgan bo‘lsa — javob Email bilan birga o‘sha yerga ham yuboriladi.
WhatsApp ixtiyoriy
Format: mamlakat kodi va raqam (masalan, +998XXXXXXXX).

Yuborish orqali ma'lumotlaringiz qayta ishlanishiga rozilik bildirasiz.