ΠΠ΅Π±ΠΎΠ»ΡΡΠ°Ρ RESTful ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π±Π°Π½ΠΊΠΎΠ²ΡΠΊΠΈΠΌΠΈ ΠΊΠ°ΡΡΠ°ΠΌΠΈ. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π΄Π»Ρ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ Π·Π°Π΄Π°Π½ΠΈΡ Π½Π° ΠΏΠΎΠ·ΠΈΡΠΈΡ Java Developer.
ΠΡΠΎΠ΅ΠΊΡ ΠΏΠΎΠΊΡΡΠ²Π°Π΅Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ Π±ΠΈΠ·Π½Π΅Ρ-ΡΡΠ΅Π½Π°ΡΠΈΠΈ: ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΈ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ (JWT), ΡΠΎΠ»ΠΈ (ADMIN/USER), CRUD ΠΊΠ°ΡΡ, ΠΏΠΎΠΈΡΠΊ/ΠΏΠ°Π³ΠΈΠ½Π°ΡΠΈΡ, ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ²ΠΎΠΈΠΌΠΈ ΠΊΠ°ΡΡΠ°ΠΌΠΈ, ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅ΡΠΎΠ² ΠΊΠ°ΡΡ ΠΈ ΠΌΠ°ΡΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈ Π²ΡΠ²ΠΎΠ΄Π΅.
- Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»
- Π’Π΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ
- Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ
- ΠΡΡΡΡΡΠΉ ΡΡΠ°ΡΡ (Docker)
- ΠΠ°ΠΏΡΡΠΊ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ (Maven)
- ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ / ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
- ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ API (OpenAPI / Swagger)
- ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠΎΠ² (curl)
- Π’Π΅ΡΡΡ
- ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΠΈ Π·Π°ΠΌΠ΅ΡΠ°Π½ΠΈΡ
- Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ Π»ΠΎΠ³ΠΈΠ½ (JWT).
- Π ΠΎΠ»ΠΈ:
ROLE_ADMINΠΈROLE_USER. - CRUD ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΠΊΠ°ΡΡΠ°ΠΌΠΈ (ADMIN): ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅, Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°, Π°ΠΊΡΠΈΠ²Π°ΡΠΈΡ, ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ.
- ΠΡΠΎΡΠΌΠΎΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΊΠ°ΡΡ (USER) Ρ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠ΅ΠΉ ΠΏΠΎ ΡΡΠ°ΡΡΡΡ ΠΈ ΠΏΠ°Π³ΠΈΠ½Π°ΡΠΈΠ΅ΠΉ.
- ΠΠ°ΠΏΡΠΎΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΊΠ°ΡΡΡ ΠΎΡ Π²Π»Π°Π΄Π΅Π»ΡΡΠ° (USER).
- ΠΠ΅ΡΠ΅Π²ΠΎΠ΄Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ²ΠΎΠΈΠΌΠΈ ΠΊΠ°ΡΡΠ°ΠΌΠΈ (USER) Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΠΌΠΈ:
- ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ Π»ΠΈ ΠΊΠ°ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ,
- Π°ΠΊΡΠΈΠ²Π½ΡΠΉ ΡΡΠ°ΡΡΡ,
- Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π»ΠΈ Π±Π°Π»Π°Π½ΡΠ°,
- Π½Π΅Π»ΡΠ·Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡ Π½Π° ΡΡ ΠΆΠ΅ ΠΊΠ°ΡΡΡ.
- ΠΠΎΠΌΠ΅ΡΠ° ΠΊΠ°ΡΡ Ρ
ΡΠ°Π½ΡΡΡΡ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ (AES), ΠΏΡΠΈ Π²ΡΠ²ΠΎΠ΄Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΌΠ°ΡΠΊΠ°
**** **** **** 1234. - Migrations: Liquibase changelogs Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ°Π±Π»ΠΈΡ.
- Swagger/OpenAPI Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ.
- Java 17
- Spring Boot 3.x
- Spring Security (JWT)
- Spring Data JPA (Hibernate)
- PostgreSQL
- Liquibase
- Docker / Docker Compose
- jjwt (JWT)
- springdoc-openapi (Swagger)
- Maven, JUnit5, Mockito
- Docker & Docker Compose (ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ Π΄Π»Ρ dev)
- Java 17 (Π΄Π»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ°)
- Maven (Π΄Π»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ±ΠΎΡΠΊΠΈ)
Π ΠΊΠΎΡΠ½Π΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΅ΡΡΡ docker-compose.yml, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅Ρ Postgres ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
-
Π‘Π±ΠΎΡΠΊΠ° ΠΈ Π·Π°ΠΏΡΡΠΊ:
- docker-compose up --build
-
ΠΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ°:
- ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ: http://localhost:8080
- Swagger UI: http://localhost:8080/swagger-ui.html (ΠΈΠ»ΠΈ /api/docs Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ)
Docker Compose ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π²Π½ΡΡΡΠΈ ΡΠ°ΠΉΠ»Π° β ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΡΠΉΡΠ΅ docker-compose.yml ΠΈ application.yml.
- ΠΠΎΠ΄Π½ΡΡΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ PostgreSQL (Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π· Docker).
- ΠΠ°ΡΡΡΠΎΠΈΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π²
src/main/resources/application.ymlΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ. - Π‘ΠΎΠ±ΡΠ°ΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ:
- ./mvnw clean package
- java -jar target/bankcards-0.0.1-SNAPSHOT.jar
(ΠΈΠ»ΠΈ
mvn spring-boot:run)
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ Liquibase ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ ΠΏΡΠΈ ΡΡΠ°ΡΡΠ΅ (ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡ users, cards ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ²).
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ Π² application.yml:
- spring.datasource.url β JDBC URL ΠΠ
- spring.datasource.username
- spring.datasource.password
- security.jwt.secret β ΡΠ΅ΠΊΡΠ΅Ρ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ JWT (ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π² ΠΏΡΠΎΠ΄Π΅ Π½Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ)
- security.jwt.expiration β ΡΡΠΎΠΊ ΠΆΠΈΠ·Π½ΠΈ ΡΠΎΠΊΠ΅Π½Π° (ms)
- security.jwt.issuer
- security.card-encryption.secret β ΡΠ΅ΠΊΡΠ΅Ρ Π΄Π»Ρ AES ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ Π½ΠΎΠΌΠ΅ΡΠΎΠ² ΠΊΠ°ΡΡ (ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 16 Π±Π°ΠΉΡ). Π ΠΏΡΠΎΠ΄Π΅ Ρ ΡΠ°Π½ΠΈΡΡ Π² ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎΠΌ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅.
ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΠ΅ΡΠ΅Π· Docker Compose ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ Π² docker-compose.yml.
ΠΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ:
- Swagger UI: http://localhost:8080/swagger-ui.html
- OpenAPI JSON: http://localhost:8080/api/docs (Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ)
Π Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ Π²ΡΠ΅ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠ΅ ΡΠΎΡΠΊΠΈ, ΠΌΠΎΠ΄Π΅Π»ΠΈ Π·Π°ΠΏΡΠΎΡΠΎΠ²/ΠΎΡΠ²Π΅ΡΠΎΠ² ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΊΠΎΠ΄Ρ ΠΎΡΠ²Π΅ΡΠΎΠ².
-
Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (ROLE_USER)
- POST /api/auth/register (query params)
- ΠΡΠΈΠΌΠ΅Ρ: curl -X POST "http://localhost:8080/api/auth/register?username=user1&password=secret"
-
ΠΠΎΠ³ΠΈΠ½ β ΠΏΠΎΠ»ΡΡΠΈΡΡ JWT
- POST /api/auth/login
- Π’Π΅Π»ΠΎ (JSON): { "username": "user1", "password": "secret" }
- ΠΡΠΈΠΌΠ΅Ρ:
curl -X POST "http://localhost:8080/api/auth/login"
-H "Content-Type: application/json"
-d '{"username":"user1","password":"secret"}' - ΠΡΠ²Π΅Ρ: { "token": "eyJhbGciOiJI..." }
-
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Π° Authorization:
- Header: Authorization: Bearer
-
ΠΡΠΈΠΌΠ΅ΡΡ Π²Π°ΠΆΠ½ΡΡ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠΎΠ²:
-
Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΊΠ°ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (ADMIN) POST /api/cards/user/{userId} Body: CreateCardRequest JSON: { "cardNumber": "4111111111111111", "expiryDate": "2030-12-31", "initialBalance": 5000.00 }
-
ΠΠΎΠ»ΡΡΠΈΡΡ ΡΠ²ΠΎΠΈ ΠΊΠ°ΡΡΡ GET /api/cards/my?status=ACTIVE&page=0&size=20
-
ΠΠ΅ΡΠ΅Π²ΠΎΠ΄ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ²ΠΎΠΈΠΌΠΈ ΠΊΠ°ΡΡΠ°ΠΌΠΈ POST /api/transfers Body: { "fromCardId": 10, "toCardId": 20, "amount": 100.50 }
-
ΠΠ°ΠΏΡΠΎΡΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΊΠ°ΡΡΡ (Π²Π»Π°Π΄Π΅Π»Π΅Ρ) POST /api/cards/{cardId}/request-block
ΠΡΠΎΠ΅ΠΊΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ½ΠΈΡ- ΠΈ web-ΠΌΠΎΠΊΠΈ ΡΠ΅ΡΡΡ (JUnit5, Spring Test, Mockito). ΠΠ°ΠΏΡΡΠΊ:
- ./mvnw test
Π’Π΅ΡΡΡ ΠΏΠΎΠΊΡΡΠ²Π°ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ: ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ/Π»ΠΎΠ³ΠΈΠ½, ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΠ°ΡΡΠ°ΠΌΠΈ, ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Ρ ΠΈ ΡΡΠΈΠ»ΠΈΡΡ (ΠΌΠ°ΡΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅).
- ΠΠ°ΡΠΎΠ»ΠΈ Ρ ΡΠ°Π½ΡΡΡΡ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ (BCrypt).
- ΠΠΎΠΌΠ΅ΡΠ° ΠΊΠ°ΡΡ ΡΠΈΡΡΡΡΡΡΡ AES (CardEncryptionService). Π production ΡΠ΅ΠΊΡΠ΅ΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Ρ ΡΠ°Π½ΠΈΡΡΡΡ Π² Vault/ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ΅.
- JWT ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΎΠ»Ρ Π² claim; Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅ΡΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡΠΌΠΈ
@PreAuthorize. - ΠΠ°Π»ΠΈΠ΄ΠΈΡΡΠ΅ΠΌ Π²Ρ ΠΎΠ΄Π½ΡΠ΅ DTO Ρ ΠΏΠΎΠΌΠΎΡΡΡ Jakarta Bean Validation; ΠΎΡΠΈΠ±ΠΊΠΈ Π²Π°Π»ΠΈΠ΄aΡΠΈΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ Π² Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅ (GlobalExceptionHandler).
- Π Π±Π°Π·Π΅ ΠΈΠ½Π΄Π΅ΠΊΡ Π½Π° Π½ΠΎΠΌΠ΅Ρ ΠΊΠ°ΡΡΡ (ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ΅ΠΊΡΡ). Π Π±ΠΎΠ΅Π²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΡΡΠΎΠΈΡ ΠΏΠ΅ΡΠ΅ΡΠΌΠΎΡΡΠ΅ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΡΡΡ Π΄Π°Π½Π½ΡΡ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ PCI DSS.