GH GambleHub

Асбоби API ва таҳлили статикӣ

1) Чаро пайванди API

API - шартнома байни дастаҳо ва интеграторҳои беруна. Таҳлили линт ва статикӣ:
  • Пешгирии тағироти номувофиқ ва номуайян
  • муттаҳид кардани статусҳо, хатогиҳо, бутпарастӣ, амният;
  • мушаххасоти мошинро тафтиш кунед ва релизҳоро пешгӯишаванда созед;
  • арзиши баррасӣ ва вақти боркуниро кам кунед.

Принсип: "шартномаҳо ба таври худкор тафтиш карда мешаванд; PR бидуни линтинги сабз нигоҳ надорад"


2) Иншооти линтинг

1. Шартномаҳо: Open

2. Амалисозӣ: Қаламҳои REST/GRPC, миёнаравӣ, рамзҳои ҳолат/сарлавҳаҳо.
3. Инфрасохтор: сарлавҳаҳои амният, маҳдудиятҳо, сиёсати кэш.
4. Артефактҳои марбута: намунаҳо, маҷмӯаҳои почтачиён, схемаҳои хатогӣ.


3) Қоидаҳои асосӣ барои HTTP API (профили тавсияшуда)

3. 1 Notation ва URL

snake_case дар мақомоти JSON, ҳолати кабоб дар роҳҳо, ё кебаб-ҳолати ягона/'/v1/... '.
Захираҳо - ҷамъ: '/v1/пардохтҳо ', лона - '/v1/ҳамён/{ id }/транзаксияҳо'.
Идентификаторҳо ҳамчун path-params: '/v1/payments/{ pay _ id} '(намуд: сатр, формат: uuid).

3. 2 Усулҳо ва статусҳо

'ГЕТ' - 200/206; ' POST '- 201 (+' Ҷойгиршавӣ '), муноқишаҳо - 409; санҷиш - 422; маҳдудиятҳо - 429 (+ 'Retry-After').
Барои хатогиҳо 200-ро барнагардонед. Дархостҳои шартӣ - 304 аз ҷониби 'If-None-Match'.

3. 3 Хатогӣ (формати ягона)

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

Талаб карда мешавад: 'рамз', 'паём', 'trace _ id'; locale - тавассути 'Мазмун-Забон'.

3. 4 Пагинатсия/филтрҳо

Курсор дар асоси: 'page _ size', 'page _ token', otvet: 'next _ page _ token'.
Филтрҳо ва навъбандӣ - сафедпӯстон дар 'параметрҳо' ҳуҷҷатгузорӣ шудаанд.

3. 5 бехатарӣ

Схемаи ягонаи бехатарӣ: OAuth2/OIDC миқёс ё MTLS; рад 'http' (танҳо 'https').
Сарлавҳаҳои ҳассосро барнагардонед, нишонаҳои ниқобро дар мисолҳо.

3. 6 Маҳдудиятҳо ва андозаҳо

Маҳдудиятҳои унвон/бадан: 413/414/431; Қиматҳои ҳадди аксарро ҳуҷҷатгузорӣ кунед.


4) Воситаҳо ва экосистема

4. 1 Кушодани API

Спектрал (JSON/YAML lint), linter Redocly, oas-diff/openapi-diff (diff семантикӣ), схематез/дредд (санҷишҳо идома доранд).

4. 2 Protobuf/GRPC

буф (линт + шикастани чек), протолинт, генераторҳои SDK; гностикӣ барои таҳлил.

4. 3 Диаграммаи QL

graphql-schema-linter, graphql-инспектор (шикастан).

4. 4 Linters Code ва SAST

ESL mint, golangci-lint, Detekt/Ktlint, Pylint/Flake8, Semgrep (бӯи API ва қолабҳои амниятӣ).


5) Намунаҳои қоида: Спектралӣ/Redocly

