public async Task <NetworkLibrary.NetworkLibrary.Http.ShopModel> Write(NetworkLibrary.NetworkLibrary.Http.ShopModel shopModel, int accountId) { ShopModelDb shopModelDb = new ShopModelDb { CreationDateTime = DateTime.UtcNow, AccountId = accountId }; await dbContext.ShopModels.AddAsync(shopModelDb); await dbContext.SaveChangesAsync(); //Эта хрень нужна для того, чтобы id у модели магазина всегда был уникальным shopModel.Id = shopModelDb.Id; shopModelDb.SerializedModel = ZeroFormatterSerializer.Serialize(shopModel); await dbContext.SaveChangesAsync(); return(shopModel); }
public async Task <NetworkLibrary.NetworkLibrary.Http.ShopModel> ReadShopModel(int accountId) { DateTime now = DateTime.UtcNow; ShopModelDb shopModelDb = await dbContext.ShopModels .Where(shopModel1 => shopModel1.AccountId == accountId && shopModel1.CreationDateTime > now - TimeSpan.FromDays(1)) .OrderBy(shopModel1 => shopModel1.CreationDateTime) .FirstOrDefaultAsync(); if (shopModelDb == null) { return(null); } if (shopModelDb.SerializedModel == null) { Console.WriteLine("warning Модель магазина из БД пуста"); return(null); } return(ZeroFormatterSerializer .Deserialize <NetworkLibrary.NetworkLibrary.Http.ShopModel>(shopModelDb.SerializedModel)); }
public async Task BuyProduct(string playerServiceId, int productId, string base64ProductModelFromClient, int shopModelId) { //Аккаунт существует? AccountDbDto accountDbDto = await dbReaderService.ReadAccountAsync(playerServiceId); if (accountDbDto == null) { throw new Exception($"Такого аккаунта не существует {nameof(playerServiceId)} {playerServiceId}"); } //Модель магазина существует? ShopModelDb shopModelDb = await dbContext .ShopModels .Where(shopModelDb1 => shopModelDb1.Id == shopModelId) .SingleOrDefaultAsync(); if (shopModelDb == null) { throw new Exception($"Такой модели магазина не существует {nameof(shopModelId)} {shopModelId}"); } //Эта модель создана для этого аккаунта? if (accountDbDto.Id != shopModelDb.AccountId) { throw new Exception("Модель магазина не относится к этому аккаунту"); } //Эта модель не просрочена? if (DateTime.UtcNow - shopModelDb.CreationDateTime > TimeSpan.FromDays(3)) { throw new Exception("Модель магазина просрочена"); } //В модели магазина из БД есть продукт с таким же id? NetworkLibrary.NetworkLibrary.Http.ShopModel shopModel; try { shopModel = ZeroFormatterSerializer .Deserialize <NetworkLibrary.NetworkLibrary.Http.ShopModel>(shopModelDb.SerializedModel); } catch { throw new Exception("Не удалось десериализовать модель продукта при чтении из БД"); } if (shopModel == null) { throw new Exception("Не удалось достать модель магазина для игрока"); } ProductModel productModelFromDb = shopModel.UiSections .SelectMany(uiSection => uiSection.UiItems) .SelectMany(arr => arr) .SingleOrDefault(productModel1 => productModel1.Id == productId); if (productModelFromDb == null) { throw new Exception("В модели магазина такого продукта нет."); } //Продукт из БД совпадает с присланным с клиента? byte[] serializedProductModelFromClient = Convert.FromBase64String(base64ProductModelFromClient); byte[] serializedProductModelFromDb = ZeroFormatterSerializer.Serialize(productModelFromDb); var productModelFromClient = ZeroFormatterSerializer .Deserialize <ProductModel>(serializedProductModelFromClient); bool isEqual = new ProductChecker().IsEqual(productModelFromClient, productModelFromDb); if (!isEqual) { Console.WriteLine(serializedProductModelFromClient.Length.ToString()); Console.WriteLine(serializedProductModelFromDb.Length.ToString()); throw new Exception("Модели продуктов не совпадают"); } bool isResourcesEnough = costCheckerService .IsResourcesEnough(productModelFromClient, accountDbDto.SoftCurrency, accountDbDto.HardCurrency); if (!isResourcesEnough) { throw new Exception("Не хватает ресурсов."); } //создать транзакцию по модели продукта Transaction transaction = shopTransactionFactory.Create(productModelFromDb, accountDbDto.Id); //todo проверить транзакцию на адекватность //записать транзакцию await dbContext.Transactions.AddAsync(transaction); //перезаписать модель продукта if (productModelFromDb.ResourceTypeEnum == ResourceTypeEnum.WarshipPowerPoints) { productModelFromDb.IsDisabled = true; shopModelDb.SerializedModel = ZeroFormatterSerializer.Serialize(shopModel); } await dbContext.SaveChangesAsync(); }