{"id":32078523,"url":"https://github.com/kossahokia/bankcards","last_synced_at":"2026-04-13T03:43:55.859Z","repository":{"id":317506169,"uuid":"1067673365","full_name":"kossahokia/bankcards","owner":"kossahokia","description":"REST API for managing bank cards. Built with Java 21, Spring Boot, PostgreSQL, Liquibase, JWT, Docker, Swagger. Includes full authentication, roles, transfers \u0026 admin features.","archived":false,"fork":false,"pushed_at":"2025-10-16T12:31:10.000Z","size":193,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-17T15:16:17.051Z","etag":null,"topics":["backend","docker","java","jwt","liquibase","openapi","postgresql","rest-api","springboot","swagger"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kossahokia.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-01T08:01:44.000Z","updated_at":"2025-10-16T12:31:13.000Z","dependencies_parsed_at":null,"dependency_job_id":"157cec30-178f-42c0-aab2-aee4340e181d","html_url":"https://github.com/kossahokia/bankcards","commit_stats":null,"previous_names":["kossahokia/bankcards"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kossahokia/bankcards","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kossahokia%2Fbankcards","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kossahokia%2Fbankcards/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kossahokia%2Fbankcards/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kossahokia%2Fbankcards/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kossahokia","download_url":"https://codeload.github.com/kossahokia/bankcards/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kossahokia%2Fbankcards/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31739050,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T03:27:07.512Z","status":"ssl_error","status_checked_at":"2026-04-13T03:26:53.610Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backend","docker","java","jwt","liquibase","openapi","postgresql","rest-api","springboot","swagger"],"created_at":"2025-10-19T08:21:07.159Z","updated_at":"2026-04-13T03:43:55.850Z","avatar_url":"https://github.com/kossahokia.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 💳 BankCards REST API\n\nBackend-приложение для управления банковскими картами.  \nПозволяет пользователям просматривать свои карты, делать переводы между ними,  \nа администраторам — управлять пользователями и картами.\n\nРеализовано на **Spring Boot 3**, **Java 21**, **PostgreSQL**, **JWT Security**.\n\n## 🚀 Запуск проекта\n\n### 🔧 Требования\n- Java 21+\n- Docker \u0026 Docker Compose\n- Maven 3.9+\n\n### ▶️ Быстрый запуск через Docker Compose\n\n```bash\ngit clone https://github.com/kossahokia/bankcards.git\ncd bankcards\ndocker compose up --build\n```\n\n### 🌐 URL для работы с приложением\n| Сервис        | URL                                                                                        |\n| ------------- | ------------------------------------------------------------------------------------------ |\n| 🧠 API        | [http://localhost:8080](http://localhost:8080)                                             |\n| 📘 Swagger UI | [http://localhost:8080/swagger-ui/index.html](http://localhost:8080/swagger-ui/index.html) |\n| 🗄️ PgAdmin   | [http://localhost:8081](http://localhost:8081)                                             |\n\n### 🧾 Данные для входа в PgAdmin:\n- Email: kostya4j@gmail.com\n- Пароль от pgAdmin: postgres\n- Пароль от сервера BankCards DB: postgres\n\n## 🧱 Архитектура проекта\n\n```text\n📁 src\n├─📂 main\n│  ├─📂 java/com/example/bankcards\n│  │  ├─📁 config\n│  │  ├─📁 controller\n│  │  ├─📁 dto\n│  │  │   └─📁 enums\n│  │  ├─📁 entity\n│  │  │   └─📁 enums\n│  │  ├─📁 exception\n│  │  │   └─📁 customexceptions\n│  │  ├─📁 repository\n│  │  ├─📁 security\n│  │  ├─📁 service\n│  │  └─📁 util\n│  └─📂 resources\n│      └─📂 db/migration\n└─📂 test\n   ├─📂 java/com/example/bankcards\n   │  ├─📁 controller\n   │  └─📁 service\n   └─📂 resources\n```\n\n## 🔐 Безопасность\n- JWT (JSON Web Token) — аутентификация без сессий\n- Spring Security 6 — разграничение доступа\n- BCrypt — безопасное хранение паролей\n- **CORS** — глобальная конфигурация через `WebConfig`  \n  (глобальный `CorsConfigurationSource` + `http.cors()` в `SecurityConfig`)\n\n### ⚖️ Роли:\n- **ADMIN** — полное управление пользователями и картами\n- **USER** — просмотр и переводы между своими картами\n\n### 🧑‍💼 Администратор по умолчанию (из миграций Liquibase):\n- username: admin\n- password: admin123\n\n## 💳 Основные функции API\n### AuthController (/api/auth)\n| Метод  | Endpoint    | Описание                        |\n| ------ | ----------- | -------------------------------- |\n| `POST` | `/login`    | Аутентификация, получение JWT   |\n| `POST` | `/register` | Регистрация нового пользователя |\n\n### AdminController (/api/admin) (только для ADMIN)\nПользователи:\n| Метод    | Endpoint                                | Описание                                            |\n| -------- | --------------------------------------- | --------------------------------------------------- |\n| `POST`   | `/users`                                | Создание пользователя                               |\n| `GET`    | `/users`                                | Просмотр пользователей (фильтрация + пагинация)     |\n| `GET`    | `/users/{id}`                           | Получить пользователя по ID                         |\n| `PATCH`  | `/users/{id}/status?enabled=true`       | Активировать / деактивировать                       |\n| `PATCH`  | `/users/{id}/role?roleName=USER`        | Назначить роль                                      |\n| `PATCH`  | `/users/{id}/role/remove?roleName=USER` | Удалить роль                                        |\n| `DELETE` | `/users/{id}`                           | Удалить пользователя                                |\n| `GET`    | `/users/{id}/cards`                     | Получить карты пользователя                         |\n\nКарты:\n| Метод    | Endpoint                            | Описание                                 |\n| -------- | ----------------------------------- | ---------------------------------------- |\n| `POST`   | `/cards`                            | Создать новую карту                      |\n| `GET`    | `/cards`                            | Список всех карт (с фильтром по статусу) |\n| `PATCH`  | `/cards/{id}/status?status=BLOCKED` | Изменить статус карты                    |\n| `DELETE` | `/cards/{id}`                       | Удалить карту                            |\n\n### CardController (/api/cards)\n| Метод  | Endpoint              | Описание                                |\n| ------ | --------------------- | --------------------------------------- |\n| `GET`  | `/`                   | Просмотр своих карт (фильтр, пагинация) |\n| `GET`  | `/{id}/balance`       | Баланс карты                            |\n| `POST` | `/{id}/request-block` | Запрос на блокировку карты              |\n| `POST` | `/transfer`           | Перевод между своими картами            |\n\n## 🧬 Модели данных\n\n### User\n| Поле     | Тип       | Описание               |\n| -------- | ----------| ---------------------- |\n| id       | Long      | ID пользователя        |\n| username | String    | Уникальный логин       |\n| password | String    | Хэшированный пароль    |\n| fullName | String    | Полное имя             |\n| enabled  | boolean   | Активен / заблокирован |\n| roles    | Set\u003cRole\u003e | Список ролей           |\n| cards    | Set\u003cCard\u003e | Список карт            |\n\n### Card\n| Поле        | Тип        | Описание                 |\n| ------------ | -----------| -------------------------|\n| id          | Long        | ID карты                 |\n| cardNumber  | String      | Номер карты (зашифрован) |\n| expiryDate  | LocalDate   | Срок действия            |\n| balance     | BigDecimal  | Баланс карты             |\n| status      | CardStatus  | Статус карты             |\n| owner       | User        | Владелец карты           |\n\n### Role\n| Поле | Тип    | Описание                        |\n| ---- | ------ | -------------------------------- |\n| id   | Long   | ID роли                         |\n| name | String | Название роли (`USER`, `ADMIN`) |\n\n## 🗝️ Шифрование и маскирование\n- Номера карт шифруются (AES-128) и маскируются при выводе (`**** **** **** 1234`)\n- Проверка срока действия выполняется в `CardExpiryUtil`\n- Баланс хранится в `BigDecimal` с точностью 2 знака\n\n## 🪛 Конфигурация\n\n### `application.yml`\n- Настройки PostgreSQL (через Docker)\n- Liquibase changelogs\n- JWT параметры (`secret`, `expiration`)\n- Уровни логирования (`WARN`, `INFO`)\n\n### `application-test.yml`\n- Testcontainers (PostgreSQL 16)\n- Liquibase отключён в интеграционных тестах (схема создаётся через JPA)\n- Автоматическое создание схемы Hibernate\n\n## 🧪 Тестирование\n| Тип                  | Кол-во   | Описание                    |\n| -------------------- | -------- | --------------------------- |\n| **Unit-тесты**       | ~115     | Сервисы и контроллеры       |\n| **Integration-тест** | 1        | Smoke-тест с Testcontainers |\n| **Фреймворки**       | JUnit 5, Mockito, AssertJ, Spring Boot Test |\n\n### Запуск тестов\n```bash\nmvn clean test\n```\n\n## 🗃️ Миграции БД (Liquibase)\n- Все миграции описаны в YAML и подключены через `db.changelog-master.yaml`\n- Используются **preConditions** для защиты от повторных запусков:\n    - Проверка наличия таблиц перед `createTable`\n    - Проверка наличия колонок перед `addColumn`\n    - Проверка записей перед `insert`\n- Liquibase миграции полностью идемпотентны и безопасны для CI/CD\n\n## 📖 JavaDoc\n- Все **рабочие и тестовые классы** содержат JavaDoc-комментарии\n- Генерация документации:\n  ```bash\n  mvn javadoc:javadoc\n  ```\n- Результат: `target/site/apidocs/index.html`\n- Документация покрывает сервисы, контроллеры, сущности, DTO и утилиты\n\n## 🐳 Docker окружение\n`docker-compose.yml` поднимает:\n| Сервис        | Версия | Порт |\n| ------------- | ------ | ---- |\n| PostgreSQL    | 16     | 5432 |\n| PgAdmin       | 8      | 8081 |\n| BankCards App | —      | 8080 |\n\n## 📚 Документация API\n- Swagger UI: http://localhost:8080/swagger-ui/index.html\n- OpenAPI спецификация: `bank_rest/openapi.yaml`\n- Все эндпоинты снабжены аннотациями `@Operation`, `@ApiResponses`, `@Schema`\n- Поддерживаются статусы ошибок: 400, 401, 403, 404, 422, 500\n\n## 💻 Технологии\n| Категория | Технология                       |\n| --------- | -------------------------------- |\n| Backend   | Java 21, Spring Boot 3.3         |\n| Security  | Spring Security 6, JWT           |\n| DB        | PostgreSQL 16, Liquibase         |\n| Docs      | Swagger / OpenAPI 3, JavaDoc     |\n| Testing   | JUnit 5, Mockito, Testcontainers |\n| DevOps    | Docker, Docker Compose           |\n| Utils     | AES Encryption, Card Masking     |\n\n---\n\n## 👨‍💻 Автор\n✨ **Konstantin Sakhokiia — Java Backend Engineer**  \n📧 kostya4j@gmail.com  \n📧 kos.sahokia@yandex.ru  \n🐙 github.com/kossahokia  \n💬 Telegram: @kossahokia\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkossahokia%2Fbankcards","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkossahokia%2Fbankcards","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkossahokia%2Fbankcards/lists"}