5. 1 Спектралӣ (мисол 'спектралӣ. 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 (порча '.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

6. 1 'буф. ямл '

yaml version: v2 modules:
- path: proto lint:
use:
- DEFAULT except:
- PACKAGE_VERSION_SUFFIX # используем v1 в package breaking:
use:
- WIRE_JSON deps: []
Тавсияҳо:
  • Рақамҳои майдонро аз нав истифода набаред; нест карда шуд - дар 'захирашуда'.
  • Майдонҳои нав - 'ихтиёрӣ' ё бо пешфарз; намудҳо/семантикаро тағир надиҳед.

7) Тағйироти семантикӣ ва "шикастан"

7. 1 HTTP

Намунаҳои шикаста:
  • Дигаргун кардани намуди майдон/ҳатмӣ
  • Нест кардани ҳолат/масир/параметр
  • тангии enum/диапазон;
  • тағир додани формати id (uuid → string).
Шикастан:
  • Илова кардани майдонҳои иловагӣ
  • Статусҳои нав, ки ба роҳи хушбахт таъсир намерасонанд (масалан, ҳуҷҷатгузории '422')
  • тамдиди enum.

7. 2 GRPC/Протобуф

Нест кардани майдон бе 'захирашуда '/азнавсозӣ - шикастан.
Тағйири намуд (int32 → сатр) - шикастан.
Илова кардани теги нав ҳамчун ихтиёрӣ одатан бехатар аст.


8) Робита бо шартнома ва кодекс

Мутобиқат бо ду ришта таъмин карда мешавад:

1. Шартнома → рамз: тавлиди стубҳои SDK/сервер, намунаҳои манфӣ дар озмоишҳо.

2. Шартнома → рамз: санҷишҳои мушаххас, санҷиши автоматии статусҳо/сарлавҳаҳо.

Ғояҳои Semgrep:
  • манъ кардани 'return 200' when 'error! = нил';
  • 'Idempotency-Key' ҳатмӣ дар хатсайрҳои пардохт;
  • нишонаҳои ниқоб дар гузоришҳо.

9) Лӯлаи CI/CD (истинод)


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 меафтад, агар:
  • шикаста-фарқ вуҷуд дорад;
  • Қоидаҳои асосӣ вайрон карда шуданд (статусҳо/амният/хатогиҳо)
  • намунаҳо/тавсифи параметрҳо вуҷуд надоранд.

10) Феҳристи қоидаҳо (қолаб барои ташкили шумо)

Идентификаторҳо ва намудҳо

'_ id' - 'сатр', 'формат: uuid'.
Майдонҳои пулӣ - 'сатр '/' даҳӣ' бо миқёс; асъор - ISO-4217.

Хатогиҳо

Схемаи ягона (ниг. § 3. 3), рамзҳо: '400/401/403/404/409/422/429/5xx'.
Ҳамеша 'пайгирӣ _ id'; ' Retry-After 'for 429/503.

Пагинатсия

Танҳо курсор; max 'page _ size' ҳуҷҷатгузорӣ шудааст.

Бехатарӣ

Ҳама амалиётҳо - блоки 'амният'; 'соҳаҳо' тавсиф карда мешаванд.
Истиноди 'http:' нест; TLS 1. 2+.

Кэш/idempotency

Для ГЕТ - 'ET jag/Last-Modified'; барои навиштан - 'Idempotency-Key' (агар лозим бошад).

Ҳуҷҷатгузорӣ

'summary', 'тавсиф', намунаҳои дархостҳо/ҷавобҳо (эътибор).


11) Намунаҳои чекҳои автоматӣ

11. 1 Санҷиши сарлавҳаҳои амнияти ҳатмӣ (Спектралӣ)

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

11. 2 openapi-diff (қадами псевдо CI)


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

11. 3 шикастани буф


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

12) Риояи сифати шартномаҳо

Нишондиҳандаҳо: ҳиссаи PR-ҳо бо хатогиҳои алоқаманд, ислоҳи вақт, шумораи кӯшиши шикастан, "қарзҳо" тибқи қоидаҳо.
Панели панелҳо: пешрафти муҳоҷират ба нақшаи ягонаи хатогӣ, фарогирӣ бо мисолҳо, устувории версия.


