Files
SVSimServer/SVSim.Database/Repositories/BuildDeck/BuildDeckRepository.cs
2026-05-26 09:16:21 -04:00

68 lines
2.3 KiB
C#

using Microsoft.EntityFrameworkCore;
using SVSim.Database.Models;
namespace SVSim.Database.Repositories.BuildDeck;
public class BuildDeckRepository : IBuildDeckRepository
{
private readonly SVSimDbContext _db;
public BuildDeckRepository(SVSimDbContext db) { _db = db; }
public async Task<List<BuildDeckSeriesEntry>> GetEnabledCatalog(int addSeriesId)
{
var q = _db.BuildDeckSeries
.Include(s => s.SeriesRewards)
.Include(s => s.Products.Where(p => p.IsEnabled))
.ThenInclude(p => p.Cards)
.Include(s => s.Products.Where(p => p.IsEnabled))
.ThenInclude(p => p.Rewards)
.Where(s => s.IsEnabled)
.AsSplitQuery();
if (addSeriesId != 0)
{
q = q.Where(s => s.Id == addSeriesId);
}
var list = await q.ToListAsync();
list.Sort((a, b) => b.OrderIndex.CompareTo(a.OrderIndex));
return list;
}
public async Task<BuildDeckProductEntry?> GetProduct(int productId) =>
await _db.BuildDeckProducts
.Include(p => p.Cards)
.Include(p => p.Rewards)
.Include(p => p.Series).ThenInclude(s => s!.SeriesRewards)
.Include(p => p.Series).ThenInclude(s => s!.Products)
.AsSplitQuery()
.FirstOrDefaultAsync(p => p.Id == productId);
public async Task<Dictionary<int, ViewerBuildDeckProductPurchase>> GetPurchasesForViewer(long viewerId)
{
var viewer = await _db.Viewers
.Include(v => v.BuildDeckPurchases)
.FirstOrDefaultAsync(v => v.Id == viewerId);
return viewer?.BuildDeckPurchases.ToDictionary(p => p.ProductId) ?? new();
}
public async Task<int> IncrementPurchaseCount(long viewerId, int productId)
{
var viewer = await _db.Viewers
.Include(v => v.BuildDeckPurchases)
.FirstAsync(v => v.Id == viewerId);
var row = viewer.BuildDeckPurchases.FirstOrDefault(p => p.ProductId == productId);
if (row is null)
{
row = new ViewerBuildDeckProductPurchase { ProductId = productId, PurchaseCount = 1 };
viewer.BuildDeckPurchases.Add(row);
}
else
{
row.PurchaseCount += 1;
}
await _db.SaveChangesAsync();
return row.PurchaseCount;
}
}