141 行
5.8 KiB
Java
141 行
5.8 KiB
Java
|
|
package com.xuqm.log.controller;
|
||
|
|
|
||
|
|
import com.xuqm.common.model.ApiResponse;
|
||
|
|
import com.xuqm.common.model.PageResult;
|
||
|
|
import com.xuqm.log.dto.*;
|
||
|
|
import com.xuqm.log.service.LogService;
|
||
|
|
import com.xuqm.log.service.SourcemapService;
|
||
|
|
import com.xuqm.log.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("/log/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<Void> ingestIssues(@Valid @RequestBody IssueBatchRequest request) {
|
||
|
|
logService.processIssueBatch(request);
|
||
|
|
return ApiResponse.ok();
|
||
|
|
}
|
||
|
|
|
||
|
|
@PostMapping("/events/batch")
|
||
|
|
public ApiResponse<Void> ingestEvents(@Valid @RequestBody EventBatchRequest request) {
|
||
|
|
logService.processEventBatch(request);
|
||
|
|
return ApiResponse.ok();
|
||
|
|
}
|
||
|
|
|
||
|
|
@GetMapping("/issues")
|
||
|
|
public ApiResponse<PageResult<IssueResponse>> 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<IssueResponse> 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<IssueResponse> getIssueDetail(@PathVariable Long id) {
|
||
|
|
return ApiResponse.success(logService.getIssueDetail(id));
|
||
|
|
}
|
||
|
|
|
||
|
|
@GetMapping("/issues/rankings/frequency")
|
||
|
|
public ApiResponse<List<IssueResponse>> 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<List<IssueResponse>> 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<PageResult<IssueEventResponse>> 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<IssueEventResponse> 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<FunnelResponse> queryFunnel(
|
||
|
|
@RequestParam String appKey,
|
||
|
|
@RequestParam String steps,
|
||
|
|
@RequestParam(required = false) String from,
|
||
|
|
@RequestParam(required = false) String to) {
|
||
|
|
List<String> stepList = List.of(steps.split(","));
|
||
|
|
return ApiResponse.success(logService.queryFunnel(appKey, stepList, from, to));
|
||
|
|
}
|
||
|
|
|
||
|
|
@GetMapping("/overview")
|
||
|
|
public ApiResponse<OverviewResponse> 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<SourcemapUploadResponse> 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<List<WebhookResponse>> listWebhooks(@RequestParam String appKey) {
|
||
|
|
return ApiResponse.success(webhookService.listWebhooks(appKey));
|
||
|
|
}
|
||
|
|
|
||
|
|
@PostMapping("/webhooks")
|
||
|
|
public ApiResponse<WebhookResponse> createWebhook(@Valid @RequestBody WebhookRequest request) {
|
||
|
|
return ApiResponse.success(webhookService.createWebhook(request));
|
||
|
|
}
|
||
|
|
|
||
|
|
@PutMapping("/webhooks/{id}")
|
||
|
|
public ApiResponse<WebhookResponse> updateWebhook(@PathVariable Long id, @Valid @RequestBody WebhookRequest request) {
|
||
|
|
return ApiResponse.success(webhookService.updateWebhook(id, request));
|
||
|
|
}
|
||
|
|
|
||
|
|
@DeleteMapping("/webhooks/{id}")
|
||
|
|
public ApiResponse<Void> deleteWebhook(@PathVariable Long id) {
|
||
|
|
webhookService.deleteWebhook(id);
|
||
|
|
return ApiResponse.ok();
|
||
|
|
}
|
||
|
|
}
|