package com.xuqm.bugcollect.controller; import com.xuqm.common.model.ApiResponse; import com.xuqm.common.model.PageResult; import com.xuqm.bugcollect.dto.*; import com.xuqm.bugcollect.service.LogService; import com.xuqm.bugcollect.service.SourcemapService; import com.xuqm.bugcollect.service.WebhookService; import jakarta.validation.Valid; import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; @RestController @RequestMapping("/bugcollect/v1") public class LogController { private final LogService logService; private final SourcemapService sourcemapService; private final WebhookService webhookService; public LogController(LogService logService, SourcemapService sourcemapService, WebhookService webhookService) { this.logService = logService; this.sourcemapService = sourcemapService; this.webhookService = webhookService; } @PostMapping("/issues/batch") public ApiResponse ingestIssues(@Valid @RequestBody IssueBatchRequest request) { logService.processIssueBatch(request); return ApiResponse.ok(); } @PostMapping("/events/batch") public ApiResponse ingestEvents(@Valid @RequestBody EventBatchRequest request) { logService.processEventBatch(request); return ApiResponse.ok(); } @GetMapping("/issues") public ApiResponse> queryIssues( @RequestParam String appKey, @RequestParam(required = false) String type, @RequestParam(required = false) String platform, @RequestParam(required = false) String from, @RequestParam(required = false) String to, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int size) { Page result = logService.queryIssues(appKey, type, platform, from, to, page - 1, size); return ApiResponse.success(PageResult.of(result.getContent(), result.getTotalElements(), page, size)); } @GetMapping("/issues/{id}") public ApiResponse getIssueDetail(@PathVariable Long id) { return ApiResponse.success(logService.getIssueDetail(id)); } @GetMapping("/issues/rankings/frequency") public ApiResponse> getFrequencyRankings( @RequestParam String appKey, @RequestParam(required = false) String from, @RequestParam(required = false) String to, @RequestParam(defaultValue = "20") int limit) { return ApiResponse.success(logService.getFrequencyRankings(appKey, from, to, limit)); } @GetMapping("/issues/rankings/risk") public ApiResponse> getRiskRankings( @RequestParam String appKey, @RequestParam(required = false) String from, @RequestParam(required = false) String to, @RequestParam(defaultValue = "20") int limit) { return ApiResponse.success(logService.getRiskRankings(appKey, from, to, limit)); } @GetMapping("/events") public ApiResponse> queryEvents( @RequestParam String appKey, @RequestParam(required = false) String name, @RequestParam(required = false) String userId, @RequestParam(required = false) String from, @RequestParam(required = false) String to, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int size) { Page result = logService.queryEvents(appKey, name, userId, from, to, page - 1, size); return ApiResponse.success(PageResult.of(result.getContent(), result.getTotalElements(), page, size)); } @GetMapping("/events/funnel") public ApiResponse queryFunnel( @RequestParam String appKey, @RequestParam String steps, @RequestParam(required = false) String from, @RequestParam(required = false) String to) { List stepList = List.of(steps.split(",")); return ApiResponse.success(logService.queryFunnel(appKey, stepList, from, to)); } @GetMapping("/overview") public ApiResponse getOverview( @RequestParam String appKey, @RequestParam(required = false) String from, @RequestParam(required = false) String to) { return ApiResponse.success(logService.getOverview(appKey, from, to)); } @PostMapping("/sourcemaps/upload") public ApiResponse uploadSourcemap( @RequestParam String appKey, @RequestParam String platform, @RequestParam String appVersion, @RequestParam(required = false, defaultValue = "index") String bundleName, @RequestParam("file") MultipartFile file) throws IOException { return ApiResponse.success(sourcemapService.upload(appKey, platform, appVersion, bundleName, file)); } @GetMapping("/webhooks") public ApiResponse> listWebhooks(@RequestParam String appKey) { return ApiResponse.success(webhookService.listWebhooks(appKey)); } @PostMapping("/webhooks") public ApiResponse createWebhook(@Valid @RequestBody WebhookRequest request) { return ApiResponse.success(webhookService.createWebhook(request)); } @PutMapping("/webhooks/{id}") public ApiResponse updateWebhook(@PathVariable Long id, @Valid @RequestBody WebhookRequest request) { return ApiResponse.success(webhookService.updateWebhook(id, request)); } @DeleteMapping("/webhooks/{id}") public ApiResponse deleteWebhook(@PathVariable Long id) { webhookService.deleteWebhook(id); return ApiResponse.ok(); } }