diff options
Diffstat (limited to 'Services')
-rw-r--r-- | Services/GameService.cs | 47 | ||||
-rw-r--r-- | Services/IGameService.cs | 7 | ||||
-rw-r--r-- | Services/IPrizeService.cs | 2 |
3 files changed, 54 insertions, 2 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 diff --git a/Services/IGameService.cs b/Services/IGameService.cs new file mode 100644 index 0000000..c83087d --- /dev/null +++ b/Services/IGameService.cs @@ -0,0 +1,7 @@ +using BackendPIA.Models; + +namespace BackendPIA.Services { + public interface IGameService { + public Task<IEnumerable<RaffleWinner>> GetWinners(long raffle_id); + } +}
\ No newline at end of file diff --git a/Services/IPrizeService.cs b/Services/IPrizeService.cs index c7261ab..4918e93 100644 --- a/Services/IPrizeService.cs +++ b/Services/IPrizeService.cs @@ -1,5 +1,3 @@ -using Microsoft.AspNetCore.Mvc.ModelBinding; -using Microsoft.AspNetCore.JsonPatch; using BackendPIA.Models; namespace BackendPIA.Services { |