Skip to content

Commit 91c7b13

Browse files
committed
feat: Add duty schedule management with service, controller, and tests.
1 parent 5dafc87 commit 91c7b13

3 files changed

Lines changed: 51 additions & 2 deletions

File tree

src/main/java/com/crimeLink/analyzer/controller/DutyScheduleController.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,17 @@ public ResponseEntity<byte[]> getDutyScheduleReportPdf(
8686

8787
return new ResponseEntity<>(pdfBytes, headers, HttpStatus.OK);
8888
}
89+
90+
// 5) Bulk create / update duties
91+
@PostMapping("/bulk")
92+
public ResponseEntity<?> createDutiesBulk(@RequestBody List<DutyScheduleRequest> requests) {
93+
try {
94+
List<DutySchedule> saved = dutyService.createDuties(requests);
95+
return ResponseEntity.status(HttpStatus.CREATED).body(saved);
96+
} catch (IllegalArgumentException ex) {
97+
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
98+
} catch (Exception ex) {
99+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Failed to save duties");
100+
}
101+
}
89102
}

src/main/java/com/crimeLink/analyzer/service/DutyScheduleService.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,10 +174,12 @@ public DutySchedule createDuty(DutyScheduleRequest req) {
174174
}
175175

176176
// Bulk create/update duties
177-
public void createDuties(List<DutyScheduleRequest> requests) {
177+
public List<DutySchedule> createDuties(List<DutyScheduleRequest> requests) {
178+
List<DutySchedule> results = new ArrayList<>();
178179
for (DutyScheduleRequest req : requests) {
179-
createDuty(req);
180+
results.add(createDuty(req));
180181
}
182+
return results;
181183
}
182184
// Update only the status of an existing duty
183185
@Transactional

src/test/java/com/crimeLink/analyzer/controller/DutyScheduleControllerTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,4 +129,38 @@ void getDutyScheduleReportPdf_shouldReturnPdf() throws Exception {
129129
.andExpect(status().isOk())
130130
.andExpect(content().contentType(MediaType.APPLICATION_PDF));
131131
}
132+
133+
@Test
134+
void createDutiesBulk_shouldReturn201() throws Exception {
135+
DutySchedule duty = new DutySchedule();
136+
duty.setId(1L);
137+
138+
when(dutyService.createDuties(any())).thenReturn(List.of(duty));
139+
140+
DutyScheduleRequest request = new DutyScheduleRequest();
141+
request.setOfficerId(1);
142+
request.setDate(LocalDate.of(2026, 3, 13));
143+
request.setStatus(DutyStatus.Active);
144+
request.setTimeRange("06:00-21:00");
145+
request.setLocation("Matara");
146+
147+
mockMvc.perform(post("/api/duty-schedules/bulk")
148+
.contentType(MediaType.APPLICATION_JSON)
149+
.content(objectMapper.writeValueAsString(List.of(request))))
150+
.andExpect(status().isCreated());
151+
}
152+
153+
@Test
154+
void createDutiesBulk_shouldReturn400_whenValidationError() throws Exception {
155+
when(dutyService.createDuties(any()))
156+
.thenThrow(new IllegalArgumentException("OfficerId is required"));
157+
158+
DutyScheduleRequest request = new DutyScheduleRequest();
159+
160+
mockMvc.perform(post("/api/duty-schedules/bulk")
161+
.contentType(MediaType.APPLICATION_JSON)
162+
.content(objectMapper.writeValueAsString(List.of(request))))
163+
.andExpect(status().isBadRequest())
164+
.andExpect(content().string("OfficerId is required"));
165+
}
132166
}

0 commit comments

Comments
 (0)