Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions Doppler.ReportingApi/Controllers/SummaryController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,26 @@ public async Task<IActionResult> GetSubscribers(string accountName, [FromQuery]
return new OkObjectResult(result);
}

[HttpGet]
[Route("{accountName}/dashboard/subscribers")]
[ProducesResponseType(typeof(SubscriberStatusStat), 200)]
[Produces("application/json")]
[Authorize(Policies.OWN_RESOURCE_OR_SUPERUSER)]
public async Task<IActionResult> GetSubscribersDashboard(string accountName, [FromQuery] BasicDateFilter dateFilter)
{
if (!dateFilter.StartDate.HasValue || !dateFilter.EndDate.HasValue)
{
return new BadRequestObjectResult("StartDate and EndDate are required fields");
}

var startDate = dateFilter.StartDate.Value.UtcDateTime;
var endDate = dateFilter.EndDate.Value.UtcDateTime;

var result = await _summaryRepository.GetSubscribersDashboardByUserAsync(accountName, startDate, endDate);

return new OkObjectResult(result);
}

/// <summary>
/// Returns an object with info about the use of Doppler by a particular user
/// </summary>
Expand Down
2 changes: 2 additions & 0 deletions Doppler.ReportingApi/Infrastructure/ISummaryRepository.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Doppler.ReportingApi.Models;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Doppler.ReportingApi.Infrastructure
Expand All @@ -8,6 +9,7 @@ public interface ISummaryRepository
{
Task<CampaignsSummary> GetCampaignsSummaryByUserAsync(string userName, DateTime startDate, DateTime endDate);
Task<SubscribersSummary> GetSubscribersSummaryByUserAsync(string userName, DateTime startDate, DateTime endDate);
Task<IEnumerable<SubscriberStatusStat>> GetSubscribersDashboardByUserAsync(string userName, DateTime startDate, DateTime endDate);
Task<SystemUsageSummary> GetSystemUsageAsync(string accountName);
}
}
49 changes: 49 additions & 0 deletions Doppler.ReportingApi/Infrastructure/SummaryRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,55 @@ FROM Subscriber S
}
}

public async Task<IEnumerable<SubscriberStatusStat>> GetSubscribersDashboardByUserAsync(
string userName,
DateTime startDate,
DateTime endDate)
{
using (var connection = _connectionFactory.GetConnection())
{
var query = @"
DECLARE @idUser INT;
DECLARE @timezone INT;

SELECT @idUser = IdUser
FROM [User]
WHERE Email = @userName;

SELECT @timezone = timezone.offset
FROM dbo.usertimezone timezone
INNER JOIN dbo.[User] u ON u.idusertimezone = timezone.idusertimezone
WHERE u.[Email] = @userName;

SELECT
StatsAt,
NewSubscribers,
ActiveSubscribers,
InactiveDisableSubscribers,
UnsubscribedByHardSubscribers,
UnsubscribedBySoftSubscribers,
UnsubscribedByNeverOpened,
PendingSubscribers,
UnsubscribedByClient,
StandBySubscribers
FROM SubscriberStatusStat
WHERE IdUser = @idUser
AND StatsAt >= CAST(DATEADD(MINUTE, @timezone, @startDate) AS DATE)
AND StatsAt < CAST(DATEADD(MINUTE, @timezone, @endDate) AS DATE)
ORDER BY StatsAt DESC;
";

return await connection.QueryAsync<SubscriberStatusStat>(
query,
new
{
userName,
startDate,
endDate
});
}
}

public async Task<SystemUsageSummary> GetSystemUsageAsync(string accountName)
{
using (var connection = _connectionFactory.GetConnection())
Expand Down
29 changes: 29 additions & 0 deletions Doppler.ReportingApi/Models/SubscriberStatusStat.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System;

namespace Doppler.ReportingApi.Models
{
public class SubscriberStatusStat
{
public DateTime StatsAt { get; set; }

public int NewSubscribers { get; set; }

public int ActiveSubscribers { get; set; }

public int InactiveDisableSubscribers { get; set; }

public int UnsubscribedByHardSubscribers { get; set; }

public int UnsubscribedBySoftSubscribers { get; set; }

public int UnsubscribedBySubscriber { get; set; }

public int UnsubscribedByNeverOpened { get; set; }

public int PendingSubscribers { get; set; }

public int UnsubscribedByClient { get; set; }

public int StandBySubscribers { get; set; }
}
}
Loading