diff options
author | HombreLaser <sebastian-440@live.com> | 2022-11-25 17:52:22 -0600 |
---|---|---|
committer | HombreLaser <sebastian-440@live.com> | 2022-11-25 17:52:22 -0600 |
commit | 9a59a9560eda09236e2dc56897d139c50a85c827 (patch) | |
tree | f000b172dee22e3af763537988ed4abf33539b5c /Services/GameService.cs | |
parent | c1787bf85f0927a3a9def2c64068d9e340946b19 (diff) |
Añadido servicio de rifa
Diffstat (limited to 'Services/GameService.cs')
-rw-r--r-- | Services/GameService.cs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/Services/GameService.cs b/Services/GameService.cs new file mode 100644 index 0000000..01c084a --- /dev/null +++ b/Services/GameService.cs @@ -0,0 +1,47 @@ +using Microsoft.EntityFrameworkCore; +using BackendPIA.Models; + +namespace BackendPIA.Services { + public class GameService : IGameService { + private readonly ApplicationDbContext _context; + + public GameService(ApplicationDbContext context) { + _context = context; + } + + public async Task<IEnumerable<RaffleWinner>> GetWinners(long raffle_id) { + var raffle = await _context.Raffles.Include(r => r.Tickets.Select(t => t.Owner)).FirstOrDefaultAsync(r => r.Id == raffle_id); + Queue<long> prizes = new Queue<long>(_context.Prizes.Where(p => p.RaffleId == raffle_id).Select(p => p.Id)); + var tickets = await _context.Tickets.Where(t => t.RaffleId == raffle_id).Select(t => t.Number).ToListAsync(); + List<int> winners = GetTicketNumbers(raffle.Winners, tickets); + List<RaffleWinner> raffle_winners = new List<RaffleWinner>(); + + foreach(int winner in winners) { + var raffle_winner = new RaffleWinner { UserAccountId = raffle.Tickets.Where(t => t.Number == winner).First().UserAccountId, + PrizeId = prizes.Dequeue(), RaffleId = raffle_id }; + raffle_winners.Add(raffle_winner); + await _context.AddAsync(raffle_winner); + } + + await _context.SaveChangesAsync(); + + return raffle_winners; + } + + private List<int> GetTicketNumbers(int limit, List<int> tickets) { + List<int> winners = new List<int>(); + Random rng = new Random(); + + while(winners.Count < limit) { + int i = rng.Next(tickets.Count - 1); + + if(winners.Contains(tickets[i])) // Check for duplicate numbers. + continue; + + winners.Append(tickets[i]); + } + + return winners; + } + } +}
\ No newline at end of file |