MCPcopy Create free account
hub / github.com/aptabase/aptabase / ExportController

Class ExportController

src/Features/Export/ExportController.cs:26–436  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

24}
25
26[ApiController, IsAuthenticated, HasReadAccessToApp]
27[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
28public partial class ExportController(IQueryClient queryClient, ILogger<ExportController> logger) : Controller
29{
30 private readonly IQueryClient _queryClient = queryClient ?? throw new ArgumentNullException(nameof(queryClient));
31 private readonly ILogger<ExportController> _logger = logger;
32
33 [HttpGet("/api/_export/usage")]
34 public async Task<IActionResult> MonthlyUsage([FromQuery] string buildMode, [FromQuery] string appId, CancellationToken cancellationToken)
35 {
36 var rows = await _queryClient.NamedQueryAsync<MonthlyUsage>("monthly_usage__v1", new {
37 app_id = GetAppId(buildMode, appId)
38 }, cancellationToken);
39
40 if (buildMode.Equals("debug", StringComparison.OrdinalIgnoreCase))
41 {
42 return Ok(rows.Take(5));
43 }
44
45 return Ok(rows);
46 }
47
48 [HttpGet("/api/_export/download")]
49 public async Task<IActionResult> Download([FromQuery] DownloadRequest body)
50 {
51 if (!body.StartDate.HasValue || !body.EndDate.HasValue)
52 {
53 return BadRequest();
54 }
55
56 var startDate = body.StartDate.Value;
57 var endDate = body.EndDate.Value;
58
59 var (formatName, contentType, fileExtension) = GetFormat(body.Format);
60 var appName = UnsafeCharacters().Replace(body.AppName, "").ToLower();
61 var fileName = $"{appName}-{body.BuildMode.ToLower()}-{startDate:yyyy-MM-dd}.{fileExtension}";
62
63 var countQuery = $@"SELECT COUNT(*) as event_count
64 FROM events
65 WHERE app_id = '{GetAppId(body.BuildMode, body.AppId)}'
66 AND timestamp BETWEEN '{startDate:yyyy-MM-dd HH:mm:ss}' AND '{endDate:yyyy-MM-dd HH:mm:ss}'
67 FORMAT JSON";
68
69 using var stream = await _queryClient.StreamResponseAsync(countQuery, HttpContext.RequestAborted);
70 long eventCount = 0;
71 using var reader = new StreamReader(stream);
72 var jsonString = await reader.ReadToEndAsync();
73 using var doc = JsonDocument.Parse(jsonString);
74 var root = doc.RootElement;
75
76 if (root.TryGetProperty("data", out JsonElement data) &&
77 data.GetArrayLength() > 0 &&
78 data[0].TryGetProperty("event_count", out JsonElement countElement))
79 {
80 switch (countElement.ValueKind)
81 {
82 case JsonValueKind.Number:
83 _ = countElement.TryGetInt64(out eventCount);

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected