CoolFace
Apppublic

sakthivikram/geo-location

sourceHugging Faceupdated 5mo agoView on Hugging Face
0likes
IssueController.java195 linesDownload Raw Back to controller
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