Exemple #1
0
        public async Task <IActionResult> GetCardsAsync([FromBody] GetCardsRequest request)
        {
            try
            {
                if (request.ExcludedCardIds == null)
                {
                    throw new ArgumentException("request.ExcludedCardIds is null");
                }
                if (request.ExcludedTagIds == null)
                {
                    throw new ArgumentException("request.ExcludedTagIds is null");
                }
                var currentUserId = await UserServices.UserIdFromContextAsync(HttpContext, userManager);

                var cardsToDownload    = request.CurrentCardCount == 0 ? 1 : (request.LearnModeIsUnknown ? 30 : 5); //loading cards to repeat is much more time consuming
                var applicationRequest = new GetCardsToLearn.Request(currentUserId, request.DeckId, request.LearnModeIsUnknown, request.ExcludedCardIds, request.ExcludedTagIds, cardsToDownload);
                var applicationResult  = await new GetCardsToLearn(dbContext).RunAsync(applicationRequest);
                var user = await userManager.GetUserAsync(HttpContext.User);

                var result = new GetCardsViewModel(applicationResult, localizer, user.UserName);
                return(Ok(result));
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #2
0
        public async Task <IActionResult> Update(Guid imageId, [FromBody] UpdateRequestModel request)
        {
            if (request.ImageName == null)
            {
                return(BadRequest(UploadImageResultViewModel.Failure(localizer["NameNotSet"].Value, false, localizer)));
            }
            if (request.Description == null)
            {
                return(BadRequest(UploadImageResultViewModel.Failure(localizer["DescriptionNotSet"].Value, false, localizer)));
            }
            if (request.Source == null)
            {
                return(BadRequest(UploadImageResultViewModel.Failure(localizer["SourceNotSet"].Value, false, localizer)));
            }
            if (request.VersionDescription == null)
            {
                return(BadRequest(UploadImageResultViewModel.Failure(localizer["VersionDescriptionNotSet"].Value, false, localizer)));
            }

            try
            {
                var user = await userManager.GetUserAsync(HttpContext.User);

                var applicationRequest = new UpdateImageMetadata.Request(imageId, user, request.ImageName, request.Source, request.Description, request.VersionDescription);
                await new UpdateImageMetadata(dbContext, localizer).RunAsync(applicationRequest);
                var toastText = $"{localizer["SuccessfullyUpdatedImage"]} '{request.ImageName}'";
                return(Ok(new { ToastText = toastText, ToastTitle = localizer["Success"] }));
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #3
0
        public async Task <IActionResult> RunQuery([FromBody] RunQueryRequest request)
        {
            try
            {
                CheckRunQueryRequestValidity(request);

                var user = await userManager.GetUserAsync(HttpContext.User);

                var userId   = user == null ? Guid.Empty : user.Id;
                var userName = user == null ? null : user.UserName;

                var excludedTags = (request.ExcludedTags.Count() == 1 && request.ExcludedTags.First() == allTagsFakeGuid) ? null : request.ExcludedTags;

                var applicationRequest = new SearchCards.Request(request.Deck, request.DeckIsInclusive, request.Heap, request.PageNo, request.PageSize, request.RequiredText, request.RequiredTags, excludedTags, request.Visibility, request.RatingFilteringMode, request.RatingFilteringValue, request.NotificationFiltering);

                var applicationResult = new SearchCards(dbContext).Run(applicationRequest, userId);

                var result = new RunQueryViewModel(applicationResult, userName, localizer, decksControllerLocalizer);

                return(base.Ok(result));
            }
            catch (SearchResultTooBigForRatingException)
            {
                return(ControllerError.BadRequest(localizer["SearchTooBigForRatingFiltering"].Value, this));
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #4
0
        public async Task <IActionResult> PostCardOfUser([FromBody] PostCardOfUserRequest card)
        {
            if (card.FrontSide == null)
            {
                return(ControllerError.BadRequest(localizer["InvalidCardEmptyFrontSide"].Value, this));
            }
            if (card.BackSide == null)
            {
                card.BackSide = "";
            }
            if (card.AdditionalInfo == null)
            {
                card.AdditionalInfo = "";
            }
            if (card.FrontSideImageList == null)
            {
                return(ControllerError.BadRequest("Invalid input: card.FrontSideImageList == null", this));
            }
            if (card.BackSideImageList == null)
            {
                return(ControllerError.BadRequest("Invalid input: card.BackSideImageList == null", this));
            }
            if (card.AdditionalInfoImageList == null)
            {
                return(ControllerError.BadRequest("Invalid input: card.AdditionalInfoImageList == null", this));
            }
            if (card.UsersWithVisibility == null)
            {
                return(ControllerError.BadRequest("Invalid input: card.UsersWithVisibility == null", this));
            }
            if (card.Tags == null)
            {
                return(ControllerError.BadRequest("Invalid input: card.Tags == null", this));
            }

            try
            {
                var user = await userManager.GetUserAsync(HttpContext.User);

                var versionDescription = localizer["InitialCardVersionCreation"].Value;
                var request            = new CreateCard.Request(user, card.FrontSide, card.FrontSideImageList, card.BackSide, card.BackSideImageList, card.AdditionalInfo, card.AdditionalInfoImageList, card.LanguageId, card.Tags, card.UsersWithVisibility, versionDescription);
                var cardId             = await new CreateCard(dbContext).RunAsync(request, localizer);

                if (card.AddToDeck != Guid.Empty)
                {
                    await new AddCardInDeck(dbContext).RunAsync(card.AddToDeck, cardId);
                }

                return(Ok());
            }
            catch (RequestInputException e)
            {
                return(ControllerError.BadRequest(e.Message, this));
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #5
0
 public IActionResult GetImageList([FromBody] GetImageListRequest request)
 {
     try
     {
         var result = new GetImageList(dbContext).Run(request.PageSize, request.PageNo, request.Filter ?? "");
         return(Ok(new GetImageListViewModel(result, localizer)));
     }
     catch (Exception e)
     {
         return(ControllerError.BadRequest(e, this));
     }
 }
Exemple #6
0
        public async Task <IActionResult> UpdateCard(Guid cardId, [FromBody] UpdateCardRequest card)
        {
            if (card.FrontSide == null)
            {
                return(ControllerError.BadRequest(localizer["InvalidCardEmptyFrontSide"].Value, this));
            }
            if (card.BackSide == null)
            {
                card.BackSide = "";
            }
            if (card.AdditionalInfo == null)
            {
                card.AdditionalInfo = "";
            }
            if (card.FrontSideImageList == null)
            {
                return(ControllerError.BadRequest("Invalid input: card.FrontSideImageList == null", this));
            }
            if (card.BackSideImageList == null)
            {
                return(ControllerError.BadRequest("Invalid input: card.BackSideImageList == null", this));
            }
            if (card.AdditionalInfoImageList == null)
            {
                return(ControllerError.BadRequest("Invalid input: card.AdditionalInfoImageList == null", this));
            }
            if (card.UsersWithVisibility == null)
            {
                return(ControllerError.BadRequest("Invalid input: card.UsersWithVisibility == null", this));
            }
            if (card.Tags == null)
            {
                return(ControllerError.BadRequest("Invalid input: card.Tags == null", this));
            }
            if (string.IsNullOrWhiteSpace(card.VersionDescription))
            {
                return(ControllerError.BadRequest(localizer["InvalidCardEmptyVersionDescription"].Value, this));
            }

            try
            {
                var user = await userManager.GetUserAsync(HttpContext.User);

                var request = new UpdateCard.Request(cardId, user, card.FrontSide, card.FrontSideImageList, card.BackSide, card.BackSideImageList, card.AdditionalInfo, card.AdditionalInfoImageList, card.LanguageId, card.Tags, card.UsersWithVisibility, card.VersionDescription);
                await new UpdateCard(dbContext).RunAsync(request, localizer);
                return(Ok());
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #7
0
 public IActionResult GetImage(Guid imageId, int size)
 {
     try
     {
         var blob    = new GetImage(dbContext).Run(new GetImage.Request(imageId, size));
         var content = new MemoryStream(blob);
         return(base.File(content, "APPLICATION/octet-stream", "noname"));
     }
     catch (Exception e)
     {
         return(ControllerError.BadRequest(e, this));
     }
 }
Exemple #8
0
 public async Task <IActionResult> ImageVersions(Guid imageId)
 {
     try
     {
         var appResults = await new GetImageVersions(dbContext, localizer).RunAsync(imageId);
         var result     = appResults.Select(appResult => new ImageVersion(appResult, localizer));
         return(Ok(result));
     }
     catch (Exception e)
     {
         return(ControllerError.BadRequest(e, this));
     }
 }
        async public Task <IActionResult> Create([FromBody] CreateRequest request)
        {
            try
            {
                var user = await userManager.GetUserAsync(HttpContext.User);

                var appRequest = new CreateDeck.Request(user, request.Description == null ? "" : request.Description, request.HeapingAlgorithmId);
                return(Ok(await new CreateDeck(dbContext).RunAsync(appRequest)));
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #10
0
        public async Task <IActionResult> GetCardForEdit(Guid cardId)
        {
            try
            {
                var userId = await UserServices.UserIdFromContextAsync(HttpContext, userManager);

                var result = new GetCardForEdit(dbContext).RunAsync(new GetCardForEdit.Request(userId, cardId));
                return(Ok(new GetCardForEditViewModel(await result, localizer)));
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #11
0
        public async Task <IActionResult> GetImageMetadata(Guid imageId)
        {
            try
            {
                var appRequest = new GetImageInfo(dbContext, localizer);
                var result     = await appRequest.RunAsync(imageId);

                return(Ok(new GetImageMetadataViewModel(result.Name, result.Source, result.Description)));
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #12
0
        public async Task <IActionResult> DeleteCards([FromBody] DeleteCardsRequest request)
        {
            try
            {
                var user = await userManager.GetUserAsync(HttpContext.User);

                var appRequest = new DeleteCards.Request(user, request.CardIds);
                await new DeleteCards(dbContext, localizer).RunAsync(appRequest);
                return(Ok());
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #13
0
        public async Task <IActionResult> UnregisterForNotifications([FromBody] UnregisterForNotificationsRequest request)
        {
            try
            {
                var userId = await UserServices.UserIdFromContextAsync(HttpContext, userManager);

                var appRequest = new RemoveCardNotifications.Request(userId, request.CardIds);
                await new RemoveCardNotifications(dbContext).RunAsync(appRequest);
                return(Ok());
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #14
0
        public async Task <IActionResult> MoveCardToHeap(Guid deckId, Guid cardId, int targetHeap, bool manualMove)
        {
            try
            {
                var userId = await UserServices.UserIdFromContextAsync(HttpContext, userManager);

                var request = new MoveCardToHeap.Request(userId, deckId, cardId, targetHeap, manualMove);
                await new MoveCardToHeap(dbContext).RunAsync(request);
                return(Ok());
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #15
0
        public async Task <IActionResult> SetCardRating(Guid cardId, int rating)
        {
            try
            {
                var user = await userManager.GetUserAsync(HttpContext.User);

                var request = new SetCardRating.Request(user, cardId, rating);
                await new SetCardRating(dbContext).RunAsync(request);
                return(Ok());
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #16
0
        public async Task <IActionResult> CardVersions(Guid cardId)
        {
            try
            {
                var userId = await UserServices.UserIdFromContextAsync(HttpContext, userManager);

                var appResults = await new GetCardVersions(dbContext, localizer).RunAsync(cardId, userId);
                var result     = appResults.Select(appResult => new CardVersion(appResult, localizer));
                return(Ok(result));
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #17
0
        public async Task <IActionResult> UserDecks()
        {
            try
            {
                var user = await userManager.GetUserAsync(HttpContext.User);

                var userId = (user == null) ? Guid.Empty : user.Id;
                var decks  = new GetUserDecksWithTags(dbContext).Run(userId);
                var result = decks.Select(deck => new UserDecksViewModel(deck.DeckId, deck.Description, DisplayServices.ShowDebugInfo(user), deck.Tags, localizer));
                return(base.Ok(result));
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #18
0
        public async Task <IActionResult> UploadImage([FromForm] UploadImageRequest request)
        {
            if (request.Name == null)
            {
                return(BadRequest(UploadImageResultViewModel.Failure(localizer["NameNotSet"].Value, false, localizer)));
            }
            if (request.Description == null)
            {
                return(BadRequest(UploadImageResultViewModel.Failure(localizer["DescriptionNotSet"].Value, false, localizer)));
            }
            if (request.Source == null)
            {
                return(BadRequest(UploadImageResultViewModel.Failure(localizer["SourceNotSet"].Value, false, localizer)));
            }
            if (request.File == null)
            {
                return(BadRequest(UploadImageResultViewModel.Failure(localizer["FileNotSet"].Value, false, localizer)));
            }

            try
            {
                var user = await userManager.GetUserAsync(HttpContext.User);

                if (user == null)
                {
                    return(BadRequest(UploadImageResultViewModel.Failure(localizer["NeedLogin"].Value, false, localizer)));
                }

                using (var stream = request.File.OpenReadStream())
                    using (var reader = new BinaryReader(stream))
                    {
                        var fileContent        = reader.ReadBytes((int)request.File.Length);
                        var applicationRequest = new StoreImage.Request(user, request.Name, request.Description, request.Source, request.File.ContentType, fileContent);
                        var id = await new StoreImage(dbContext, localizer).RunAsync(applicationRequest);
                        if (id == Guid.Empty)
                        {
                            throw new ApplicationException("Stored image with empty GUID as id");
                        }
                        return(Ok(UploadImageResultViewModel.Success(localizer["ImageSavedWithName"].Value + $" '{applicationRequest.Name}'", localizer)));
                    }
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
        public async Task <IActionResult> RemoveCardFromDeck(Guid deckId, Guid cardId)
        {
            try
            {
                var currentUserId = await UserServices.UserIdFromContextAsync(HttpContext, userManager);

                var query             = new RemoveCardFromDeck.Request(currentUserId, deckId, cardId);
                var applicationResult = await new RemoveCardFromDeck(dbContext).RunAsync(query);
                var frontSide         = $" '{applicationResult.FrontSideText.Truncate(30, true)}'";
                var mesgBody          = localizer["CardWithFrontSideHead"] + frontSide + ' ' + localizer["RemovedFromDeck"] + ' ' + applicationResult.DeckName;
                var result            = new { MessageTitle = localizer["Success"].Value, MessageBody = mesgBody };
                return(base.Ok(result));
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #20
0
        public async Task <IActionResult> Delete(Guid imageId, [FromBody] DeleteRequest request)
        {
            try
            {
                if (request.DeletionDescription == null)
                {
                    return(BadRequest(UploadImageResultViewModel.Failure("DeletionDescriptionNotSet", false, localizer)));
                }

                var user = await userManager.GetUserAsync(HttpContext.User);

                var applicationRequest = new DeleteImage.Request(user, imageId, request.DeletionDescription);
                var imageName          = await new DeleteImage(dbContext, localizer).RunAsync(applicationRequest);
                var toastText          = $"{localizer["SuccessfullyDeletedImage"]} '{imageName}'";
                return(Ok(new { ToastText = toastText, ToastTitle = localizer["Success"] }));
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #21
0
        public async Task <IActionResult> GetAllAsync()
        {
            try
            {
                var user = await userManager.GetUserAsync(HttpContext.User);

                if (user == null)
                {
                    return(Ok(new GetAllViewModel(null, false, 0, new GetAllDeckViewModel[0], DateTime.UtcNow)));
                }

                var userDecks       = new GetDecksWithLearnCounts(dbContext).Run(user.Id);
                var anythingToLearn = userDecks.Any(deck => deck.ExpiredCardCount > 0 || deck.UnknownCardCount > 0);
                var cardCount       = userDecks.Sum(deck => deck.CardCount);

                return(Ok(new GetAllViewModel(user.UserName, anythingToLearn, cardCount, userDecks.Select(deck => new GetAllDeckViewModel(deck)), DateTime.UtcNow)));
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #22
0
        public async Task <IActionResult> GetImageInfo([FromBody] GetImageInfoRequest request)
        {
            if (request.ImageName == null)
            {
                return(BadRequest(new { ToastText = localizer["PleaseEnterAnImageName"].Value, ShowStatus = false, ToastTitle = localizer["Failure"].Value }));
            }

            try
            {
                var appResult   = await new GetImageInfo(dbContext, localizer).RunAsync(request.ImageName);
                var popoverInfo = localizer["ImageUploader"] + ' ' + appResult.Owner.UserName + Environment.NewLine +
                                  localizer["ImageName"] + ' ' + appResult.Name + Environment.NewLine +
                                  localizer["Description"] + ' ' + appResult.Description + Environment.NewLine +
                                  localizer["Source"] + ' ' + appResult.Source + Environment.NewLine +
                                  localizer["UsedIn"] + ' ' + appResult.CardCount + localizer["Cards"];

                return(Ok(new GetImageInfoViewModel(appResult.ImageId, popoverInfo)));
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
Exemple #23
0
        public async Task <IActionResult> SetCardNotificationRegistration(Guid cardId, bool notif)
        {
            try
            {
                var userId = await UserServices.UserIdFromContextAsync(HttpContext, userManager);

                if (notif)
                {
                    var request = new AddCardNotifications.Request(userId, new[] { cardId });
                    await new AddCardNotifications(dbContext).RunAsync(request);
                }
                else
                {
                    var request = new RemoveCardNotifications.Request(userId, new[] { cardId });
                    await new RemoveCardNotifications(dbContext).RunAsync(request);
                }
                return(Ok());
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
        public async Task <IActionResult> GetUsers([FromBody] GetUsersRequest request)
        {
            if (request.Filter == null)
            {
                return(BadRequest(localizer["FilterSet"].Value));
            }

            try
            {
                var user = await userManager.GetUserAsync(HttpContext.User);

                if (user == null)
                {
                    return(BadRequest(localizer["NeedLogin"].Value));
                }
                var appRequest = new GetAllUsers.Request(user, request.PageSize, request.PageNo, request.Filter);
                var result     = await new GetAllUsers(dbContext, userManager).RunAsync(appRequest);
                return(Ok(new GetUsersViewModel(result)));
            }
            catch (Exception e)
            {
                return(ControllerError.BadRequest(e, this));
            }
        }
        public async Task <IActionResult> LaunchNotifier()
        {
            var launchingUser = await userManager.GetUserAsync(HttpContext.User);

            try
            {
                await emailSender.SendEmailAsync(launchingUser.Email, "Notifier starting", $"At {DateTime.Now}");

                var chrono         = Stopwatch.StartNew();
                var notifier       = new Notifier(dbContext);
                var notifierResult = await notifier.GetNotificationsAsync();

                foreach (var userNotifications in notifierResult.UserNotifications)
                {
                    var mailBody = new StringBuilder();
                    mailBody.Append("<html>");
                    mailBody.Append("<body>");
                    mailBody.Append($"<p>Hello {userNotifications.UserName}</p>");
                    mailBody.Append("<h1>Summary</h1>");
                    mailBody.Append("<p>");
                    mailBody.Append($"{userNotifications.RegisteredCardCount} registered cards<br/>");
                    mailBody.Append($"Finished at {DateTime.Now}<br/>");
                    mailBody.Append($"Notifier execution took {chrono.Elapsed}");
                    mailBody.Append("</p>");

                    mailBody.Append("<h1>Cards with new versions</h1>");
                    mailBody.Append("<ul>");
                    foreach (var card in userNotifications.CardVersions)
                    {
                        mailBody.Append("<li>");
                        mailBody.Append($"<a href={authoringPageLink}?CardId={card.CardId}>{card.FrontSide}</a><br/>");
                        mailBody.Append($"By {card.VersionCreator}<br/>");
                        mailBody.Append($"On {card.VersionUtcDate} (UTC)<br/>");
                        mailBody.Append($"Version description: '{card.VersionDescription}'");
                        mailBody.Append("</li>");
                    }
                    mailBody.Append("</ul>");

                    mailBody.Append("<h1>Deleted cards</h1>");
                    mailBody.Append("<ul>");
                    foreach (var card in userNotifications.DeletedCards)
                    {
                        mailBody.Append("<li>");
                        mailBody.Append($"{card.FrontSide}<br/>");
                        mailBody.Append($"By {card.DeletionAuthor}<br/>");
                        mailBody.Append($"On {card.DeletionUtcDate} (UTC)<br/>");
                        mailBody.Append($"Deletion description: '{card.DeletionDescription}'");
                        mailBody.Append("</li>");
                    }
                    mailBody.Append("</ul>");

                    mailBody.Append("</body>");
                    mailBody.Append("</html>");

                    await emailSender.SendEmailAsync(userNotifications.UserEmail, "MemCheck notifications", mailBody.ToString());
                }

                await emailSender.SendEmailAsync(launchingUser.Email, "Notifier ended on success", $"<html><body><p>Finished at {DateTime.Now}<br/>Notifier execution took {chrono.Elapsed}</p></body></html>");

                return(Ok());
            }
            catch (Exception e)
            {
                await emailSender.SendEmailAsync(launchingUser.Email, "Notifier ended on exception", $"<h1>{e.GetType().Name}</h1><p>{e.Message}</p>");

                return(ControllerError.BadRequest(e, this));
            }
        }