feat(repo): GetStoryDecksByClass joins story-deck presentation to product card lists
Adds StoryDeckView projection, IBuildDeckRepository.GetStoryDecksByClass interface method, and BuildDeckRepository implementation that loads StoryDeckEntry rows for a class, fetches matching BuildDeckProductEntry card lists, and expands each card by Number into a flat CardIdArray. TDD: 2 tests in StoryDeckRepositoryTests (expand + empty-class). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -64,4 +64,38 @@ public class BuildDeckRepository : IBuildDeckRepository
|
||||
await _db.SaveChangesAsync();
|
||||
return row.PurchaseCount;
|
||||
}
|
||||
|
||||
public async Task<List<StoryDeckView>> GetStoryDecksByClass(int classId)
|
||||
{
|
||||
var decks = await _db.StoryDecks.Where(d => d.ClassId == classId).ToListAsync();
|
||||
if (decks.Count == 0) return new();
|
||||
|
||||
var ids = decks.Select(d => d.DeckNo).ToList();
|
||||
var products = await _db.BuildDeckProducts
|
||||
.Where(p => ids.Contains(p.Id))
|
||||
.Include(p => p.Cards)
|
||||
.AsSplitQuery()
|
||||
.ToListAsync();
|
||||
|
||||
// Expand each product's owned card rows by Number into a flat card_id list (spots included —
|
||||
// validated against the prod capture, 112/112 match).
|
||||
var cardsById = products.ToDictionary(
|
||||
p => p.Id,
|
||||
p => p.Cards.SelectMany(c => Enumerable.Repeat(c.CardId, c.Number)).ToList());
|
||||
|
||||
return decks.Select(d => new StoryDeckView
|
||||
{
|
||||
DeckNo = d.DeckNo,
|
||||
Kind = d.Kind,
|
||||
ClassId = d.ClassId,
|
||||
DeckName = d.DeckName,
|
||||
SleeveId = d.SleeveId,
|
||||
LeaderSkinId = d.LeaderSkinId,
|
||||
IsRecommend = d.IsRecommend,
|
||||
OrderNum = d.OrderNum,
|
||||
EntryNo = d.EntryNo,
|
||||
DeckFormat = d.DeckFormat,
|
||||
CardIdArray = cardsById.TryGetValue(d.DeckNo, out var cards) ? cards : new(),
|
||||
}).ToList();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user