File size: 2,392 Bytes
7fe61c9
 
6f32ae8
7fe61c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b8cc5e6
7fe61c9
 
25f925e
7fe61c9
b8cc5e6
 
 
 
 
 
 
 
 
 
 
 
7fe61c9
 
 
 
b8cc5e6
7fe61c9
 
25f925e
 
7fe61c9
 
 
 
25f925e
 
 
 
 
 
 
 
 
 
 
 
 
7fe61c9
 
6f32ae8
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
using Microsoft.AspNetCore.Mvc;
using Frontend.Services;
using LibraryManagement.Shared.Models;
using Frontend.Models;
using Microsoft.AspNetCore.Authorization;
using System.Threading.Tasks;
using System.Linq;
using System.Collections.Generic;

namespace Frontend.Controllers
{
    [Authorize(Roles = "Member")]
    public class MembershipController : Controller
    {
        private readonly LibraryApiClient _apiClient;

        public MembershipController(LibraryApiClient apiClient)
        {
            _apiClient = apiClient;
        }

        public async Task<IActionResult> Index()
        {
            var allSubscriptions = await _apiClient.GetMyAllSubscriptionsAsync();
            var memberships = await _apiClient.GetMembershipsAsync();
            var loyaltyAccount = await _apiClient.GetMyLoyaltyAccountAsync();
            var activeRewards = await _apiClient.GetActiveRewardsAsync();

            var now = DateTime.UtcNow;

            // The currently active subscription is the one whose time range includes now
            var currentSubscription = allSubscriptions
                .Where(s => s.StartDate <= now && s.ExpiryDate > now)
                .OrderByDescending(s => s.StartDate)
                .FirstOrDefault();

            // Queued = subscriptions that haven't started yet (StartDate in the future)
            var queuedMemberships = allSubscriptions
                .Where(s => s.StartDate > now)
                .OrderBy(s => s.StartDate)
                .ToList();

            var viewModel = new MembershipViewModel
            {
                CurrentSubscription = currentSubscription,
                AvailableMemberships = memberships.ToList(),
                QueuedMemberships = queuedMemberships,
                LoyaltyAccount = loyaltyAccount,
                RewardPointCosts = activeRewards.ToDictionary(r => r.Id, r => r.PointCost)
            };

            return View(viewModel);
        }

        [HttpPost]
        public async Task<IActionResult> Redeem(string rewardId)
        {
            var (success, message) = await _apiClient.ClaimRewardAsync(rewardId, "Redeemed via Library Membership Page");
            
            if (success)
            {
                return Json(new { success = true, message });
            }
            
            return Json(new { success = false, message });
        }
    }
}