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." });
        }
    }
}