diff --git a/pom.xml b/pom.xml
index 9b86c58..aa76dd4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -36,6 +36,10 @@
org.springframework.boot
spring-boot-starter-data-jpa
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
org.postgresql
postgresql
diff --git a/src/main/java/com/example/bankcards/dto/AuthResponse.java b/src/main/java/com/example/bankcards/dto/AuthResponse.java
new file mode 100644
index 0000000..e45f2aa
--- /dev/null
+++ b/src/main/java/com/example/bankcards/dto/AuthResponse.java
@@ -0,0 +1,13 @@
+package com.example.bankcards.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class AuthResponse {
+
+ private String token;
+ private String username;
+ private String role;
+}
diff --git a/src/main/java/com/example/bankcards/dto/CardResponse.java b/src/main/java/com/example/bankcards/dto/CardResponse.java
new file mode 100644
index 0000000..41f9dfd
--- /dev/null
+++ b/src/main/java/com/example/bankcards/dto/CardResponse.java
@@ -0,0 +1,17 @@
+package com.example.bankcards.dto;
+
+import com.example.bankcards.entity.CardStatus;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import lombok.Data;
+
+@Data
+public class CardResponse {
+
+ private Long id;
+ private String maskedNumber;
+ private String ownerUsername;
+ private LocalDate expiryDate;
+ private CardStatus status;
+ private BigDecimal balance;
+}
diff --git a/src/main/java/com/example/bankcards/dto/CreateCardRequest.java b/src/main/java/com/example/bankcards/dto/CreateCardRequest.java
new file mode 100644
index 0000000..ee76a4d
--- /dev/null
+++ b/src/main/java/com/example/bankcards/dto/CreateCardRequest.java
@@ -0,0 +1,25 @@
+package com.example.bankcards.dto;
+
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import lombok.Data;
+
+@Data
+public class CreateCardRequest {
+
+ @NotBlank
+ @Pattern(regexp = "\\d{16}", message = "Card number must be 16 digits")
+ private String cardNumber;
+
+ @NotNull
+ private Long ownerId;
+
+ @NotNull
+ @Future
+ private LocalDate expiryDate;
+
+ @NotNull
+ @DecimalMin("0.00")
+ private BigDecimal initialBalance;
+}
diff --git a/src/main/java/com/example/bankcards/dto/ErrorResponse.java b/src/main/java/com/example/bankcards/dto/ErrorResponse.java
new file mode 100644
index 0000000..51800b0
--- /dev/null
+++ b/src/main/java/com/example/bankcards/dto/ErrorResponse.java
@@ -0,0 +1,20 @@
+package com.example.bankcards.dto;
+
+import java.time.LocalDateTime;
+import java.util.Map;
+import lombok.Data;
+
+@Data
+public class ErrorResponse {
+
+ private int status;
+ private String message;
+ private LocalDateTime timestamp;
+ private Map errors;
+
+ public ErrorResponse(int status, String message) {
+ this.status = status;
+ this.message = message;
+ this.timestamp = LocalDateTime.now();
+ }
+}
diff --git a/src/main/java/com/example/bankcards/dto/LoginRequest.java b/src/main/java/com/example/bankcards/dto/LoginRequest.java
new file mode 100644
index 0000000..67f6fac
--- /dev/null
+++ b/src/main/java/com/example/bankcards/dto/LoginRequest.java
@@ -0,0 +1,14 @@
+package com.example.bankcards.dto;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+@Data
+public class LoginRequest {
+
+ @NotBlank
+ private String username;
+
+ @NotBlank
+ private String password;
+}
diff --git a/src/main/java/com/example/bankcards/dto/RegisterRequest.java b/src/main/java/com/example/bankcards/dto/RegisterRequest.java
new file mode 100644
index 0000000..5320886
--- /dev/null
+++ b/src/main/java/com/example/bankcards/dto/RegisterRequest.java
@@ -0,0 +1,20 @@
+package com.example.bankcards.dto;
+
+import jakarta.validation.constraints.*;
+import lombok.Data;
+
+@Data
+public class RegisterRequest {
+
+ @NotBlank
+ @Size(min = 3, max = 50)
+ private String username;
+
+ @NotBlank
+ @Email
+ private String email;
+
+ @NotBlank
+ @Size(min = 6)
+ private String password;
+}
diff --git a/src/main/java/com/example/bankcards/dto/TransferRequest.java b/src/main/java/com/example/bankcards/dto/TransferRequest.java
new file mode 100644
index 0000000..33d16b2
--- /dev/null
+++ b/src/main/java/com/example/bankcards/dto/TransferRequest.java
@@ -0,0 +1,19 @@
+package com.example.bankcards.dto;
+
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+import lombok.Data;
+
+@Data
+public class TransferRequest {
+
+ @NotNull
+ private Long fromCardId;
+
+ @NotNull
+ private Long toCardId;
+
+ @NotNull
+ @DecimalMin(value = "0.01", message = "Transfer amount must be positive")
+ private BigDecimal amount;
+}
diff --git a/src/main/java/com/example/bankcards/dto/UpdateUserRoleRequest.java b/src/main/java/com/example/bankcards/dto/UpdateUserRoleRequest.java
new file mode 100644
index 0000000..b8dec84
--- /dev/null
+++ b/src/main/java/com/example/bankcards/dto/UpdateUserRoleRequest.java
@@ -0,0 +1,12 @@
+package com.example.bankcards.dto;
+
+import com.example.bankcards.entity.Role;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class UpdateUserRoleRequest {
+
+ @NotNull
+ private Role role;
+}
diff --git a/src/main/java/com/example/bankcards/dto/UserResponse.java b/src/main/java/com/example/bankcards/dto/UserResponse.java
new file mode 100644
index 0000000..be658b9
--- /dev/null
+++ b/src/main/java/com/example/bankcards/dto/UserResponse.java
@@ -0,0 +1,13 @@
+package com.example.bankcards.dto;
+
+import com.example.bankcards.entity.Role;
+import lombok.Data;
+
+@Data
+public class UserResponse {
+
+ private Long id;
+ private String username;
+ private String email;
+ private Role role;
+}