Skip to content

Add API endpoints for weapon issuance and requests - #42

Merged
JinethBosilu merged 25 commits into
mainfrom
isira
Mar 14, 2026
Merged

Add API endpoints for weapon issuance and requests#42
JinethBosilu merged 25 commits into
mainfrom
isira

Conversation

@iSiRaH

@iSiRaH iSiRaH commented Mar 13, 2026

Copy link
Copy Markdown
Collaborator

No description provided.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds weapon-request functionality (entity/DTO/repo/service/controller) and introduces new endpoints to fetch weapons/issues by officer, alongside a repository query to fetch actively issued weapons.

Changes:

  • Added WeaponRequest domain model (entity + enum + DTO + mapper) and CRUD-ish API endpoints to create/list/approve/reject weapon requests.
  • Added repository/service/controller support for retrieving weapons currently issued to a specific officer.
  • Added new weapon-issue “issued” and “history” endpoints, plus updated Spring Security routing rules for weapon endpoints.

Reviewed changes

Copilot reviewed 16 out of 16 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
src/main/java/com/crimeLink/analyzer/service/WeaponService.java Adds service method to fetch weapons issued to an officer.
src/main/java/com/crimeLink/analyzer/service/WeaponRequestService.java New service interface for weapon request operations.
src/main/java/com/crimeLink/analyzer/service/impl/WeaponServiceImpl.java Implements officer-issued weapons retrieval via repository.
src/main/java/com/crimeLink/analyzer/service/impl/WeaponRequestServiceImpl.java Implements create/list/approve/reject weapon request flows.
src/main/java/com/crimeLink/analyzer/repository/WeaponRequestRepository.java New repository for querying weapon requests.
src/main/java/com/crimeLink/analyzer/repository/WeaponRepository.java Adds JPQL query for active weapons by officer.
src/main/java/com/crimeLink/analyzer/repository/WeaponIssueRepository.java Adds officer-specific weapon issue query methods.
src/main/java/com/crimeLink/analyzer/mapper/WeaponRequestMapper.java Maps between WeaponRequest and WeaponRequestDto.
src/main/java/com/crimeLink/analyzer/entity/WeaponRequestStatus.java New enum for request status.
src/main/java/com/crimeLink/analyzer/entity/WeaponRequest.java New JPA entity backing weapon requests.
src/main/java/com/crimeLink/analyzer/dto/WeaponRequestDto.java New DTO for weapon requests.
src/main/java/com/crimeLink/analyzer/controller/WeaponRequestController.java Adds REST API endpoints for weapon requests.
src/main/java/com/crimeLink/analyzer/controller/WeaponIssueController.java Adds officer “issued” and “history” endpoints (currently returning entities).
src/main/java/com/crimeLink/analyzer/controller/WeaponController.java Adds endpoint to fetch weapons issued to an officer.
src/main/java/com/crimeLink/analyzer/controller/ReqquiredArgsConstructor.java Introduces a new (typo’d) annotation in controller package.
src/main/java/com/crimeLink/analyzer/config/SecurityConfig.java Changes authorization for /api/weapon/** routes.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

// OIC-only routes
.requestMatchers("/api/duty-schedules/**").hasRole("OIC")
.requestMatchers("/api/weapon/**").hasRole("OIC")
.requestMatchers("/api/weapon/**").permitAll()
WHERE wi.issuedTo.userId = :userId
AND wi.returnedAt IS NULL
""")
List<Weapon> findActiveWeaponsByOfficer(@Param("officerId") Integer officerId);
Comment on lines +89 to +97
@GetMapping("/issued/{officerId}")
public List<WeaponIssue> getActiveWeapons(@PathVariable Integer officerId) {
return weaponIssueRepository.findByIssuedTo_UserIdAndReturnedAtIsNullOrderByIssuedAtDesc(officerId);
}

@GetMapping("/history/{officerId}")
public List<WeaponIssue> getWeaponIssueHistory(@PathVariable Integer officerId) {
return weaponIssueRepository.findByIssuedTo_UserIdOrderByIssuedAtDesc(officerId);
}
Comment on lines 25 to 27
private final WeaponIssueService weaponIssueService;
private final WeaponIssueRepository weaponIssueRepository;

Comment on lines +3 to +5
public @interface ReqquiredArgsConstructor {

}
Comment on lines +9 to +15

@Repository
public interface WeaponRequestRepository extends JpaRepository<WeaponRequest, Integer> {

List<WeaponRequest> findByRequestedBy_UserId(Integer userId);

List<WeaponRequest> findByStatus(String status);
Comment on lines +71 to +80
@Override
public WeaponRequestDto approvedRequest(Integer requestId) {
WeaponRequest request = weaponRequestRepository.findById(requestId)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Request not found"));

request.setStatus(WeaponRequestStatus.APPROVED);
request.setResolvedAt(LocalDateTime.now());

return WeaponRequestMapper.mapToWeaponRequestDto(weaponRequestRepository.save(request));
}
Comment on lines +82 to +91
@Override
public WeaponRequestDto rejectedRequest(Integer requestId) {
WeaponRequest request = weaponRequestRepository.findById(requestId)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Request not found"));

request.setStatus(WeaponRequestStatus.REJECTED);
request.setResolvedAt(LocalDateTime.now());

return WeaponRequestMapper.mapToWeaponRequestDto(weaponRequestRepository.save(request));
}
Comment on lines +93 to +94
public List<Weapon> getWeaponsIssuedToOfficer(@PathVariable Integer officerId) {
return weaponService.getWeaponsIssuedToOfficer(officerId);
Copilot AI review requested due to automatic review settings March 14, 2026 12:35

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds new backend capabilities for criminal profile management (DB + Supabase photo storage + ML embedding generation), extends weapon management with requests and bullet stock tracking, and introduces admin system settings + DB backup/restore endpoints.

Changes:

  • Add Criminal CRUD API backed by JPA, photo upload to Supabase Storage, and ML embedding generation endpoint wiring.
  • Add weapon request workflow and expand weapon issuance/return to track/decrement/increment bullet magazine stock.
  • Add admin-only database backup/restore and system settings persistence.

Reviewed changes

Copilot reviewed 16 out of 16 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
src/main/resources/application.properties Adds Supabase bucket + backup directory configuration.
src/main/java/com/crimeLink/analyzer/service/WeaponService.java Adds API to fetch weapons issued to an officer.
src/main/java/com/crimeLink/analyzer/service/WeaponRequestService.java New service interface for weapon request workflow.
src/main/java/com/crimeLink/analyzer/service/WeaponIssueService.java Reorders interface methods (no behavioral change).
src/main/java/com/crimeLink/analyzer/service/UserService.java Adds method to fetch all users/officers.
src/main/java/com/crimeLink/analyzer/service/SystemSettingsService.java New service for persisted system settings with defaults/validation.
src/main/java/com/crimeLink/analyzer/service/SupabaseStorageService.java New service to upload/delete criminal photos in Supabase Storage.
src/main/java/com/crimeLink/analyzer/service/impl/WeaponServiceImpl.java Adds transactions + bullet issuance info into weapon detail DTO + officer-issued query.
src/main/java/com/crimeLink/analyzer/service/impl/WeaponRequestServiceImpl.java New implementation for weapon request create/approve/reject/list.
src/main/java/com/crimeLink/analyzer/service/impl/WeaponIssueServiceImpl.java Adds bullet stock validation/adjustments on issue/return + transactional boundaries.
src/main/java/com/crimeLink/analyzer/service/impl/BulletserviceImpl.java New bullet stock CRUD/service implementation.
src/main/java/com/crimeLink/analyzer/service/FacialRecognitionService.java Extends registration payload + adds embedding generation call.
src/main/java/com/crimeLink/analyzer/service/CriminalService.java New DB-backed criminal CRUD service coordinating Supabase + ML embeddings.
src/main/java/com/crimeLink/analyzer/service/BulletService.java New bullet service interface.
src/main/java/com/crimeLink/analyzer/service/BackupService.java New JDBC-based DB backup/restore service with metadata tracking.
src/main/java/com/crimeLink/analyzer/repository/WeaponRequestRepository.java New repository for weapon requests.
src/main/java/com/crimeLink/analyzer/repository/WeaponRepository.java Adds custom query for officer-issued active weapons.
src/main/java/com/crimeLink/analyzer/repository/WeaponIssueRepository.java Adds queries for officer issue history/active issues.
src/main/java/com/crimeLink/analyzer/repository/SystemSettingRepository.java New repository for system settings.
src/main/java/com/crimeLink/analyzer/repository/CriminalRepository.java Adds query for criminals with embeddings.
src/main/java/com/crimeLink/analyzer/repository/BulletRepository.java New repository for bullet stock.
src/main/java/com/crimeLink/analyzer/repository/BackupMetadataRepository.java New repository for backup metadata.
src/main/java/com/crimeLink/analyzer/mapper/WeaponRequestMapper.java New mapper for WeaponRequest <-> DTO conversions.
src/main/java/com/crimeLink/analyzer/entity/WeaponRequestStatus.java New enum for request state.
src/main/java/com/crimeLink/analyzer/entity/WeaponRequest.java New entity for weapon requests.
src/main/java/com/crimeLink/analyzer/entity/WeaponIssue.java Adds bullet tracking columns to weapon issue records.
src/main/java/com/crimeLink/analyzer/entity/SystemSetting.java New entity for persisted system settings.
src/main/java/com/crimeLink/analyzer/entity/Criminal.java Extends criminal schema to include risk level, history, primary photo URL, DOB, etc.
src/main/java/com/crimeLink/analyzer/entity/Bullet.java New entity representing bullet magazine stock.
src/main/java/com/crimeLink/analyzer/entity/BackupMetadata.java New entity to store backup file metadata.
src/main/java/com/crimeLink/analyzer/dto/WeaponReturnResponseDTO.java Removes unused/obsolete DTO.
src/main/java/com/crimeLink/analyzer/dto/WeaponResponseDTO.java Adds bullet issuance fields to weapon detail response.
src/main/java/com/crimeLink/analyzer/dto/WeaponRequestDto.java New DTO for weapon requests.
src/main/java/com/crimeLink/analyzer/dto/ReturnWeaponRequestDTO.java Adds bullet return details to weapon return request.
src/main/java/com/crimeLink/analyzer/dto/IssueWeaponRequestDTO.java Adds bullet issuance details to weapon issue request.
src/main/java/com/crimeLink/analyzer/dto/BulletUpdateDTO.java New DTO for bullet updates.
src/main/java/com/crimeLink/analyzer/dto/BulletResponseDTO.java New DTO for bullet responses.
src/main/java/com/crimeLink/analyzer/dto/BulletAddDTO.java New DTO for adding bullet stock.
src/main/java/com/crimeLink/analyzer/controller/WeaponRequestController.java New REST API for weapon request workflow.
src/main/java/com/crimeLink/analyzer/controller/WeaponIssueController.java Adds endpoints for officer weapon issue history/active issues.
src/main/java/com/crimeLink/analyzer/controller/WeaponController.java Adds endpoint to list weapons issued to an officer.
src/main/java/com/crimeLink/analyzer/controller/UserController.java Adds endpoint to fetch all officers/users.
src/main/java/com/crimeLink/analyzer/controller/ReqquiredArgsConstructor.java Adds a custom annotation (likely unintended).
src/main/java/com/crimeLink/analyzer/controller/FacialRecognitionController.java Extends registration request params forwarded to ML service.
src/main/java/com/crimeLink/analyzer/controller/CriminalController.java New REST API for DB-backed criminal CRUD.
src/main/java/com/crimeLink/analyzer/controller/BulletController.java New REST API for bullet stock CRUD.
src/main/java/com/crimeLink/analyzer/controller/AdminController.java Implements backup/restore endpoints + system settings endpoints with admin authorization.
src/main/java/com/crimeLink/analyzer/config/SecurityConfig.java Adjusts role rules for ML endpoints and criminal CRUD; changes weapon route authorization.
.gitignore Ignores local backups directory.
.github/workflows/codeql.yml Runs CodeQL on Dev branch as well as main.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

WHERE wi.issuedTo.userId = :userId
AND wi.returnedAt IS NULL
""")
List<Weapon> findActiveWeaponsByOfficer(@Param("officerId") Integer officerId);
Comment on lines +85 to 86
.requestMatchers("/api/weapon/**").permitAll()
.requestMatchers("/api/weapon-issue/**").hasRole("OIC")
Comment on lines +89 to +92
@GetMapping("/issued/{officerId}")
public List<WeaponIssue> getActiveWeapons(@PathVariable Integer officerId) {
return weaponIssueRepository.findByIssuedTo_UserIdAndReturnedAtIsNullOrderByIssuedAtDesc(officerId);
}
Comment on lines +94 to +97
@GetMapping("/history/{officerId}")
public List<WeaponIssue> getWeaponIssueHistory(@PathVariable Integer officerId) {
return weaponIssueRepository.findByIssuedTo_UserIdOrderByIssuedAtDesc(officerId);
}
Comment on lines +9 to +15

@Repository
public interface WeaponRequestRepository extends JpaRepository<WeaponRequest, Integer> {

List<WeaponRequest> findByRequestedBy_UserId(Integer userId);

List<WeaponRequest> findByStatus(String status);
Comment on lines +3 to +5
public @interface ReqquiredArgsConstructor {

}
Comment on lines +14 to +16
WeaponRequestDto approvedRequest(Integer requestId);

WeaponRequestDto rejectedRequest(Integer requestId);
Comment on lines +93 to +94
public List<Weapon> getWeaponsIssuedToOfficer(@PathVariable Integer officerId) {
return weaponService.getWeaponsIssuedToOfficer(officerId);

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces a weapon request workflow (request/approve/reject) and adds new endpoints for retrieving weapons/weapon-issue data per officer, alongside updates to repositories/services and an adjustment to security routing.

Changes:

  • Add WeaponRequest domain model (entity/status/DTO/mapper/repository) plus service + controller for creating and resolving weapon requests.
  • Add officer-scoped retrieval endpoints for issued weapons / weapon issue history and supporting repository/service methods.
  • Modify Spring Security route authorization for weapon-related endpoints.

Reviewed changes

Copilot reviewed 16 out of 16 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
src/main/java/com/crimeLink/analyzer/service/WeaponService.java Adds service API for querying weapons issued to an officer.
src/main/java/com/crimeLink/analyzer/service/WeaponRequestService.java Introduces weapon request service interface.
src/main/java/com/crimeLink/analyzer/service/impl/WeaponServiceImpl.java Implements officer-issued weapon lookup and minor formatting.
src/main/java/com/crimeLink/analyzer/service/impl/WeaponRequestServiceImpl.java Implements create/list/approve/reject flows for weapon requests.
src/main/java/com/crimeLink/analyzer/repository/WeaponRequestRepository.java Adds repository for weapon requests and query helpers.
src/main/java/com/crimeLink/analyzer/repository/WeaponRepository.java Adds JPQL query to fetch currently issued weapons for an officer.
src/main/java/com/crimeLink/analyzer/repository/WeaponIssueRepository.java Adds query methods for officer issue history and active issues.
src/main/java/com/crimeLink/analyzer/mapper/WeaponRequestMapper.java Maps between WeaponRequest entity and DTO.
src/main/java/com/crimeLink/analyzer/entity/WeaponRequestStatus.java Adds enum representing request state.
src/main/java/com/crimeLink/analyzer/entity/WeaponRequest.java Adds JPA entity for weapon requests.
src/main/java/com/crimeLink/analyzer/dto/WeaponRequestDto.java Adds DTO for weapon request API payloads.
src/main/java/com/crimeLink/analyzer/controller/WeaponRequestController.java Adds REST endpoints for weapon request CRUD-ish operations.
src/main/java/com/crimeLink/analyzer/controller/WeaponIssueController.java Adds officer issue-history endpoints and injects repository.
src/main/java/com/crimeLink/analyzer/controller/WeaponController.java Adds endpoint to list weapons issued to a specific officer.
src/main/java/com/crimeLink/analyzer/controller/ReqquiredArgsConstructor.java Adds a custom (misspelled) annotation in controller package.
src/main/java/com/crimeLink/analyzer/config/SecurityConfig.java Changes authorization rules for /api/weapon/** routes.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@Query("""
SELECT wi.weapon
FROM WeaponIssue wi
WHERE wi.issuedTo.userId = :userId
// OIC-only routes
.requestMatchers("/api/duty-schedules/**").hasRole("OIC")
.requestMatchers("/api/weapon/**").hasRole("OIC")
.requestMatchers("/api/weapon/**").permitAll()
Comment on lines +89 to +97
@GetMapping("/issued/{officerId}")
public List<WeaponIssue> getActiveWeapons(@PathVariable Integer officerId) {
return weaponIssueRepository.findByIssuedTo_UserIdAndReturnedAtIsNullOrderByIssuedAtDesc(officerId);
}

@GetMapping("/history/{officerId}")
public List<WeaponIssue> getWeaponIssueHistory(@PathVariable Integer officerId) {
return weaponIssueRepository.findByIssuedTo_UserIdOrderByIssuedAtDesc(officerId);
}
Comment on lines +89 to +97
@GetMapping("/issued/{officerId}")
public List<WeaponIssue> getActiveWeapons(@PathVariable Integer officerId) {
return weaponIssueRepository.findByIssuedTo_UserIdAndReturnedAtIsNullOrderByIssuedAtDesc(officerId);
}

@GetMapping("/history/{officerId}")
public List<WeaponIssue> getWeaponIssueHistory(@PathVariable Integer officerId) {
return weaponIssueRepository.findByIssuedTo_UserIdOrderByIssuedAtDesc(officerId);
}
Comment on lines +9 to +15

@Repository
public interface WeaponRequestRepository extends JpaRepository<WeaponRequest, Integer> {

List<WeaponRequest> findByRequestedBy_UserId(Integer userId);

List<WeaponRequest> findByStatus(String status);
@@ -0,0 +1,5 @@
package com.crimeLink.analyzer.controller;

@JinethBosilu JinethBosilu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok

@JinethBosilu
JinethBosilu merged commit 38a6d48 into main Mar 14, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants