Перейти к содержимому

Mapping REST to gRPC

Маппинг REST-запроса API Gateway в gRPC-запрос backend-сервиса

Назначение

Документ описывает правила преобразования REST-запроса, полученного API Gateway от Frontend, в gRPC-запрос к ContractTerminationService.CreateTerminationRequest.

REST → gRPC request mapping

REST sourceREST fieldgRPC fieldПравило маппинга
PathcontractIdcontract_idПередать без изменений после проверки UUID
Auth contextcustomerIdcustomer_idПолучить из авторизационного контекста, не из request body
BodyreasonCodereason_codeПередать без изменений
BodydesiredTerminationDatedesired_termination_dateПередать в формате YYYY-MM-DD
BodybankDetails.bikbank_details.bikПередать без изменений
BodybankDetails.accountNumberbank_details.account_numberПередать без изменений
BodybankDetails.recipientNamebank_details.recipient_nameПередать без изменений
BodycommentcommentЕсли поле не передано, передать пустую строку
BodydocumentIds[]document_ids[]Если не передано, передать пустой массив
HeaderIdempotency-Keyidempotency_keyПередать без изменений
HeaderX-Correlation-Idcorrelation_idЕсли не передан, сгенерировать UUID на API Gateway
Header / metadataX-Client-TypesourcewebREQUEST_SOURCE_WEB, mobileREQUEST_SOURCE_MOBILE, иначе REQUEST_SOURCE_UNSPECIFIED

gRPC → REST response mapping

gRPC fieldREST fieldПравило маппинга
request_idrequestIdПередать как UUID string
request_numberrequestNumberПередать без изменений
statusstatusПреобразовать enum gRPC в REST enum
created_atcreatedAtПреобразовать в ISO 8601 datetime
idempotent_replay-Использовать для выбора HTTP-статуса

Правила выбора HTTP-статуса

УсловиеHTTP status
idempotent_replay = false201 Created
idempotent_replay = true200 OK

Маппинг статусов заявки

gRPC enumREST enum
TERMINATION_REQUEST_STATUS_DRAFTDRAFT
TERMINATION_REQUEST_STATUS_SUBMITTEDSUBMITTED
TERMINATION_REQUEST_STATUS_IN_REVIEWIN_REVIEW
TERMINATION_REQUEST_STATUS_WAITING_FOR_DOCUMENTSWAITING_FOR_DOCUMENTS
TERMINATION_REQUEST_STATUS_APPROVEDAPPROVED
TERMINATION_REQUEST_STATUS_REJECTEDREJECTED
TERMINATION_REQUEST_STATUS_CANCELLEDCANCELLED
TERMINATION_REQUEST_STATUS_COMPLETEDCOMPLETED
TERMINATION_REQUEST_STATUS_UNSPECIFIEDUNKNOWN

Маппинг ошибок gRPC → REST

gRPC codeBusiness error codeHTTP statusREST errorCode
INVALID_ARGUMENTVALIDATION_ERROR400VALIDATION_ERROR
NOT_FOUNDCONTRACT_NOT_FOUND404CONTRACT_NOT_FOUND
PERMISSION_DENIEDACCESS_DENIED403ACCESS_DENIED
FAILED_PRECONDITIONCONTRACT_NOT_ACTIVE422CONTRACT_NOT_ACTIVE
ALREADY_EXISTSACTIVE_REQUEST_ALREADY_EXISTS409ACTIVE_REQUEST_ALREADY_EXISTS
INVALID_ARGUMENTINVALID_TERMINATION_DATE422INVALID_TERMINATION_DATE
INVALID_ARGUMENTINVALID_BANK_DETAILS422INVALID_BANK_DETAILS
NOT_FOUNDDOCUMENT_NOT_FOUND422DOCUMENT_NOT_FOUND
UNAVAILABLESERVICE_UNAVAILABLE503SERVICE_UNAVAILABLE
INTERNALINTERNAL_ERROR500INTERNAL_ERROR

Важные правила

Не передавать customerId из тела запроса

customerId должен определяться только из авторизационного контекста. Это защищает систему от попытки создать заявку по чужому договору.

Не логировать банковские реквизиты

При логировании REST и gRPC payload необходимо маскировать:

ПолеПравило
accountNumberПоказывать только последние 5 символов
recipientNameЛогировать по требованиям ИБ
bikМожно логировать полностью, если ИБ не запрещает

Прокидывать correlationId

Если X-Correlation-Id передан Frontend, API Gateway должен использовать его. Если не передан, API Gateway должен сгенерировать новый идентификатор и передать его в gRPC.