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.http.MediaType;15import org.springframework.http.ResponseEntity;16import org.springframework.security.access.prepost.PreAuthorize;17import org.springframework.web.bind.annotation.*;18import org.springframework.web.multipart.MultipartFile;19 20import java.util.List;21 22/**23 * REST Controller for issue management.24 * Handles issue creation, retrieval, and status tracking.25 */26@RestController27@RequestMapping("/api/issues")28@CrossOrigin(origins = "*")29public class IssueController {30 31 @Autowired32 private IssueService issueService;33 34 @Autowired35 private AuthService authService;36 37 /**38 * Create a new issue39 * POST /api/issues40 */41 @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)42 @PreAuthorize("isAuthenticated()")43 public ResponseEntity<ApiResponse<IssueResponse>> createIssue(44 @Valid @RequestPart("issue") CreateIssueRequest request,45 @RequestPart(value = "images", required = false) List<MultipartFile> images) {46 47 User reporter = authService.getCurrentUser();48 IssueResponse response = issueService.createIssue(request, reporter, images);49 return ResponseEntity.ok(ApiResponse.success("Issue reported successfully", response));50 }51 52 /**53 * Get issue by ID54 * GET /api/issues/{id}55 */56 @GetMapping("/{id}")57 public ResponseEntity<ApiResponse<IssueResponse>> getIssue(@PathVariable Long id) {58 IssueResponse response = issueService.getIssueById(id);59 return ResponseEntity.ok(ApiResponse.success(response));60 }61 62 /**63 * Delete issue64 * DELETE /api/issues/{id}65 */66 @DeleteMapping("/{id}")67 @PreAuthorize("isAuthenticated()")68 public ResponseEntity<ApiResponse<Void>> deleteIssue(@PathVariable Long id) {69 User user = authService.getCurrentUser();70 issueService.deleteIssue(id, user);71 return ResponseEntity.ok(ApiResponse.success("Issue deleted successfully", null));72 }73 74 /**75 * Update issue details76 * PUT /api/issues/{id}77 */78 @PutMapping("/{id}")79 @PreAuthorize("isAuthenticated()")80 public ResponseEntity<ApiResponse<IssueResponse>> updateIssue(81 @PathVariable Long id,82 @RequestBody @Valid CreateIssueRequest request) {83 User user = authService.getCurrentUser();84 IssueResponse response = issueService.updateIssueDetails(id, request, user);85 return ResponseEntity.ok(ApiResponse.success("Issue updated successfully", response));86 }87 88 /**89 * Get issues for current user90 * GET /api/issues/my-issues91 */92 @GetMapping("/my-issues")93 @PreAuthorize("isAuthenticated()")94 public ResponseEntity<ApiResponse<List<IssueResponse>>> getMyIssues() {95 User user = authService.getCurrentUser();96 List<IssueResponse> issues = issueService.getIssuesByReporter(user.getId());97 return ResponseEntity.ok(ApiResponse.success(issues));98 }99 100 /**101 * Get status history for an issue102 * GET /api/issues/{id}/history103 */104 @GetMapping("/{id}/history")105 public ResponseEntity<ApiResponse<List<StatusHistoryResponse>>> getStatusHistory(@PathVariable Long id) {106 List<StatusHistoryResponse> history = issueService.getStatusHistory(id);107 return ResponseEntity.ok(ApiResponse.success(history));108 }109 110 /**111 * Get nearby issues (public endpoint)112 * GET /api/issues/public/nearby113 */114 @GetMapping("/public/nearby")115 public ResponseEntity<ApiResponse<List<IssueResponse>>> getNearbyIssues(116 @RequestParam double latitude,117 @RequestParam double longitude,118 @RequestParam(defaultValue = "5000") double radius) {119 120 List<IssueResponse> issues = issueService.getNearbyIssues(latitude, longitude, radius);121 return ResponseEntity.ok(ApiResponse.success(issues));122 }123 124 /**125 * Get issues within bounding box (for map viewport)126 * GET /api/issues/public/bounds127 */128 @GetMapping("/public/bounds")129 public ResponseEntity<ApiResponse<List<IssueResponse>>> getIssuesInBounds(130 @RequestParam double minLng,131 @RequestParam double minLat,132 @RequestParam double maxLng,133 @RequestParam double maxLat) {134 135 List<IssueResponse> issues = issueService.getIssuesInBounds(minLng, minLat, maxLng, maxLat);136 return ResponseEntity.ok(ApiResponse.success(issues));137 }138 139 /**140 * Get all issues with filters and pagination (public)141 * GET /api/issues/public/all142 */143 @GetMapping("/public/all")144 public ResponseEntity<ApiResponse<Page<IssueResponse>>> getAllIssues(145 @RequestParam(required = false) IssueStatus status,146 @RequestParam(required = false) Long categoryId,147 @RequestParam(required = false) String ward,148 @RequestParam(defaultValue = "0") int page,149 @RequestParam(defaultValue = "20") int size) {150 151 Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").descending());152 Page<IssueResponse> issues = issueService.getAllIssues(status, categoryId, ward, null, null, pageable);153 return ResponseEntity.ok(ApiResponse.success(issues));154 }155 156 /**157 * Advanced search endpoint with multiple filters158 * POST /api/issues/search159 */160 @PostMapping("/search")161 public ResponseEntity<ApiResponse<Page<IssueResponse>>> searchIssues(162 @RequestBody IssueSearchRequest request,163 @RequestParam(defaultValue = "0") int page,164 @RequestParam(defaultValue = "20") int size) {165 166 // Create sort167 Sort sort = Sort.by(168 "desc".equalsIgnoreCase(request.getSortDirection()) ? Sort.Direction.DESC : Sort.Direction.ASC,169 request.getSortBy() != null ? request.getSortBy() : "createdAt");170 Pageable pageable = PageRequest.of(page, size, sort);171 172 Page<IssueResponse> issues = issueService.searchIssues(request, pageable);173 return ResponseEntity.ok(ApiResponse.success(issues));174 }175 176 /**177 * Public advanced search endpoint (no auth required)178 * POST /api/issues/public/search179 */180 @PostMapping("/public/search")181 public ResponseEntity<ApiResponse<Page<IssueResponse>>> publicSearchIssues(182 @RequestBody IssueSearchRequest request,183 @RequestParam(defaultValue = "0") int page,184 @RequestParam(defaultValue = "20") int size) {185 186 Sort sort = Sort.by(187 "desc".equalsIgnoreCase(request.getSortDirection()) ? Sort.Direction.DESC : Sort.Direction.ASC,188 request.getSortBy() != null ? request.getSortBy() : "createdAt");189 Pageable pageable = PageRequest.of(page, size, sort);190 191 Page<IssueResponse> issues = issueService.searchIssues(request, pageable);192 return ResponseEntity.ok(ApiResponse.success(issues));193 }194}195 