13) Антипаттернҳо

"Док" аз рамзи → desynchronization алоҳида зиндагӣ мекунад. Шартномаро ба хидмат наздик нигоҳ доред ва артефакти боэътимодро раҳо кунед.
Линтер танҳо бо дасти. Ба дарвозаи сахт PR лозим аст.
Мисолҳои тасодуфӣ (ғайримуқаррарӣ) - зарбаҳо дар чекҳо.
Ягон намунаҳои манфӣ ва рамзҳои хато нестанд.
Бозсозии нақшаи хатогӣ барои ҳар як хидмат.
Нодида гирифтани чекҳои шикастани Protobuf (иваз кардани барчасбҳо "бо чашм").


14) Хусусиятҳои IGaming/Finance

Майдонҳои асъор - миқёси собит/яклухткунӣ; манъи шино.
Сарлавҳаҳои ҳатмии 'X-иҷорагир', 'X-Region' ва пайгирӣ 'пайгирӣ'.
Дастурҳои хаттии пардохт: санҷиши 'Idempotency-Key', 'Retry-After' ва семантикаи 409/201 дуруст.
Webhooks PSP/KYC: HMAC/m зидди такрорӣ ('X-Timestamp', тиреза).
Маҳдудиятҳои минтақавӣ ва маҳаллисозии хатогиҳо ('Мундариҷа-забон').


15) Рӯйхати санҷиши омодагии Prod

  • Профилҳои спектралӣ/Redocly дар пеш аз ӯҳдадорӣ ва PR-дарвоза тарҳрезӣ ва пайваст карда шудаанд.
  • Намунаи хатогӣ ва ҳолати ягона - содир ва тафтиш карда мешавад.
  • openapi-diff/Инспектор/GraphQL - тағиротҳои шикастани блок.
  • Намунаҳои дархостҳо/ҷавобҳо дурустанд; пагинатсия/филтрҳо ҳуҷҷатгузорӣ шудаанд.
  • Схемаҳо ва миқёсҳо пур карда мешаванд; Ягон пайванди http вуҷуд надорад.
  • Барои Protobuf: дар барчасбҳои ҳазфшуда 'захира карда шудааст'; майдонҳои нав - ихтиёрӣ.
  • linters Semgrep/code фаъол аст; ниқоб кардани асрори гузоришҳо.
  • CI артефактҳои шартномавӣ ва ҳисоботҳои линтингро нашр мекунад.
  • Китоби бозӣ: ҳангоми шикастани диффа чӣ гуна бояд амал кард (бозгашт, hotfix, огоҳиҳо ба интеграторҳо).

16) TL; ДР

Иҷрои линтинги автоматии шартномавӣ (Spectral/Redocly, buf/нозири графикӣ) ва diff семантикӣ, як хатогӣ/ҳолат/пагинатсия/амниятро ислоҳ кунед, PR-дарвозаро пайваст кунед ва шартномаҳоро ҳамчун артефакт нашр кунед. Ҳар гуна фарқияти шикаста нури тормоз аст. Барои пул/пардохтҳо - қоидаҳои махсус (idempotency, 'Retry-After', HMAC/MTLS).

Contact

Тамос гиред

Барои саволҳо ё дастгирӣ ба мо муроҷиат кунед.Мо ҳамеша омодаем!

Оғози интегратсия

Email — муҳим аст. Telegram ё WhatsApp — ихтиёрӣ.

Номи шумо ихтиёрӣ
Email ихтиёрӣ
Мавзӯъ ихтиёрӣ
Паём ихтиёрӣ
Telegram ихтиёрӣ
@
Агар Telegram нависед — ҷавобро ҳамон ҷо низ мегиред.
WhatsApp ихтиёрӣ
Формат: рамзи кишвар + рақам (масалан, +992XXXXXXXXX).

Бо фиристодани форма шумо ба коркарди маълумот розӣ ҳастед.