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
@@ -42,7 +42,7 @@ public sealed class CvVariantController : ControllerBase
{
var user = await _users.GetUserAsync(User);
if (user is null) return Unauthorized();
var premiumThemes = AccountPlans.ForRoles(await _users.GetRolesAsync(user)).PremiumThemes;
var proThemes = AccountPlans.ForRoles(await _users.GetRolesAsync(user)).ProThemes;
var themes = CvThemeCatalog.Themes.Select(t => new
{
id = t.Id,
@@ -54,8 +54,8 @@ public sealed class CvVariantController : ControllerBase
photoShape = t.PhotoShape,
supportsIcons = t.DefaultIcons,
atsFriendly = t.AtsFriendly,
premium = t.Premium,
available = premiumThemes || !t.Premium,
requiresPro = t.Premium,
available = proThemes || !t.Premium,
swatches = new[] { t.Accent, t.SidebarBg, t.Paper },
});
return Ok(themes);
@@ -87,7 +87,7 @@ public sealed class CvVariantController : ControllerBase
if (request?.Settings is not null && !CvThemeCatalog.Exists(request.Settings.ThemeId))
return BadRequest("Unknown theme.");
if (request?.Settings is not null && !await CanUseThemeAsync(user, request.Settings.ThemeId))
return StatusCode(StatusCodes.Status403Forbidden, "This theme requires Premium.");
return StatusCode(StatusCodes.Status403Forbidden, "This theme requires Pro.");
var variant = await _variants.CreateAsync(user.Id, request?.Name, request?.JobApplicationId, request?.Settings, ct);
return Ok(ToDto(variant));
}
@@ -113,7 +113,7 @@ public sealed class CvVariantController : ControllerBase
var current = await _variants.GetAsync(user.Id, id, ct);
if (current is null) return NotFound();
if (!string.Equals(CvVariantSettingsJson.Deserialize(current.SettingsJson).ThemeId, settings.ThemeId, StringComparison.OrdinalIgnoreCase))
return StatusCode(StatusCodes.Status403Forbidden, "This theme requires Premium.");
return StatusCode(StatusCodes.Status403Forbidden, "This theme requires Pro.");
}
var variant = await _variants.SaveAsync(user.Id, id, request.Name, settings, request.Source ?? "autosave", ct);
return variant is null ? NotFound() : Ok(ToDto(variant));
@@ -197,6 +197,7 @@ public sealed class CvVariantController : ControllerBase
// AI assistance on any text area. Never mutates the profile or variant — returns a suggestion the
// user reviews and applies themselves. Reuses the existing provider abstraction (ISummarizerService).
[HttpPost("ai/assist")]
[Authorize(Policy = ProEntitlement.Policy)]
public async Task<ActionResult<AiAssistResult>> AiAssist([FromBody] AiAssistRequest request, CancellationToken ct)
{
var user = await _users.GetUserAsync(User);
@@ -238,7 +239,7 @@ public sealed class CvVariantController : ControllerBase
}
private async Task<bool> CanUseThemeAsync(ApplicationUser user, string? themeId) =>
CvThemeCatalog.CanUse(themeId, AccountPlans.ForRoles(await _users.GetRolesAsync(user)).PremiumThemes);
CvThemeCatalog.CanUse(themeId, AccountPlans.ForRoles(await _users.GetRolesAsync(user)).ProThemes);
private static CvRenderPerson Person(ApplicationUser user)
{