async Task IDeckService.UpdateCollectionAsync(int id, int userId, IEnumerable <int> cardCollectionIds, CancellationToken cancellationToken) { var deck = await _deckRepository.GetDeckByIdAsync(id, userId, cancellationToken : cancellationToken); if (deck == null) { throw new InvalidDeckException("You do not have access to this deck."); } if (deck.UserId != userId) { throw new InvalidDeckException("You do not have access to this deck."); } var distincted = (cardCollectionIds ?? Array.Empty <int>()).Distinct().ToArray(); if (distincted.Length > deck.MaxCards) { throw new InvalidDeckException("Over maximum number of cards added."); } var cardCollectionResults = await _cardCollectionRepository.FindCardCollectionsAsync( new Data.Abstractions.CardCollectionSearchFilter { Ids = distincted, UserId = userId, }, cancellationToken : cancellationToken ); var ownedCount = cardCollectionResults.TotalCount; if (ownedCount != distincted.Length) { throw new InvalidCardException("You do not own some of the cards."); } var deckUpdate = new DeckUpdateData { CardCollectionIds = distincted, }; await _deckRepository.UpdateDeckAsync(id, deckUpdate, cancellationToken : cancellationToken); }
private async Task <Abstractions.SearchResult <CardCollectionModel> > GetCardCollectionInternalAsync(Abstractions.CardCollectionSearchFilter filter, CancellationToken cancellationToken) { var cardCollections = await _cardCollectionRepository.FindCardCollectionsAsync( new Data.Abstractions.CardCollectionSearchFilter { CardName = filter.Name, Ids = filter.Ids?.ToArray(), UserId = filter.UserId, }, cancellationToken : cancellationToken ); var results = cardCollections.Results.Select(_cardCollectionDataMapper.Map).ToArray(); var cardIds = results.Select(x => x.CardId).ToArray(); var cardResults = await _cardRepository.FindCardsAsync( new Data.Abstractions.CardSearchFilter { Ids = cardIds, UserId = filter.UserId, }, cancellationToken : cancellationToken ); var cards = cardResults.Results; foreach (var res in results) { res.Card = cards.FirstOrDefault(x => x.Id == res.CardId); } return(new Abstractions.SearchResult <CardCollectionModel> { Count = cardCollections.TotalCount, Results = results, }); }