sakthivikram/geo-location
0
1package com.georeport.controller;2 3import com.georeport.dto.*;4import com.georeport.entity.IssueStatus;5import com.georeport.entity.User;6import com.georeport.service.AuthService;7import com.georeport.service.IssueService;8import jakarta.validation.Valid;9import org.springframework.beans.factory.annotation.Autowired;10import org.springframework.data.domain.Page;11import org.springframework.data.domain.PageRequest;12import org.springframework.data.domain.Pageable;13import org.springframework.data.domain.Sort;14import org.springframework.format.annotation.DateTimeFormat;15import org.springframework.http.ResponseEntity;16import org.springframework.security.access.prepost.PreAuthorize;17import org.springframework.web.bind.annotation.*;18 19import java.time.LocalDateTime;20import java.util.List;21 22/**23 * REST Controller for admin operations.24 * Handles issue management, status updates, and dashboard statistics.25 */26@RestController27@RequestMapping("/api/admin")28@PreAuthorize("hasRole('ADMIN')")29@CrossOrigin(origins = "*")30public class AdminController {31 32 @Autowired33 private IssueService issueService;34 35 @Autowired36 private AuthService authService;37 38 /**39 * Get dashboard statistics40 * GET /api/admin/stats41 */42 @GetMapping("/stats")43 public ResponseEntity<ApiResponse<DashboardStats>> getDashboardStats() {44 DashboardStats stats = issueService.getDashboardStats();45 return ResponseEntity.ok(ApiResponse.success(stats));46 }47 48 /**49 * Get all issues with advanced filters50 * GET /api/admin/issues51 */52 @GetMapping("/issues")53 public ResponseEntity<ApiResponse<Page<IssueResponse>>> getAllIssues(54 @RequestParam(required = false) IssueStatus status,55 @RequestParam(required = false) Long categoryId,56 @RequestParam(required = false) String ward,57 @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime startDate,58 @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endDate,59 @RequestParam(defaultValue = "0") int page,60 @RequestParam(defaultValue = "20") int size,61 @RequestParam(defaultValue = "createdAt") String sortBy,62 @RequestParam(defaultValue = "desc") String sortDir) {63 64 Sort sort = sortDir.equalsIgnoreCase("asc")65 ? Sort.by(sortBy).ascending()66 : Sort.by(sortBy).descending();67 Pageable pageable = PageRequest.of(page, size, sort);68 69 Page<IssueResponse> issues = issueService.getAllIssues(status, categoryId, ward, startDate, endDate, pageable);70 return ResponseEntity.ok(ApiResponse.success(issues));71 }72 73 /**74 * Update issue status75 * PUT /api/admin/issues/{id}/status76 */77 @PutMapping("/issues/{id}/status")78 public ResponseEntity<ApiResponse<IssueResponse>> updateIssueStatus(79 @PathVariable Long id,80 @Valid @RequestBody UpdateStatusRequest request) {81 82 User admin = authService.getCurrentUser();83 IssueResponse response = issueService.updateIssueStatus(id, request, admin);84 return ResponseEntity.ok(ApiResponse.success("Status updated successfully", response));85 }86 87 /**88 * Get issues by status89 * GET /api/admin/issues/by-status/{status}90 */91 @GetMapping("/issues/by-status/{status}")92 public ResponseEntity<ApiResponse<Page<IssueResponse>>> getIssuesByStatus(93 @PathVariable IssueStatus status,94 @RequestParam(defaultValue = "0") int page,95 @RequestParam(defaultValue = "20") int size) {96 97 Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").descending());98 Page<IssueResponse> issues = issueService.getAllIssues(status, null, null, null, null, pageable);99 return ResponseEntity.ok(ApiResponse.success(issues));100 }101 102 /**103 * Get available wards104 * GET /api/admin/wards105 */106 @GetMapping("/wards")107 public ResponseEntity<ApiResponse<List<String>>> getWards() {108 DashboardStats stats = issueService.getDashboardStats();109 List<String> wards = stats.getIssuesByWard().keySet().stream().sorted().toList();110 return ResponseEntity.ok(ApiResponse.success(wards));111 }112}113 