Beispiel #1
0
        public async Task <List <Order> > PickOrderAsync(int count, DateTime at)
        {
            await BeginTransactionAsync();

            var orders = await _context.Orders.ToArrayAsync();

            var pickedCount = _context.Orders.Count(o => o.PickedAt > DateTime.MinValue);

            if (pickedCount > 0)
            {
                throw new BadRequestException("이미 추첨한 상태입니다.");
            }

            var managerIds = await _context.Users
                             .Where(u => u.IsManager)
                             .Select(u => u.Id)
                             .ToListAsync();

            var managers = await _context.Orders
                           .Where(o => o.OrderedAt > at - OrderTolerance && o.OrderedAt < at)
                           .Where(o => managerIds.Contains(o.UserId))
                           .ToListAsync();

            var candidates = await _context.Orders
                             .Where(o => o.OrderedAt > at - OrderTolerance && o.OrderedAt < at)
                             .Where(o => !managerIds.Contains(o.UserId))
                             .ToListAsync();

            var neededCount = Math.Max(count - managers.Count, 0);

            if (neededCount < candidates.Count)
            {
                candidates.Shuffle();
                candidates = candidates.GetRange(0, neededCount);
            }

            if (managers.Count > 0)
            {
                managers.ForEach(o => o.PickedAt = at);
                _context.UpdateRange(managers);
            }

            if (candidates.Count > 0)
            {
                candidates.ForEach(o => o.PickedAt = at);
                _context.UpdateRange(candidates);
            }

            managers.AddRange(candidates);
            return(managers);
        }