using System.Text.Json; namespace qtc_api.Services.StoreService { public class StoreService { public static List 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(File.ReadAllText(storeJsonLocation)); if (storeItems != null && storeItems.Length > 0) { StoreItems = storeItems.ToList(); } } public ServiceResponse> GetStoreItems() { return new ServiceResponse> { Success = true, Data = StoreItems }; } public ServiceResponse GetStoreItem(int id) { var item = StoreItems.FirstOrDefault(e => e.Id == id); if (item != null) return new ServiceResponse { Success = true, Data = item }; else return new ServiceResponse { Success = false, Message = "Item Not Found" }; } public ServiceResponse 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 { Success = true, Data = item }; else return new ServiceResponse { Success = false, Message = "Item Not Yet Purchased" }; } public ServiceResponse> 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> { Success = true, Data = items }; else return new ServiceResponse> { Success = false, Message = "User Owns No Items" }; } public async Task> 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 { Success = true, Data = true }; } else return new ServiceResponse { Success = false, Message = "Insufficient Currency" }; } else return new ServiceResponse { Success = false, Message = "User Not Found" }; } else return new ServiceResponse { Success = false, Message = "Item Not Found" }; } } }