summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Program.cs1
-rw-r--r--Services/GameService.cs47
-rw-r--r--Services/IGameService.cs7
-rw-r--r--Services/IPrizeService.cs2
4 files changed, 55 insertions, 2 deletions
diff --git a/Program.cs b/Program.cs
index ec416e6..ed98bd4 100644
--- a/Program.cs
+++ b/Program.cs
@@ -26,6 +26,7 @@ builder.Services.AddAutoMapper(typeof(Program));
// Custom services configuration.
builder.Services.AddSingleton<ITokenGenerator>(s => new TokenGenerator(builder.Configuration["Jwt:Key"]));
+builder.Services.AddScoped<IGameService, GameService>();
builder.Services.AddScoped<IUserAccountService, UserAccountService>();
builder.Services.AddScoped<IRaffleService, RaffleService>();
builder.Services.AddScoped<ITicketService, TicketService>();
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 {