96 lines
4.0 KiB
C#
96 lines
4.0 KiB
C#
using System.Text.Json;
|
|
|
|
namespace qtc_api.Services.StoreService
|
|
{
|
|
public class StoreService
|
|
{
|
|
public static List<StoreItem> StoreItems { get; set; } = [];
|
|
|
|
private readonly DataContext _ctx;
|
|
private readonly IUserService _userService;
|
|
public StoreService(DataContext ctx, IUserService userService)
|
|
{
|
|
_ctx = ctx;
|
|
_userService = userService;
|
|
|
|
string storeJsonLocation = "./Resources/store.json";
|
|
|
|
if (System.Diagnostics.Debugger.IsAttached)
|
|
storeJsonLocation = "./Resources/store.Development.json";
|
|
|
|
StoreItem[]? storeItems = JsonSerializer.Deserialize<StoreItem[]>(File.ReadAllText(storeJsonLocation));
|
|
if (storeItems != null && storeItems.Length > 0)
|
|
{
|
|
StoreItems = storeItems.ToList();
|
|
}
|
|
}
|
|
|
|
public ServiceResponse<List<StoreItem>> GetStoreItems()
|
|
{
|
|
return new ServiceResponse<List<StoreItem>> { Success = true, Data = StoreItems };
|
|
}
|
|
|
|
public ServiceResponse<StoreItem> GetStoreItem(int id)
|
|
{
|
|
var item = StoreItems.FirstOrDefault(e => e.Id == id);
|
|
if (item != null)
|
|
return new ServiceResponse<StoreItem> { Success = true, Data = item };
|
|
else return new ServiceResponse<StoreItem> { Success = false, Message = "Item Not Found" };
|
|
}
|
|
|
|
public ServiceResponse<OwnedStoreItem> GetBoughtStoreItemFromUser(string userId, int itemId)
|
|
{
|
|
// find item owned by user
|
|
var item = _ctx.OwnedStoreItems.FirstOrDefault(e => e.UserId == userId && e.StoreItemId == itemId);
|
|
if (item != null)
|
|
return new ServiceResponse<OwnedStoreItem> { Success = true, Data = item };
|
|
else return new ServiceResponse<OwnedStoreItem> { Success = false, Message = "Item Not Yet Purchased" };
|
|
}
|
|
|
|
public ServiceResponse<List<OwnedStoreItem>> GetBoughtStoreItemsFromUser(string userId)
|
|
{
|
|
// find items owned by user
|
|
var items = _ctx.OwnedStoreItems.Where(e => e.UserId == userId).ToList();
|
|
if (items != null && items.Count > 0)
|
|
return new ServiceResponse<List<OwnedStoreItem>> { Success = true, Data = items };
|
|
else return new ServiceResponse<List<OwnedStoreItem>> { Success = false, Message = "User Owns No Items" };
|
|
}
|
|
|
|
public async Task<ServiceResponse<bool>> BuyStoreItem(string userId, int id)
|
|
{
|
|
// find item in store
|
|
var item = StoreItems.FirstOrDefault(e => e.Id == id);
|
|
if (item != null)
|
|
{
|
|
// deduct currency from user
|
|
var user = await _userService.GetUserById(userId);
|
|
if (user != null && user.Success && user.Data != null)
|
|
{
|
|
if (user.Data.CurrencyAmount >= item.Price)
|
|
{
|
|
// remove currency from user
|
|
await _userService.RemoveCurrencyFromUser(userId, item.Price);
|
|
|
|
// create owned item
|
|
OwnedStoreItem ownedStoreItem = new OwnedStoreItem
|
|
{
|
|
StoreItemId = item.Id,
|
|
UserId = userId
|
|
};
|
|
|
|
// add to table
|
|
_ctx.OwnedStoreItems.Add(ownedStoreItem);
|
|
await _ctx.SaveChangesAsync();
|
|
|
|
// return successful service response
|
|
return new ServiceResponse<bool> { Success = true, Data = true };
|
|
}
|
|
else return new ServiceResponse<bool> { Success = false, Message = "Insufficient Currency" };
|
|
}
|
|
else return new ServiceResponse<bool> { Success = false, Message = "User Not Found" };
|
|
}
|
|
else return new ServiceResponse<bool> { Success = false, Message = "Item Not Found" };
|
|
}
|
|
}
|
|
}
|