Skip to content

Commit b8fa940

Browse files
authored
Merge pull request #34 from arosha-w/Dev
Implement bullet management with controller, service, and DTOs
2 parents d3b1785 + 00dc00e commit b8fa940

18 files changed

Lines changed: 497 additions & 52 deletions
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package com.crimeLink.analyzer.controller;
2+
3+
import com.crimeLink.analyzer.dto.BulletAddDTO;
4+
import com.crimeLink.analyzer.dto.BulletResponseDTO;
5+
import com.crimeLink.analyzer.dto.BulletUpdateDTO;
6+
import com.crimeLink.analyzer.entity.Bullet;
7+
import com.crimeLink.analyzer.service.BulletService;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.http.HttpStatus;
10+
import org.springframework.http.ResponseEntity;
11+
import org.springframework.web.bind.annotation.*;
12+
13+
import java.util.HashMap;
14+
import java.util.List;
15+
import java.util.Map;
16+
17+
@RestController
18+
@RequestMapping("/api/bullet")
19+
@RequiredArgsConstructor
20+
@CrossOrigin(origins = "*")
21+
public class BulletController {
22+
23+
private final BulletService bulletService;
24+
25+
@PostMapping("/add-bullet")
26+
public ResponseEntity<?> addBullet(@RequestBody BulletAddDTO dto) {
27+
try {
28+
Bullet bullet = bulletService.addBullet(dto);
29+
return ResponseEntity.status(HttpStatus.CREATED).body(bullet);
30+
} catch (RuntimeException e) {
31+
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
32+
.body(createErrorResponse(e.getMessage()));
33+
} catch (Exception e) {
34+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
35+
.body(createErrorResponse("An unexpected error occurred"));
36+
}
37+
}
38+
39+
@PutMapping("/bullet-update/{bulletId}")
40+
public ResponseEntity<?> updateBullet(
41+
@PathVariable Integer bulletId,
42+
@RequestBody BulletUpdateDTO dto) {
43+
try {
44+
Bullet bullet = bulletService.updateBullet(bulletId, dto);
45+
return ResponseEntity.ok(bullet);
46+
} catch (RuntimeException e) {
47+
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
48+
.body(createErrorResponse(e.getMessage()));
49+
} catch (Exception e) {
50+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
51+
.body(createErrorResponse("An unexpected error occurred"));
52+
}
53+
}
54+
55+
@GetMapping("/all")
56+
public ResponseEntity<?> getAllBullets() {
57+
try {
58+
List<Bullet> bullets = bulletService.getAllBullets();
59+
return ResponseEntity.ok(bullets);
60+
} catch (Exception e) {
61+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
62+
.body(createErrorResponse("Failed to fetch bullets"));
63+
}
64+
}
65+
66+
@GetMapping("/all-with-details")
67+
public ResponseEntity<?> getAllBulletsWithDetails() {
68+
try {
69+
List<BulletResponseDTO> bullets = bulletService.getAllBulletsWithDetails();
70+
return ResponseEntity.ok(bullets);
71+
} catch (Exception e) {
72+
e.printStackTrace();
73+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
74+
.body(createErrorResponse("Failed to fetch bullets with details: " + e.getMessage()));
75+
}
76+
}
77+
78+
@GetMapping("/{bulletId}")
79+
public ResponseEntity<?> getBulletById(@PathVariable Integer bulletId) {
80+
try {
81+
Bullet bullet = bulletService.getBulletById(bulletId);
82+
return ResponseEntity.ok(bullet);
83+
} catch (RuntimeException e) {
84+
return ResponseEntity.status(HttpStatus.NOT_FOUND)
85+
.body(createErrorResponse(e.getMessage()));
86+
} catch (Exception e) {
87+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
88+
.body(createErrorResponse("Failed to fetch bullet"));
89+
}
90+
}
91+
92+
private Map<String, String> createErrorResponse(String message) {
93+
Map<String, String> response = new HashMap<>();
94+
response.put("error", message);
95+
return response;
96+
}
97+
}

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.crimeLink.analyzer.controller;
22

