Проект для практики тестирования REST API. Состоит из микросервисов для обработки заявок на выпуск банковских карт.
" ┌─────────────────────────┐
│ Клиенты │
│ │
└───────────┬─────────────┘
│
│ HTTPS
▼
┌─────────────────────────┐
│ alfa-campus-qa.ru │
│ (nginx proxy) │
└───────────┬─────────────┘
│
▼
┌─────────────────────────┐
│ card-issue-api │
│ /rest/practice/cards │
│ (Gateway) │
└───────────┬─────────────┘
│
┌────────────────┴────────────────┐
│ │
▼ ▼
┌─────────────────────┐ ┌─────────────────────────┐
│ user-api │ │ card-issue-operation-api│
│ /rest/practice/ │ │ /rest/practice/cards/ │
│ cards/user-api │ │ operation-api[-v2] │
└──────────┬──────────┘ └────────────┬────────────┘
│ │
│ │
▼ ▼
┌─────────────────────────────────────────────────────────┐
│ PostgreSQL │
│ ┌─────────────────────┐ ┌─────────────────────────┐ │
│ │ user_schema │ │ card_operation_schema │ │
│ │ (users table) │ │ (card_issue_requests) │ │
│ └─────────────────────┘ └─────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
| Сервис | Base URL |
|---|---|
| Card Issue API | https://alfa-campus-qa.ru/rest/practice/cards |
| User API | https://alfa-campus-qa.ru/rest/practice/cards/user-api |
| Operation API v1 | https://alfa-campus-qa.ru/rest/practice/cards/operation-api |
| Тип | Описание |
|---|---|
| На себя | cardHolder.userId указывает на существующего пользователя |
| На третье лицо | cardHolder.user содержит данные нового пользователя |
| Обезличенная карта | cardHolder.nameless = true |
nameless=false)userId + embossedName — для заявки на себяuser — для заявки на третье лицоnameless=true)userId, embossedName, user должны отсутствоватьsmsNotifications)phoneNumber — произвольный номер телефонаuserId — номер телефона из профиля пользователяОсновной сервис для выпуска карт. Координирует работу User API и Operation API.
| Метод | Endpoint | Описание |
|---|---|---|
| POST | /api/v1/card-issue |
Создать заявку на выпуск карты |
| GET | /api/v1/card-issue/{id} |
Получить заявку по ID |
| GET | /api/v1/card-issue/client/{clientId} |
Получить все заявки клиента |
| PATCH | /api/v1/card-issue/{id}/status |
Изменить статус заявки |
Сервис управления пользователями.
| Метод | Endpoint | Описание | Заголовки |
|---|---|---|---|
| POST | /api/v1/users |
Создать пользователя | - |
| GET | /api/v1/users/{id} |
Получить пользователя по ID | - |
| GET | /api/v1/users |
Получить всех пользователей | - |
| DELETE | /api/v1/users/{id} |
Удалить пользователя | - |
Сервис обработки операций выпуска карт.
| Метод | Endpoint | Описание |
|---|---|---|
| POST | /api/v1/operations |
Создать операцию |
| GET | /api/v1/operations/{id} |
Получить операцию по ID |
| GET | /api/v1/operations/by-owner/{cardOwner} |
Операции по владельцу карты |
| GET | /api/v1/operations/by-holder/{userId} |
Операции по держателю карты |
| PATCH | /api/v1/operations/{id}/status |
Изменить статус операции |
### Создать заявку на выпуск карты
```http
POST /rest/practice/cards/api/v1/card-issue
Host: alfa-campus-qa.ru
Content-Type: application/json
{
"request": {
"cardOwner": "UAAAAA",
"formFactor": "VIRTUAL",
"cardHolder": {
"userId": "UAAAAA",
"nameless": false,
"embossedName": "IVAN PETROV"
},
"options": {
"smsNotifications": {
"phoneNumber": "79001234567"
}
}
}
}
Ответ 201:
{
"requestId": "RCARDB23122025000001",
"status": "CREATED",
"statusCode": "STSCI01",
"failureReason": null
}
{
"request": {
"cardOwner": "UAAAAA",
"formFactor": "VIRTUAL",
"cardHolder": {
"nameless": true
}
}
}
Примечание: Блоки options и smsNotifications являются опциональными.
PATCH /rest/practice/cards/api/v1/card-issue/{id}/status
Host: alfa-campus-qa.ru
Content-Type: application/json
{
"status": "PROCESSING"
}
| Статус | Код | Описание |
|---|---|---|
| CREATED | STSCI01 | Заявка создана |
| PROCESSING | STSCI02 | В обработке |
| READY | STSCI03 | Карта готова (для VIRTUAL) |
| PLASTIC_READY | STSCI04 | Пластик готов (для PLASTIC) |
| FAILED | STSCI05 | Ошибка |
Автоматические переходы (по расписанию):
Ручной переход:
| Поле | Формат | Обязательное |
|---|---|---|
| firstName | До 150 символов | Да |
| middleName | До 150 символов | Нет |
| gender | MALE, FEMALE |
Да |
| clientType | UP, FL, IP |
Да |
| phone | 7XXXXXXXXXX (11 цифр, начинается с 7) |
Да |
| Валидный email | Да | |
| embossingName | Только заглавные латинские буквы и пробелы | Да |
| birthDate / issueDate | DD-MM-YYYY |
Да |
| passport.series | Ровно 4 цифры | Да |
| passport.number | Ровно 6 цифр | Да |
| account | RUR, USD, EUR |
Да |
| managerPin | X_XXXX (буква, подчёркивание, 4 символа) |
Да |
| Поле | Формат | Обязательное |
|---|---|---|
| cardOwner | XXXXXX (X + 5 алфавитно-цифровых) |
Да |
| formFactor | VIRTUAL, PLASTIC |
Да |
| cardHolder.userId | XXXXXX |
Нет* |
| cardHolder.nameless | true / false |
Да |
| cardHolder.embossedName | Только заглавные латинские буквы и пробелы | Нет* |
| options.smsNotifications.phoneNumber | 7XXXXXXXXXX |
Нет |
| options.smsNotifications.userId | XXXXXX |
Нет |
*При nameless=false требуется либо userId + embossedName, либо полный объект user
{
"timestamp": "2025-12-23T12:00:00",
"status": 404,
"error": "Not Found",
"message": "User not found with id: UXXXXX"
}
{
"timestamp": "2025-12-23T12:00:00",
"status": 400,
"error": "Bad Request",
"message": "Validation failed",
"errors": {
"contactInfo.phone": "Phone must start with 7 and contain exactly 11 digits"
}
}
{
"timestamp": "2025-12-23T12:00:00",
"status": 403,
"error": "Forbidden",
"message": "Invalid or missing X-secret header"
}
{
"timestamp": "2025-12-23T12:00:00",
"status": 409,
"error": "Conflict",
"message": "User with passport 4510 123456 already registered"
}
{
"requestId": "RCARDB23122025000001",
"status": "FAILED",
"statusCode": "STSCI05",
"failureReason": "User with id UXXXXX does not exist"
}
| Сущность | Формат | Пример |
|---|---|---|
| User | X + 5 символов |
XAAAAA, XAAAAB |
| Card Issue Request | RCARDB + ddMMyyyy + 6 цифр |
RCARDB23122025000001 |