-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBasketService.cs
More file actions
124 lines (113 loc) · 5.38 KB
/
BasketService.cs
File metadata and controls
124 lines (113 loc) · 5.38 KB
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
using ECommerceAPI.Application.Abstractions.Services;
using ECommerceAPI.Application.Repositories;
using ECommerceAPI.Application.ViewModels.Baskets;
using ECommerceAPI.Domain.Entities;
using ECommerceAPI.Domain.Entities.Identity;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
namespace ECommerceAPI.Persistence.Services
{
public class BasketService : IBasketService
{
readonly IHttpContextAccessor _httpContextAccessor;
readonly UserManager<AppUser> _userManager;
readonly IOrderReadRepository _orderReadRepository;
readonly IBasketWriteRepository _basketWriteRepository;
readonly IBasketReadRepository _basketReadRepository;
readonly IBasketItemWriteRepository _basketItemWriteRepository;
readonly IBasketItemReadRepository _basketItemReadRepository;
public BasketService(IHttpContextAccessor httpContextAccessor, UserManager<AppUser> userManager, IOrderReadRepository orderReadRepository, IBasketWriteRepository basketWriteRepository, IBasketItemWriteRepository basketItemWriteRepository, IBasketItemReadRepository basketItemReadRepository, IBasketReadRepository basketReadRepository)
{
_httpContextAccessor = httpContextAccessor;
_userManager = userManager;
_orderReadRepository = orderReadRepository;
_basketWriteRepository = basketWriteRepository;
_basketItemWriteRepository = basketItemWriteRepository;
_basketItemReadRepository = basketItemReadRepository;
_basketReadRepository = basketReadRepository;
}
private async Task<Basket?> ContextUser()
{
var username = _httpContextAccessor?.HttpContext?.User?.Identity?.Name;
if (!string.IsNullOrEmpty(username))
{
AppUser? user = await _userManager.Users
.Include(u => u.Baskets)
.FirstOrDefaultAsync(u => u.UserName == username);
var _basket = from basket in user.Baskets
join order in _orderReadRepository.Table
on basket.Id equals order.Id into BasketOrders
from order in BasketOrders.DefaultIfEmpty()
select new
{
Basket = basket,
Order = order
};
Basket? targetBasket = null;
if (_basket.Any(b => b.Order is null))
targetBasket = _basket.FirstOrDefault(b => b.Order is null)?.Basket;
else
{
targetBasket = new();
user.Baskets.Add(targetBasket);
}
await _basketWriteRepository.SaveAsync();
return targetBasket;
}
throw new Exception("Cannot Find Name, ReLogin Might Fix It");
}
public async Task AddItemToBasketAsync(VM_Create_BasketItem basketItem)
{
Basket? basket = await ContextUser();
if (basket != null)
{
BasketItem _basketItem = await _basketItemReadRepository.GetSingleAsync(bi => bi.BasketId == basket.Id && bi.ProductId == Guid.Parse(basketItem.ProductId));
if (_basketItem != null)
_basketItem.Quantity++;
else
await _basketItemWriteRepository.AddAsync(new()
{
BasketId = basket.Id,
ProductId = Guid.Parse(basketItem.ProductId),
Quantity = basketItem.Quantity
});
await _basketItemWriteRepository.SaveAsync();
}
}
public async Task<List<BasketItem>> GetBasketItemsAsync()
{
Basket? basket = await ContextUser();
Basket? result = await _basketReadRepository.Table
.Include(b => b.BasketItems)
.ThenInclude(bi => bi.Product)
.FirstOrDefaultAsync(b => b.Id == basket.Id);
return result.BasketItems
.ToList();
}
public async Task RemoveBasketItemAsync(string basketItemId)
{
BasketItem? basketItem = await _basketItemReadRepository.GetByIdAsync(basketItemId);
if (basketItem != null)
{
_basketItemWriteRepository.Remove(basketItem);
await _basketItemWriteRepository.SaveAsync();
}
}
public async Task UpdateQuantityAsync(VM_Update_BasketItem basketItem)
{
BasketItem? _basketItem = await _basketItemReadRepository.Table.Include(bi => bi.Product).FirstOrDefaultAsync(bi => bi.Id == Guid.Parse(basketItem.BasketItemId));
if (_basketItem != null)
{
if (_basketItem.Product.Stock > _basketItem.Quantity)
{
_basketItem.Quantity = basketItem.Quantity;
await _basketItemWriteRepository.SaveAsync();
}
else
throw new Exception($"There is not enough stock of {_basketItem.Product.Name} product. Max stock is {_basketItem.Product.Stock}");
}
}
public Basket? Basket => ContextUser().Result;
}
}