Prebuilt deck purchasing and fixes
This commit is contained in:
67
SVSim.Database/Repositories/BuildDeck/BuildDeckRepository.cs
Normal file
67
SVSim.Database/Repositories/BuildDeck/BuildDeckRepository.cs
Normal file
@@ -0,0 +1,67 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
using SVSim.Database.Models;
|
||||
|
||||
namespace SVSim.Database.Repositories.BuildDeck;
|
||||
|
||||
public interface IBuildDeckRepository
|
||||
{
|
||||
/// <summary>
|
||||
/// Load enabled series (filtered by addSeriesId when non-zero) with all owned children
|
||||
/// for /build_deck/info. Series and per-series products are sorted by OrderIndex desc.
|
||||
/// </summary>
|
||||
Task<List<BuildDeckSeriesEntry>> GetEnabledCatalog(int addSeriesId);
|
||||
|
||||
/// <summary>
|
||||
/// Load a single product (with Series + Cards + Rewards + Series.SeriesRewards) by id.
|
||||
/// Returns null if absent. Used by /build_deck/buy and /build_deck/get_purchase_count.
|
||||
/// </summary>
|
||||
Task<BuildDeckProductEntry?> GetProduct(int productId);
|
||||
|
||||
/// <summary>
|
||||
/// Per-viewer purchase counter snapshot. Key = product_id.
|
||||
/// </summary>
|
||||
Task<Dictionary<int, ViewerBuildDeckProductPurchase>> GetPurchasesForViewer(long viewerId);
|
||||
|
||||
/// <summary>
|
||||
/// Increment the (ViewerId, ProductId) purchase counter by 1 (insert if absent).
|
||||
/// Returns the new total.
|
||||
/// </summary>
|
||||
Task<int> IncrementPurchaseCount(long viewerId, int productId);
|
||||
}
|
||||
Reference in New Issue
Block a user