public async Task CheckValidityAsync(IStringLocalizer localizer, MemCheckDbContext dbContext) { CardInputValidator.Run(this, localizer); var cards = dbContext.Cards .Include(card => card.CardLanguage) .Include(card => card.Images) .Include(card => card.TagsInCards) .ThenInclude(tag => tag.Tag) .Include(card => card.UsersWithView) .AsSingleQuery() .Where(card => card.Id == CardId); if (!await cards.AnyAsync()) { throw new RequestInputException("Unknown card id"); } var card = cards.Single(); var dataBeforeUpdate = new { CardLanguageId = card.CardLanguage.Id, card.FrontSide, card.BackSide, card.AdditionalInfo, TagIds = card.TagsInCards.Select(tag => tag.TagId), UserWithVisibilityIds = card.UsersWithView.Select(u => u.UserId), card.Images }; if ((dataBeforeUpdate.CardLanguageId == LanguageId) && (dataBeforeUpdate.FrontSide == FrontSide) && (dataBeforeUpdate.BackSide == BackSide) && (dataBeforeUpdate.AdditionalInfo == AdditionalInfo) && Enumerable.SequenceEqual(dataBeforeUpdate.TagIds.OrderBy(tagId => tagId), Tags.OrderBy(tagId => tagId)) && Enumerable.SequenceEqual(dataBeforeUpdate.UserWithVisibilityIds.OrderBy(userId => userId), UsersWithVisibility.OrderBy(userId => userId)) && SameImageLists(dataBeforeUpdate.Images)) { throw new RequestInputException(localizer["CanNotUpdateMetadataBecauseSameAsOriginal"].Value); } //to do: reducing UsersWithView must check that this will not break anybody's deck, nor prevent an author of a version of this card from viewing it }
public async Task <Guid> RunAsync(Request request, IStringLocalizer localizer) { CardInputValidator.Run(request, localizer); var language = dbContext.CardLanguages.Where(language => language.Id == request.LanguageId).Single(); var card = new Card() { FrontSide = request.FrontSide, BackSide = request.BackSide, AdditionalInfo = request.AdditionalInfo, CardLanguage = language, VersionCreator = request.VersionCreator, InitialCreationUtcDate = DateTime.Now.ToUniversalTime(), VersionUtcDate = DateTime.Now.ToUniversalTime(), VersionDescription = request.VersionDescription }; dbContext.Cards.Add(card); var usersWithView = new List <UserWithViewOnCard>(); foreach (var userFromRequestId in request.UsersWithVisibility) { var userFromDb = dbContext.Users.Where(u => u.Id == userFromRequestId).Single(); var userWithView = new UserWithViewOnCard() { UserId = userFromDb.Id, User = userFromDb, CardId = card.Id, Card = card }; dbContext.UsersWithViewOnCards.Add(userWithView); usersWithView.Add(userWithView); } card.UsersWithView = usersWithView; var tagsInCards = new List <TagInCard>(); foreach (var tagToAdd in request.Tags) { var tagFromDb = dbContext.Tags.Where(t => t.Id == tagToAdd).Single(); var tagInCard = new TagInCard() { TagId = tagFromDb.Id, Tag = tagFromDb, CardId = card.Id }; dbContext.TagsInCards.Add(tagInCard); tagsInCards.Add(tagInCard); } card.TagsInCards = tagsInCards; var cardImageList = new List <ImageInCard>(); foreach (var image in request.FrontSideImageList) { AddImage(card.Id, image, 1, cardImageList); } foreach (var image in request.BackSideImageList) { AddImage(card.Id, image, 2, cardImageList); } foreach (var image in request.AdditionalInfoImageList) { AddImage(card.Id, image, 3, cardImageList); } card.Images = cardImageList; await dbContext.SaveChangesAsync(); return(card.Id); }
public async Task CheckValidityAsync(CallContext callContext) { CardInputValidator.Run(this, callContext.Localized); await Task.CompletedTask; }