3-
43
import com.crimeLink.analyzer.entity.User;
54
import com.crimeLink.analyzer.service.UserService;
6-
import com.crimeLink.analyzer.service.WeaponIssueService;
7-
import org.springframework.beans.factory.annotation.Autowired;
85
import org.springframework.web.bind.annotation.*;
96

107
import java.util.List;
@@ -19,11 +16,13 @@ public UserController(UserService service) {
1916
this.service = service;
2017
}
2118

22-
@GetMapping("/field-officers")
2319
public List<User> getFieldOfficers() {
2420
return service.getFieldOfficers();
2521
}
2622

23+
@GetMapping("/all-officers")
24+
public List<User> getAllOfficers() {
25+
return service.getAllOfficers();
26+
}
2727

2828
}
29-
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.crimeLink.analyzer.dto;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class BulletAddDTO {
7+
private String bulletType;
8+
private Integer numberOfMagazines;
9+
private String remarks;
10+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.crimeLink.analyzer.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
@Data
8+
@NoArgsConstructor
9+
@AllArgsConstructor
10+
public class BulletResponseDTO {
11+
private Integer bulletId;
12+
private String bulletType;
13+
private Integer numberOfMagazines;
14+
private String remarks;
15+
private String registerDate;
16+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.crimeLink.analyzer.dto;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class BulletUpdateDTO {
7+
private String bulletType;
8+
private Integer numberOfMagazines;
9+
private String remarks;
10+
}

src/main/java/com/crimeLink/analyzer/dto/IssueWeaponRequestDTO.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,9 @@ public class IssueWeaponRequestDTO {
1010
private Integer handedOverById;
1111
private LocalDate dueDate;
1212
private String issueNote;
13+
14+
// Bullet details (optional - can issue weapon without bullets)
15+
private String bulletType;
16+
private Integer numberOfMagazines;
17+
private String bulletRemarks;
1318
}

src/main/java/com/crimeLink/analyzer/dto/ReturnWeaponRequestDTO.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,10 @@ public class ReturnWeaponRequestDTO {
77
private String weaponSerial;
88
private Integer receivedByUserId;
99
private String returnNote;
10+
11+
// Bullet return details (optional)
12+
private Integer returnedMagazines;
13+
private Integer usedBullets;
14+
private String bulletCondition;
15+
private String bulletRemarks;
1016
}

src/main/java/com/crimeLink/analyzer/dto/WeaponResponseDTO.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,8 @@ public class WeaponResponseDTO {
1919
private String issuedDate;
2020
private String dueDate;
2121
private String issueNote;
22+
23+
// Bullet details (if issued with bullets)
24+
private String issuedBulletType;
25+
private Integer issuedMagazines;
2226
}

src/main/java/com/crimeLink/analyzer/dto/WeaponReturnResponseDTO.java

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.crimeLink.analyzer.entity;
2+
3+
import jakarta.persistence.*;
4+
import lombok.*;
5+
6+
import java.time.LocalDateTime;
7+
8+
@Entity
9+
@Table(name = "bullets")
10+
@Data
11+
@Getter
12+
@Setter
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
public class Bullet {
16+
17+
@Id
18+
@GeneratedValue(strategy = GenerationType.IDENTITY)
19+
@Column(name = "bullet_id")
20+
private Integer bulletId;
21+
22+
@Column(name = "bullet_type", nullable = false)
23+
private String bulletType;
24+
25+
@Column(name = "number_of_magazines", nullable = false)
26+
private Integer numberOfMagazines;
27+
28+
@Column(name = "register_date", updatable = false)
29+
private LocalDateTime registerDate;
30+
31+
@Column(name = "updated_date")
32+
private LocalDateTime updatedDate;
33+
34+
@Column(name = "remarks")
35+
private String remarks;
36+
37+
@PrePersist
38+
void onCreate() {
39+
registerDate = LocalDateTime.now();
40+
updatedDate = LocalDateTime.now();
41+
}
42+
43+
@PreUpdate
44+
void onUpdate() {
45+
updatedDate = LocalDateTime.now();
46+
}
47+
}

0 commit comments

Comments
 (0)