Spaces:
Sleeping
Sleeping
File size: 6,001 Bytes
4433399 068485b da13799 068485b b8cc5e6 da13799 b8cc5e6 068485b da13799 6469525 068485b 6469525 068485b c312181 da13799 068485b 7fe61c9 068485b c312181 068485b ee79726 6469525 068485b 6469525 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | using LibraryManagement.Shared.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;
namespace Backend.Features.Subscriptions
{
[ApiController]
[Route("api")]
public class SubscriptionController : ControllerBase
{
private readonly ISubscriptionService _subscriptionService;
public SubscriptionController(ISubscriptionService subscriptionService)
{
_subscriptionService = subscriptionService;
}
[HttpGet("memberships")]
[AllowAnonymous]
public async Task<ActionResult<IEnumerable<MembershipDto>>> GetMemberships()
{
return Ok(await _subscriptionService.GetMembershipsAsync());
}
[HttpGet("subscriptions/me")]
[Authorize]
public async Task<ActionResult<SubscriptionDto>> GetMySubscription()
{
var userIdStr = User.FindFirstValue(ClaimTypes.NameIdentifier);
if (string.IsNullOrEmpty(userIdStr)) return Unauthorized();
var userId = Guid.Parse(userIdStr);
var subscription = await _subscriptionService.GetUserSubscriptionAsync(userId);
if (subscription == null) return NotFound(new { message = "No active subscription found." });
return Ok(subscription);
}
[HttpGet("subscriptions/me/all")]
[Authorize]
public async Task<ActionResult<IEnumerable<SubscriptionDto>>> GetMyAllSubscriptions()
{
var userIdStr = User.FindFirstValue(ClaimTypes.NameIdentifier);
if (string.IsNullOrEmpty(userIdStr)) return Unauthorized();
var userId = Guid.Parse(userIdStr);
var subscriptions = await _subscriptionService.GetUserAllSubscriptionsAsync(userId);
return Ok(subscriptions);
}
[HttpPost("subscriptions/subscribe")]
[Authorize]
public async Task<ActionResult<SubscriptionDto>> Subscribe([FromBody] SubscribeRequest request)
{
try
{
var userIdStr = User.FindFirstValue(ClaimTypes.NameIdentifier);
if (string.IsNullOrEmpty(userIdStr)) return Unauthorized();
var userId = Guid.Parse(userIdStr);
// For cash payments, we create a pending subscription
var subscription = await _subscriptionService.CreatePendingSubscriptionAsync(userId, request.MembershipId);
return Ok(subscription);
}
catch (Exception ex)
{
return BadRequest(new { message = ex.Message });
}
}
[HttpGet("subscriptions/user/{userId}")]
[Authorize(Roles = "Librarian")]
public async Task<ActionResult<SubscriptionDto>> GetUserSubscription(Guid userId)
{
var subscription = await _subscriptionService.GetUserSubscriptionAsync(userId);
if (subscription == null) return NotFound(new { message = "No active subscription found." });
return Ok(subscription);
}
[HttpGet("subscriptions/all")]
[Authorize(Roles = "Librarian")]
public async Task<ActionResult<IEnumerable<SubscriptionDto>>> GetSubscriptions()
{
return Ok(await _subscriptionService.GetAllSubscriptionsAsync());
}
[HttpPost("subscriptions/admin-subscribe")]
[Authorize(Roles = "Librarian")]
public async Task<ActionResult<SubscriptionDto>> AdminSubscribe([FromBody] AdminSubscribeRequest request)
{
try
{
var subscription = await _subscriptionService.SubscribeUserAsync(request.UserId, request.MembershipId);
return Ok(subscription);
}
catch (Exception ex)
{
return BadRequest(new { message = ex.Message });
}
}
[HttpGet("subscriptions/preview-upgrade/{membershipId}")]
[Authorize]
public async Task<ActionResult<SubscriptionUpgradePreviewDto>> GetUpgradePreview(int membershipId)
{
var userIdStr = User.FindFirstValue(ClaimTypes.NameIdentifier);
if (string.IsNullOrEmpty(userIdStr)) return Unauthorized();
var preview = await _subscriptionService.GetUpgradePreviewAsync(Guid.Parse(userIdStr), membershipId);
return Ok(preview);
}
[HttpPost("subscriptions/subscribe-wallet")]
[Authorize]
public async Task<ActionResult<SubscriptionDto>> SubscribeWithWallet([FromBody] SubscribeRequest request)
{
try
{
var userIdStr = User.FindFirstValue(ClaimTypes.NameIdentifier);
if (string.IsNullOrEmpty(userIdStr)) return Unauthorized();
var subscription = await _subscriptionService.SubscribeWithWalletAsync(Guid.Parse(userIdStr), request.MembershipId);
return Ok(subscription);
}
catch (Exception ex)
{
return BadRequest(new { message = ex.Message });
}
}
[HttpGet("subscriptions/pending")]
[Authorize(Roles = "Librarian")]
public async Task<ActionResult<IEnumerable<SubscriptionDto>>> GetPendingSubscriptions()
{
return Ok(await _subscriptionService.GetPendingSubscriptionsAsync());
}
[HttpPost("subscriptions/approve")]
[Authorize(Roles = "Librarian")]
public async Task<IActionResult> ApproveSubscription([FromBody] ApproveSubscriptionRequest request)
{
var success = await _subscriptionService.ApproveSubscriptionAsync(request.SubscriptionId, request.Approve);
if (!success) return NotFound(new { message = "Subscription not found." });
return Ok(new { message = request.Approve ? "Subscription approved." : "Subscription rejected." });
}
}
}
|