PlotDirector/PlotLine/Controllers/PricingController.cs
2026-06-07 21:11:44 +01:00

80 lines
2.6 KiB
C#

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using PlotLine.Data;
using PlotLine.Models;
using PlotLine.Services;
using PlotLine.ViewModels;
namespace PlotLine.Controllers;
[AllowAnonymous]
public sealed class PricingController(
ICurrentUserService currentUser,
IUserRepository users,
ISubscriptionService subscriptions,
IStripeBillingService stripeBilling) : Controller
{
[HttpGet]
public async Task<IActionResult> Index()
{
UserSubscriptionDetail? currentSubscription = null;
if (currentUser.UserId is int userId)
{
currentSubscription = await subscriptions.GetCurrentSubscriptionAsync(userId);
}
return View(new PricingViewModel
{
Plans = await subscriptions.GetActiveSubscriptionLevelsAsync(),
CurrentSubscriptionLevelID = currentSubscription?.SubscriptionLevelID,
IsSignedIn = currentUser.UserId.HasValue
});
}
[HttpGet]
public IActionResult StartTrial()
{
if (!currentUser.UserId.HasValue)
{
return RedirectToAction("Register", "Account");
}
return RedirectToAction("Subscription", "ManageAccount");
}
[HttpGet]
public async Task<IActionResult> Checkout(int id, string billingInterval = "Monthly")
{
if (!currentUser.UserId.HasValue)
{
var returnUrl = Url.Action(nameof(Checkout), "Pricing", new { id, billingInterval }) ?? "/Pricing";
return RedirectToAction("Login", "Account", new { returnUrl });
}
var user = await users.GetByIdAsync(currentUser.UserId.Value);
if (user is null)
{
return RedirectToAction("Login", "Account");
}
var request = new StripeCheckoutRequest
{
SubscriptionLevelID = id,
BillingInterval = string.Equals(billingInterval, "Annual", StringComparison.OrdinalIgnoreCase)
? "Annual"
: "Monthly"
};
var successUrl = Url.Action("SubscriptionSuccess", "ManageAccount", null, Request.Scheme) ?? string.Empty;
var cancelUrl = Url.Action(nameof(Index), "Pricing", null, Request.Scheme) ?? string.Empty;
var result = await stripeBilling.StartCheckoutOrChangePlanAsync(user, request, successUrl, cancelUrl);
if (result.Succeeded && !string.IsNullOrWhiteSpace(result.RedirectUrl))
{
return Redirect(result.RedirectUrl);
}
TempData["PricingMessage"] = result.Message;
return RedirectToAction(nameof(Index));
}
}