Skip to content
This repository was archived by the owner on Jul 6, 2025. It is now read-only.

Commit fb21ad3

Browse files
committed
feat: Add metrics API with request and response DTOs for revenue, orders, and user statistics
1 parent 194c094 commit fb21ad3

3 files changed

Lines changed: 134 additions & 0 deletions

File tree

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.zenfulcode.commercify.api.system;
2+
3+
import com.zenfulcode.commercify.api.system.dto.MetricsRequest;
4+
import com.zenfulcode.commercify.api.system.dto.MetricsResponse;
5+
import com.zenfulcode.commercify.metrics.application.MetricsApplicationService;
6+
import com.zenfulcode.commercify.metrics.application.dto.MetricsQuery;
7+
import com.zenfulcode.commercify.shared.interfaces.ApiResponse;
8+
import lombok.RequiredArgsConstructor;
9+
import lombok.extern.slf4j.Slf4j;
10+
import org.springframework.format.annotation.DateTimeFormat;
11+
import org.springframework.http.ResponseEntity;
12+
import org.springframework.security.access.prepost.PreAuthorize;
13+
import org.springframework.validation.annotation.Validated;
14+
import org.springframework.web.bind.annotation.*;
15+
16+
import java.time.LocalDate;
17+
18+
@Slf4j
19+
@RestController
20+
@RequestMapping("/api/v2/metrics")
21+
@RequiredArgsConstructor
22+
public class MetricsController {
23+
24+
private final MetricsApplicationService metricsService;
25+
26+
@GetMapping
27+
@PreAuthorize("hasRole('ADMIN')")
28+
public ResponseEntity<ApiResponse<MetricsResponse>> getMetrics(
29+
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
30+
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate,
31+
@RequestParam(required = false) Integer lastDays) {
32+
33+
log.info("Getting metrics");
34+
35+
MetricsRequest request = new MetricsRequest(startDate, endDate, lastDays);
36+
37+
// Handle either date range or "last X days"
38+
if (lastDays != null) {
39+
request.setLastDays(lastDays);
40+
} else {
41+
request.setStartDate(startDate);
42+
request.setEndDate(endDate);
43+
}
44+
45+
final MetricsQuery metricsQuery = MetricsQuery.of(request);
46+
47+
MetricsResponse metrics = metricsService.getMetrics(metricsQuery);
48+
return ResponseEntity.ok(ApiResponse.success(metrics));
49+
}
50+
51+
@PostMapping
52+
@PreAuthorize("hasRole('ADMIN')")
53+
public ResponseEntity<ApiResponse<MetricsResponse>> getMetricsWithFilters(
54+
@Validated @RequestBody MetricsRequest request) {
55+
56+
final MetricsQuery metricsQuery = MetricsQuery.of(request);
57+
58+
MetricsResponse metrics = metricsService.getMetrics(metricsQuery);
59+
return ResponseEntity.ok(ApiResponse.success(metrics));
60+
}
61+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.zenfulcode.commercify.api.system.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnore;
4+
import jakarta.validation.constraints.Min;
5+
import lombok.Data;
6+
import org.springframework.format.annotation.DateTimeFormat;
7+
8+
import java.time.LocalDate;
9+
10+
@Data
11+
public class MetricsRequest {
12+
private LocalDate startDate;
13+
private LocalDate endDate;
14+
15+
@Min(1)
16+
private Integer lastDays;
17+
18+
public MetricsRequest(@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
19+
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate,
20+
Integer lastDays) {
21+
this.startDate = startDate;
22+
this.endDate = endDate;
23+
this.lastDays = lastDays;
24+
}
25+
26+
// Optional filters
27+
private String productCategory;
28+
private String region;
29+
30+
@JsonIgnore
31+
public LocalDate getEffectiveStartDate() {
32+
if (lastDays != null) {
33+
return LocalDate.now().minusDays(lastDays);
34+
}
35+
return startDate != null ? startDate : LocalDate.now().minusDays(30); // Default 30 days
36+
}
37+
38+
@JsonIgnore
39+
public LocalDate getEffectiveEndDate() {
40+
return endDate != null ? endDate : LocalDate.now();
41+
}
42+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.zenfulcode.commercify.api.system.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonFormat;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Data;
7+
import lombok.NoArgsConstructor;
8+
9+
import java.math.BigDecimal;
10+
import java.time.LocalDate;
11+
12+
@Data
13+
@Builder
14+
@NoArgsConstructor
15+
@AllArgsConstructor
16+
public class MetricsResponse {
17+
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
18+
private LocalDate startDate;
19+
20+
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
21+
private LocalDate endDate;
22+
23+
private BigDecimal totalRevenue;
24+
private int totalOrders;
25+
private int newProductsAdded;
26+
private int activeUsers;
27+
28+
// Optional: include trend data
29+
private BigDecimal revenueChangePercent;
30+
private int orderChangePercent;
31+
}

0 commit comments

Comments
 (0)