2026-07-23 13:54:06 -07:00

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