94 lines
2.7 KiB
C#
94 lines
2.7 KiB
C#
using System.Security.Claims;
|
|
using FastEndpoints;
|
|
using TrackQrApi.Features.Plans.Services;
|
|
|
|
namespace TrackQrApi.Features.Plans.Endpoints;
|
|
|
|
public class GetUsageRequest
|
|
{
|
|
public Guid? WorkspaceId { get; set; }
|
|
}
|
|
|
|
public record UsageResponse(
|
|
int Workspaces,
|
|
int Links,
|
|
int QRCodes,
|
|
int Domains,
|
|
int EventsThisMonth,
|
|
string Plan,
|
|
LimitsResponse Limits
|
|
);
|
|
|
|
public record LimitsResponse(
|
|
int MaxWorkspaces,
|
|
int MaxLinks,
|
|
int MaxQRCodes,
|
|
int MaxDomains,
|
|
int MaxEventsPerMonth,
|
|
bool HasCustomDomains,
|
|
bool HasPasswordProtection
|
|
);
|
|
|
|
public class GetUsageEndpoint(IPlanLimitsService planLimits)
|
|
: Endpoint<GetUsageRequest, UsageResponse>
|
|
{
|
|
public override void Configure()
|
|
{
|
|
Get("/usage");
|
|
}
|
|
|
|
public override async Task HandleAsync(GetUsageRequest req, CancellationToken ct)
|
|
{
|
|
var userId = Guid.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)!);
|
|
|
|
if (req.WorkspaceId.HasValue)
|
|
{
|
|
var wsUsage = await planLimits.GetWorkspaceUsageAsync(req.WorkspaceId.Value, ct);
|
|
|
|
var response = new UsageResponse(
|
|
1,
|
|
wsUsage.Links,
|
|
wsUsage.QRCodes,
|
|
wsUsage.Domains,
|
|
wsUsage.EventsThisMonth,
|
|
wsUsage.Plan.ToString(),
|
|
new LimitsResponse(
|
|
wsUsage.Limits.MaxWorkspaces,
|
|
wsUsage.Limits.MaxLinksPerWorkspace,
|
|
wsUsage.Limits.MaxQRCodesPerWorkspace,
|
|
wsUsage.Limits.MaxDomainsPerWorkspace,
|
|
wsUsage.Limits.MaxEventsPerMonth,
|
|
wsUsage.Limits.HasCustomDomains,
|
|
wsUsage.Limits.HasPasswordProtection
|
|
)
|
|
);
|
|
|
|
await HttpContext.Response.SendAsync(response, cancellation: ct);
|
|
}
|
|
else
|
|
{
|
|
var usage = await planLimits.GetUsageAsync(userId, ct);
|
|
var limits = planLimits.GetLimits(usage.HighestPlan);
|
|
|
|
var response = new UsageResponse(
|
|
usage.TotalWorkspaces,
|
|
usage.TotalLinks,
|
|
usage.TotalQRCodes,
|
|
usage.TotalDomains,
|
|
usage.EventsThisMonth,
|
|
usage.HighestPlan.ToString(),
|
|
new LimitsResponse(
|
|
limits.MaxWorkspaces,
|
|
limits.MaxLinksPerWorkspace,
|
|
limits.MaxQRCodesPerWorkspace,
|
|
limits.MaxDomainsPerWorkspace,
|
|
limits.MaxEventsPerMonth,
|
|
limits.HasCustomDomains,
|
|
limits.HasPasswordProtection
|
|
)
|
|
);
|
|
|
|
await HttpContext.Response.SendAsync(response, cancellation: ct);
|
|
}
|
|
}
|
|
} |