Add API endpoints for weapon issuance and requests - #42
Conversation
There was a problem hiding this comment.
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
WeaponRequestdomain 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); |
| @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); | ||
| } |
| private final WeaponIssueService weaponIssueService; | ||
| private final WeaponIssueRepository weaponIssueRepository; | ||
|
|
| public @interface ReqquiredArgsConstructor { | ||
|
|
||
| } |
|
|
||
| @Repository | ||
| public interface WeaponRequestRepository extends JpaRepository<WeaponRequest, Integer> { | ||
|
|
||
| List<WeaponRequest> findByRequestedBy_UserId(Integer userId); | ||
|
|
||
| List<WeaponRequest> findByStatus(String status); |
| @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)); | ||
| } |
| @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)); | ||
| } |
| public List<Weapon> getWeaponsIssuedToOfficer(@PathVariable Integer officerId) { | ||
| return weaponService.getWeaponsIssuedToOfficer(officerId); |
… include Investigator role
…urity roles for ML service endpoints
…d and embedding generation
Updated CodeQL workflow to include 'Dev' branch for push and pull_request events.
…add default bucket configuration in application.properties
…ngs management and admin controls.
… include Investigator role
There was a problem hiding this comment.
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); |
| .requestMatchers("/api/weapon/**").permitAll() | ||
| .requestMatchers("/api/weapon-issue/**").hasRole("OIC") |
| @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); | ||
| } |
|
|
||
| @Repository | ||
| public interface WeaponRequestRepository extends JpaRepository<WeaponRequest, Integer> { | ||
|
|
||
| List<WeaponRequest> findByRequestedBy_UserId(Integer userId); | ||
|
|
||
| List<WeaponRequest> findByStatus(String status); |
| public @interface ReqquiredArgsConstructor { | ||
|
|
||
| } |
| WeaponRequestDto approvedRequest(Integer requestId); | ||
|
|
||
| WeaponRequestDto rejectedRequest(Integer requestId); |
| public List<Weapon> getWeaponsIssuedToOfficer(@PathVariable Integer officerId) { | ||
| return weaponService.getWeaponsIssuedToOfficer(officerId); |
There was a problem hiding this comment.
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
WeaponRequestdomain 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() |
| @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); | ||
| } |
| @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); | ||
| } |
|
|
||
| @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; | |||
|
|
|||
No description provided.