Browse Source

Code review

Tigran 4 years ago
parent
commit
21c7c77d45

+ 22 - 9
CardCollector/Controllers/AuctionController.cs

@@ -15,18 +15,33 @@ namespace CardCollector.Controllers
         stickerShortHashCode - MD5 хеш представляющий собой сумму id стикера и id пользователя, используется в словаре как ключ
         price - цена за штуку
         count - количество продаваемых стикеров*/
-        private static async Task<ResultCode> SellCard(UserEntity user, string stickerShortHashCode, int price, int count = 1)
+        private static async Task SellCard(UserEntity user, int priceCoins, int priceGems)
         {
-            if (count > user.Stickers[stickerShortHashCode].Count)
-                return ResultCode.NotEnoughStickers;
+            /* Учитывая, что мы будем управлять кнопками + и -, то сюда никогда не поступят ложные данные
+             решил метод упростить и задачу проверки переложил на взаимодействие с ботом 
+             Пускай сам аукцион делает только то - что должен, проверки в сделку не входили
+             Также в сессии пользователя теперь есть данные о выбранном текущем стикере, 
+             так что можно не передавать хеш код  и количество */
             //подтверждаем действие
-            user.Stickers[stickerShortHashCode].Count -= count;
-            user.Cash.Coins += price * count;
-            return ResultCode.Ok;
+            var hash = user.Session.SelectedSticker.Md5Hash;
+            user.Stickers[hash].Count -= user.Session.SelectedSticker.count;
+            /* Пока не думаю, что стоит сразу начислять сумму, пускай останется на будущее
+            user.Cash.Coins += price * count;*/
+            var product = new AuctionEntity
+            {
+                PriceCoins = priceCoins,
+                PriceGems = priceGems,
+                Quantity = user.Session.SelectedSticker.count,
+                StickerId = user.Session.SelectedSticker.Id,
+                Trader = user.Id
+            };
+            // TODO реализовать добавление позиции на аукцион
+            // await AuctionDao.AddNew(product);
         }
         
         private static async Task<ResultCode> BuyCard(UserEntity user, string stickerShortHashCode, int price, int count = 1)
         {
+            // TODO @darkgolly попробуй переписать метод аналогично тому, что выше
             if (user.Cash.Coins < count * price)
                 return ResultCode.NotEnoughCash;
             //подтверждаем действие
@@ -35,11 +50,9 @@ namespace CardCollector.Controllers
             return ResultCode.Ok;
         }
         
-        //TODO вернуть количество стикера на аукционе по его id
         public static async Task<int> GetStickerCount(string stickerId)
         {
-            var count = await AuctionDao.GetProduct(stickerId);
-            return count;
+            return await AuctionDao.GetTotalQuantity(stickerId);
         }
 
         public static async Task<List<StickerEntity>> GetStickers(string filter)

+ 12 - 6
CardCollector/DataBase/Entity/AuctionEntity.cs

@@ -1,20 +1,26 @@
 using System.ComponentModel.DataAnnotations;
 using System.ComponentModel.DataAnnotations.Schema;
-using Microsoft.EntityFrameworkCore.Metadata.Conventions;
 
 namespace CardCollector.DataBase.Entity
 {
     [Table("auction")]
     public class AuctionEntity
     {
+        /* добавил, так как один и тот же стикер может продаваться разными людьми,
+         следовательно - он не уникальный */
+        /* id записи */
+        [Column("id"), MaxLength(32)] public int Id { get; set; }
+        
         /* id стикера */
-        [Column("id"), MaxLength(127)] public string Id { get; set; }
+        [Column("sticker_id"), MaxLength(127)] public string StickerId { get; set; }
         
-        /* цена  */
-        [Column("price"), MaxLength(32)] public int Price { get; set; }
+        /* Разбил на 2 отдельных цены, так как я ранее говорил,
+         что можно будет продать стик за 2 валюты одновременно, поле валюты упразднил */
+        /* цена в монетах */
+        [Column("price"), MaxLength(32)] public int PriceCoins { get; set; }
         
-        /* валюта */
-        [Column("valuta"), MaxLength(16)] public string Valuta { get; set; }
+        /* цена в алмазах */
+        [Column("price"), MaxLength(32)] public int PriceGems { get; set; }
         
         /* количество */
         [Column("quantity"), MaxLength(32)] public int Quantity { get; set; }

+ 15 - 14
CardCollector/DataBase/EntityDao/AuctionDao.cs

@@ -1,4 +1,6 @@
-using System.Threading.Tasks;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
 using CardCollector.DataBase.Entity;
 using Microsoft.EntityFrameworkCore;
 
@@ -8,21 +10,20 @@ namespace CardCollector.DataBase.EntityDao
     {
         /* Таблица stickers в представлении Entity Framework */
         private static readonly DbSet<AuctionEntity> Table = CardCollectorDatabase.Instance.Auction;
-
-
-        public static async Task<int> GetProduct(string stickerId)
+        
+        public static async Task<List<AuctionEntity>> GetProducts(string stickerId)
         {
-            int result = 0;
-            var products = AuctionDao.Table;
+            /* Заменил цикл на LINQ выражение и тип возвращаемого значение - список позиций,
+             так как один и тот же стикер может продавать несколько людей */
+            return await Table
+                .Where(e => e.StickerId == stickerId).ToListAsync();
+        }
 
-            await foreach (var variable in products)
-            {
-                if (variable.Id == stickerId)
-                {
-                    result++;
-                }
-            }
-            return result;
+        public static async Task<int> GetTotalQuantity(string stickerId)
+        {
+            /* Добавил метод, который считает общее количество данных стикеров на аукционе */
+            var list = await GetProducts(stickerId);
+            return list.Sum(e => e.Quantity);
         }
 
     }