Skip to content
This repository was archived by the owner on Nov 23, 2025. It is now read-only.

Commit 4a3126f

Browse files
committed
feat(dto): add request DTO classes for admin service module
Added new request DTO classes under com.techtorque.admin_service.dto.request to support admin-related endpoints with validation annotations and clear data structures. Included classes: - CreateServiceTypeRequest.java - UpdateServiceTypeRequest.java - GenerateReportRequest.java - ScheduleReportRequest.java - CreateEmployeeRequest.java - UpdateUserRequest.java Each class includes: • Jakarta validation annotations for field-level validation • Lombok annotations (@DaTa, @builder, @NoArgsConstructor, @AllArgsConstructor) • Structured documentation for API usage (POST/PUT endpoints) • Input constraints for improved data integrity
1 parent 8b8c6ff commit 4a3126f

6 files changed

Lines changed: 277 additions & 0 deletions

File tree

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// ========================================
2+
// CreateEmployeeRequest.java
3+
// ========================================
4+
5+
package com.techtorque.admin_service.dto.request;
6+
7+
import jakarta.validation.constraints.*;
8+
import lombok.AllArgsConstructor;
9+
import lombok.Builder;
10+
import lombok.Data;
11+
import lombok.NoArgsConstructor;
12+
13+
/**
14+
* Request DTO for creating employee accounts
15+
* Used by: POST /admin/users/employee
16+
*/
17+
@Data
18+
@NoArgsConstructor
19+
@AllArgsConstructor
20+
@Builder
21+
public class CreateEmployeeRequest {
22+
23+
@NotBlank(message = "Full name is required")
24+
@Size(min = 2, max = 100, message = "Full name must be between 2 and 100 characters")
25+
private String fullName;
26+
27+
@NotBlank(message = "Email is required")
28+
@Email(message = "Invalid email format")
29+
private String email;
30+
31+
@NotBlank(message = "Role is required")
32+
@Pattern(regexp = "EMPLOYEE", message = "Role must be EMPLOYEE")
33+
private String role;
34+
35+
@Size(max = 100, message = "Department must be less than 100 characters")
36+
private String department;
37+
38+
@Pattern(regexp = "^\\+?[1-9]\\d{1,14}$", message = "Invalid phone number format")
39+
private String phone;
40+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.techtorque.admin_service.dto.request;
2+
3+
import jakarta.validation.constraints.*;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Data;
7+
import lombok.NoArgsConstructor;
8+
import java.math.BigDecimal;
9+
10+
/**
11+
* Request DTO for creating a new service type
12+
* Used by: POST /admin/service-types
13+
*/
14+
@Data
15+
@NoArgsConstructor
16+
@AllArgsConstructor
17+
@Builder
18+
public class CreateServiceTypeRequest {
19+
20+
@NotBlank(message = "Service name is required")
21+
@Size(max = 100, message = "Name must be less than 100 characters")
22+
private String name;
23+
24+
@Size(max = 500, message = "Description must be less than 500 characters")
25+
private String description;
26+
27+
@NotBlank(message = "Category is required")
28+
@Pattern(regexp = "MAINTENANCE|REPAIR|MODIFICATION|INSPECTION",
29+
message = "Category must be MAINTENANCE, REPAIR, MODIFICATION, or INSPECTION")
30+
private String category;
31+
32+
@NotNull(message = "Price is required")
33+
@DecimalMin(value = "0.0", inclusive = false, message = "Price must be greater than 0")
34+
@Digits(integer = 8, fraction = 2, message = "Price must have max 8 integer digits and 2 decimal places")
35+
private BigDecimal price;
36+
37+
@NotNull(message = "Duration is required")
38+
@Min(value = 15, message = "Duration must be at least 15 minutes")
39+
@Max(value = 480, message = "Duration must not exceed 8 hours (480 minutes)")
40+
private Integer durationMinutes;
41+
42+
// Optional fields
43+
private Boolean requiresApproval = false;
44+
45+
@Min(value = 1, message = "Daily capacity must be at least 1")
46+
@Max(value = 50, message = "Daily capacity cannot exceed 50")
47+
private Integer dailyCapacity;
48+
49+
@Pattern(regexp = "BASIC|INTERMEDIATE|ADVANCED",
50+
message = "Skill level must be BASIC, INTERMEDIATE, or ADVANCED")
51+
private String skillLevel;
52+
53+
@Size(max = 500, message = "Icon URL must be less than 500 characters")
54+
private String iconUrl;
55+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// ========================================
2+
// GenerateReportRequest.java
3+
// ========================================
4+
5+
package com.techtorque.admin_service.dto.request;
6+
7+
import jakarta.validation.constraints.*;
8+
import lombok.AllArgsConstructor;
9+
import lombok.Builder;
10+
import lombok.Data;
11+
import lombok.NoArgsConstructor;
12+
import java.time.LocalDate;
13+
14+
/**
15+
* Request DTO for generating reports
16+
* Used by: POST /admin/reports/generate
17+
*/
18+
@Data
19+
@NoArgsConstructor
20+
@AllArgsConstructor
21+
@Builder
22+
public class GenerateReportRequest {
23+
24+
@NotBlank(message = "Report type is required")
25+
@Pattern(regexp = "SERVICE_PERFORMANCE|REVENUE|EMPLOYEE_PRODUCTIVITY|CUSTOMER_SATISFACTION|INVENTORY|APPOINTMENT_SUMMARY",
26+
message = "Invalid report type")
27+
private String type;
28+
29+
@NotNull(message = "Start date is required")
30+
@PastOrPresent(message = "Start date cannot be in the future")
31+
private LocalDate fromDate;
32+
33+
@NotNull(message = "End date is required")
34+
private LocalDate toDate;
35+
36+
@NotBlank(message = "Format is required")
37+
@Pattern(regexp = "JSON|PDF|EXCEL|CSV", message = "Format must be JSON, PDF, EXCEL, or CSV")
38+
private String format;
39+
40+
// Optional filters for more specific reports
41+
private String departmentId;
42+
private String employeeId;
43+
private String serviceCategory;
44+
private String customerId;
45+
46+
/**
47+
* Custom validation to ensure fromDate is before toDate
48+
*/
49+
@AssertTrue(message = "End date must be after start date")
50+
public boolean isValidDateRange() {
51+
if (fromDate == null || toDate == null) {
52+
return true; // Let @NotNull handle null validation
53+
}
54+
return !toDate.isBefore(fromDate);
55+
}
56+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// ========================================
2+
// ScheduleReportRequest.java
3+
// ========================================
4+
5+
package com.techtorque.admin_service.dto.request;
6+
7+
import jakarta.validation.constraints.*;
8+
import lombok.AllArgsConstructor;
9+
import lombok.Builder;
10+
import lombok.Data;
11+
import lombok.NoArgsConstructor;
12+
import java.util.List;
13+
14+
/**
15+
* Request DTO for scheduling recurring reports
16+
* Used by: POST /admin/reports/schedule
17+
*/
18+
@Data
19+
@NoArgsConstructor
20+
@AllArgsConstructor
21+
@Builder
22+
public class ScheduleReportRequest {
23+
24+
@NotBlank(message = "Report type is required")
25+
@Pattern(regexp = "SERVICE_PERFORMANCE|REVENUE|EMPLOYEE_PRODUCTIVITY|CUSTOMER_SATISFACTION|INVENTORY",
26+
message = "Invalid report type")
27+
private String type;
28+
29+
@NotBlank(message = "Frequency is required")
30+
@Pattern(regexp = "DAILY|WEEKLY|MONTHLY", message = "Frequency must be DAILY, WEEKLY, or MONTHLY")
31+
private String frequency;
32+
33+
@NotEmpty(message = "At least one recipient email is required")
34+
@Size(max = 10, message = "Maximum 10 recipients allowed")
35+
private List<@Email(message = "Invalid email address") String> recipients;
36+
37+
// Optional: specific day for WEEKLY (1-7, Monday-Sunday) or MONTHLY (1-31)
38+
@Min(value = 1, message = "Day must be between 1 and 31")
39+
@Max(value = 31, message = "Day must be between 1 and 31")
40+
private Integer dayOfSchedule;
41+
42+
// Optional: specific hour for daily reports (0-23)
43+
@Min(value = 0, message = "Hour must be between 0 and 23")
44+
@Max(value = 23, message = "Hour must be between 0 and 23")
45+
private Integer hourOfDay;
46+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// ========================================
2+
// UpdateServiceTypeRequest.java
3+
// ========================================
4+
5+
package com.techtorque.admin_service.dto.request;
6+
7+
import jakarta.validation.constraints.*;
8+
import lombok.AllArgsConstructor;
9+
import lombok.Builder;
10+
import lombok.Data;
11+
import lombok.NoArgsConstructor;
12+
import java.math.BigDecimal;
13+
14+
/**
15+
* Request DTO for updating service type
16+
* Used by: PUT /admin/service-types/{typeId}
17+
* All fields are optional for partial updates
18+
*/
19+
@Data
20+
@NoArgsConstructor
21+
@AllArgsConstructor
22+
@Builder
23+
public class UpdateServiceTypeRequest {
24+
25+
@Size(max = 500, message = "Description must be less than 500 characters")
26+
private String description;
27+
28+
@DecimalMin(value = "0.0", inclusive = false, message = "Price must be greater than 0")
29+
@Digits(integer = 8, fraction = 2)
30+
private BigDecimal price;
31+
32+
@Min(value = 15, message = "Duration must be at least 15 minutes")
33+
@Max(value = 480, message = "Duration must not exceed 480 minutes")
34+
private Integer durationMinutes;
35+
36+
private Boolean active;
37+
38+
@Min(value = 1, message = "Daily capacity must be at least 1")
39+
private Integer dailyCapacity;
40+
41+
@Pattern(regexp = "BASIC|INTERMEDIATE|ADVANCED")
42+
private String skillLevel;
43+
44+
@Size(max = 500)
45+
private String iconUrl;
46+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// ========================================
2+
// UpdateUserRequest.java
3+
// ========================================
4+
5+
package com.techtorque.admin_service.dto.request;
6+
7+
import jakarta.validation.constraints.*;
8+
import lombok.AllArgsConstructor;
9+
import lombok.Builder;
10+
import lombok.Data;
11+
import lombok.NoArgsConstructor;
12+
import java.util.List;
13+
14+
/**
15+
* Request DTO for updating user information
16+
* Used by: PUT /admin/users/{userId}
17+
*/
18+
@Data
19+
@NoArgsConstructor
20+
@AllArgsConstructor
21+
@Builder
22+
public class UpdateUserRequest {
23+
24+
@Pattern(regexp = "ADMIN|EMPLOYEE|CUSTOMER", message = "Role must be ADMIN, EMPLOYEE, or CUSTOMER")
25+
private String role;
26+
27+
private Boolean active;
28+
29+
@Size(max = 20, message = "Maximum 20 permissions allowed")
30+
private List<String> permissions;
31+
32+
@Size(max = 100)
33+
private String department;
34+
}

0 commit comments

Comments
 (0)