34 lines
1.5 KiB
C#
34 lines
1.5 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using Tiku.Application.QuestionBanks;
|
|
using Tiku.Domain.Commerce;
|
|
using Tiku.Domain.Tenancy;
|
|
using Tiku.Infrastructure.Persistence;
|
|
|
|
namespace Tiku.Infrastructure.QuestionBanks;
|
|
|
|
public sealed class PublicQuestionAccessPolicy(TikuDbContext dbContext) : IPublicQuestionAccessPolicy
|
|
{
|
|
public async Task EnsureCanStartAsync(Guid tenantId, CancellationToken cancellationToken = default)
|
|
{
|
|
var tenantIsActive = await dbContext.Tenants.AsNoTracking().AnyAsync(
|
|
tenant => tenant.Id == tenantId && tenant.Status == TenantStatus.Active,
|
|
cancellationToken);
|
|
var now = DateTimeOffset.UtcNow;
|
|
var subscriptionIsActive = await dbContext.TenantSubscriptions.AsNoTracking().AnyAsync(
|
|
subscription =>
|
|
subscription.TenantId == tenantId &&
|
|
(subscription.Status == TenantSubscriptionStatus.Trial ||
|
|
subscription.Status == TenantSubscriptionStatus.Active) &&
|
|
(!subscription.StartsAt.HasValue || subscription.StartsAt <= now) &&
|
|
(!subscription.ExpiresAt.HasValue || subscription.ExpiresAt > now),
|
|
cancellationToken);
|
|
|
|
if (!tenantIsActive || !subscriptionIsActive)
|
|
{
|
|
throw new PublicQuestionAccessDeniedException(
|
|
"public_question_subscription_required",
|
|
"An active trial or subscription is required to start public question practice.");
|
|
}
|
|
}
|
|
}
|