feat/Update_Controllers_to_Allow_for_Premium_Membership

This commit is contained in:
cesnimda
2026-08-03 09:17:28 +02:00
parent de937d25dc
commit c3f4a57195
187 changed files with 26062 additions and 991 deletions
@@ -35,6 +35,7 @@ public sealed class AiWorkspaceController : ControllerBase
public ActionResult<object> Modules() => Ok(new { modules = _workspace.Modules, provider = ResolveProvider() });
[HttpPost("generate")]
[Authorize(Policy = ProEntitlement.Policy)]
public async Task<ActionResult<InteractionDto>> Generate(int jobId, [FromBody] GenerateRequest request, CancellationToken ct)
{
var user = await _users.GetUserAsync(User);
@@ -46,14 +47,32 @@ public sealed class AiWorkspaceController : ControllerBase
var roles = await _users.GetRolesAsync(user);
var entitlements = AccountPlans.ForRoles(roles);
var monthStart = new DateTimeOffset(DateTime.UtcNow.Year, DateTime.UtcNow.Month, 1, 0, 0, 0, TimeSpan.Zero);
var used = await _db.AiInteractions
.Where(x => x.OwnerUserId == user.Id && x.CreatedAtUtc >= monthStart)
.GroupBy(_ => 1)
.Select(g => new { Calls = g.Count(), Tokens = g.Sum(x => (long)x.EstimatedTokenCount) })
.FirstOrDefaultAsync(ct);
if ((used?.Calls ?? 0) >= entitlements.MonthlyAiCalls)
var interactions = _db.AiInteractions.Where(x => x.OwnerUserId == user.Id);
int usedCalls;
long usedTokens;
if (_db.Database.IsSqlite())
{
var used = (await interactions
.Select(x => new { x.CreatedAtUtc, x.EstimatedTokenCount })
.ToListAsync(ct))
.Where(x => x.CreatedAtUtc >= monthStart)
.ToList();
usedCalls = used.Count;
usedTokens = used.Sum(x => (long)x.EstimatedTokenCount);
}
else
{
var used = await interactions
.Where(x => x.CreatedAtUtc >= monthStart)
.GroupBy(_ => 1)
.Select(g => new { Calls = g.Count(), Tokens = g.Sum(x => (long)x.EstimatedTokenCount) })
.FirstOrDefaultAsync(ct);
usedCalls = used?.Calls ?? 0;
usedTokens = used?.Tokens ?? 0;
}
if (usedCalls >= entitlements.MonthlyAiCalls)
return StatusCode(StatusCodes.Status429TooManyRequests, $"Monthly AI limit reached ({entitlements.MonthlyAiCalls} generations). Upgrade your plan or try again next month.");
if ((used?.Tokens ?? 0) >= entitlements.MonthlyAiTokens)
if (usedTokens >= entitlements.MonthlyAiTokens)
return StatusCode(StatusCodes.Status429TooManyRequests, $"Monthly AI cost limit reached ({entitlements.MonthlyAiTokens:N0} estimated tokens). Upgrade your plan or try again next month.");
}