Skip to content

Commit d5f429c

Browse files
Resolved contact_inquiries is violated
Signed-off-by: vimal-java-dev <vimal929@gmail.com>
1 parent f3105f8 commit d5f429c

3 files changed

Lines changed: 39 additions & 24 deletions

File tree

src/main/java/com/vimaltech/contactapi/enums/InquiryType.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@ public static InquiryType[] list() {
2525
// ✅ Case-insensitive parsing (already discussed)
2626
@JsonCreator
2727
public static InquiryType from(String value) {
28-
if (value == null) {
29-
return null;
28+
29+
if (value == null || value.trim().isEmpty()) {
30+
throw new IllegalArgumentException(
31+
"Subject must not be null or empty. Allowed values: FRONTEND, BACKEND, FULLSTACK, VPS, OTHER"
32+
);
3033
}
3134

3235
try {

src/main/java/com/vimaltech/contactapi/exception/GlobalExceptionHandler.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class GlobalExceptionHandler {
1616

1717
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
1818

19+
// ✅ 1. Bean validation errors (@Valid)
1920
@ExceptionHandler(MethodArgumentNotValidException.class)
2021
public ResponseEntity<ApiResponse> handleValidationException(
2122
MethodArgumentNotValidException ex) {
@@ -38,21 +39,34 @@ public ResponseEntity<ApiResponse> handleValidationException(
3839
return ResponseEntity.badRequest().body(response);
3940
}
4041

41-
// ✅ NEW: Handle enum parsing errors (very important)
42+
// ✅ 2. JSON parsing / ENUM errors (UPDATED - precise handling)
4243
@ExceptionHandler(HttpMessageNotReadableException.class)
43-
public ResponseEntity<ApiResponse> handleEnumError(HttpMessageNotReadableException ex) {
44+
public ResponseEntity<ApiResponse> handleJsonParseError(HttpMessageNotReadableException ex) {
4445

4546
log.warn("Invalid request format or enum value: {}", ex.getMessage());
4647

48+
String message = "Invalid request format";
49+
50+
// 🔥 Extract root cause (THIS is what you asked about)
51+
Throwable root = ex.getCause();
52+
53+
if (root instanceof IllegalArgumentException &&
54+
root.getMessage() != null &&
55+
root.getMessage().contains("Invalid subject value")) {
56+
57+
message = root.getMessage(); // use exact enum error
58+
}
59+
4760
ApiResponse response = new ApiResponse(
4861
false,
49-
"Invalid subject value. Allowed: FRONTEND, BACKEND, FULLSTACK, VPS, OTHER",
62+
message,
5063
LocalDateTime.now()
5164
);
5265

5366
return ResponseEntity.badRequest().body(response);
5467
}
5568

69+
// ✅ 3. Catch-all (fallback)
5670
@ExceptionHandler(Exception.class)
5771
public ResponseEntity<ApiResponse> handleGenericException(Exception ex) {
5872

src/main/resources/db/migration/V2__normalize_subject_and_enforce_enum.sql

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,46 @@
11
-- ============================
2-
-- 1. Normalize existing values
2+
-- 1. Normalize case
33
-- ============================
44

55
UPDATE contact_inquiries
66
SET subject = UPPER(subject)
77
WHERE subject IS NOT NULL;
88

99
-- ============================
10-
-- 2. Fix known variations
10+
-- 2. Map known values
11+
-- ============================
12+
13+
UPDATE contact_inquiries SET subject = 'BACKEND' WHERE subject LIKE '%BACKEND%';
14+
UPDATE contact_inquiries SET subject = 'FULLSTACK' WHERE subject LIKE '%FULLSTACK%';
15+
UPDATE contact_inquiries SET subject = 'VPS' WHERE subject LIKE '%VPS%';
16+
UPDATE contact_inquiries SET subject = 'FRONTEND' WHERE subject LIKE '%FRONTEND%';
17+
UPDATE contact_inquiries SET subject = 'OTHER' WHERE subject LIKE '%OTHER%';
18+
19+
-- ============================
20+
-- 3. Handle NULL
1121
-- ============================
1222

13-
UPDATE contact_inquiries
14-
SET subject = 'BACKEND'
15-
WHERE subject ILIKE 'backend';
16-
UPDATE contact_inquiries
17-
SET subject = 'FULLSTACK'
18-
WHERE subject ILIKE 'fullstack';
19-
UPDATE contact_inquiries
20-
SET subject = 'VPS'
21-
WHERE subject ILIKE 'vps';
2223
UPDATE contact_inquiries
2324
SET subject = 'OTHER'
24-
WHERE subject ILIKE 'other';
25-
UPDATE contact_inquiries
26-
SET subject = 'FRONTEND'
27-
WHERE subject ILIKE 'frontend';
25+
WHERE subject IS NULL;
2826

2927
-- ============================
30-
-- 3. Fix NULL values
28+
-- 4. 🔥 CRITICAL: Catch ALL remaining invalid values
3129
-- ============================
3230

3331
UPDATE contact_inquiries
3432
SET subject = 'OTHER'
35-
WHERE subject IS NULL;
33+
WHERE subject NOT IN ('FRONTEND', 'BACKEND', 'FULLSTACK', 'VPS', 'OTHER');
3634

3735
-- ============================
38-
-- 4. Enforce NOT NULL
36+
-- 5. Enforce NOT NULL
3937
-- ============================
4038

4139
ALTER TABLE contact_inquiries
4240
ALTER COLUMN subject SET NOT NULL;
4341

4442
-- ============================
45-
-- 5. ADD CHECK CONSTRAINT (LAST STEP)
43+
-- 6. Add CHECK constraint
4644
-- ============================
4745

4846
ALTER TABLE contact_inquiries

0 commit comments

Comments
 (0)