Ejemplo n.º 1
0
        public async Task <IActionResult> Edit(string id)
        {
            var model = new AddOrUpdateStoryInputModel();

            var story = await _mediator.Send(new GetStoryQuery(id));

            var user = await GetLoggedUserAsync();

            if (story == null || story.AuthorId != user.GetRole <Author>()?.Id)
            {
                return(NotFound());
            }

            var tags = await _mediator.Send(new GetAllQuery <Tag>(tag => tag.StoryTags.Any(st => st.StoryId == story.Id)));

            model.StoryId    = story.Id;
            model.StoryTitle = story.Title;
            model.Content    = story.Content;
            model.Tags       = string.Join(',', tags.Select(x => x.Title));
            model.Title      = $"Edit {story.Title}";

            if (TempData.ContainsKey(_ErrorKey))
            {
                model.Informations.Add((string)TempData[_ErrorKey]);
            }

            return(View("Share", model));
        }
Ejemplo n.º 2
0
        private async Task <Model.Story> GetAndUpdateAsync(AddOrUpdateStoryInputModel message)
        {
            var story = await _mediator.Send(new GetByIdQuery <Model.Story>(message.StoryId.Value));

            story.Title   = message.StoryTitle;
            story.Content = message.Content;
            return(story);
        }
Ejemplo n.º 3
0
        private async Task UpdateTags(AddOrUpdateStoryInputModel message, Model.Story story)
        {
            var storyTags = await _mediator.Send(new GetAllQuery <StoryTags>(x => x.StoryId == story.Id));

            foreach (var tag in storyTags)
            {
                _unitOfWork.Delete(tag);
            }

            await _unitOfWork.Commit();

            if (string.IsNullOrEmpty(message.Tags))
            {
                return;
            }

            var uiTags = message.Tags
                         .Split(',')
                         .Where(x => !string.IsNullOrWhiteSpace(x))
                         .Select(x => x.Trim().ToLower())
                         .ToArray();

            var existingTags = await _mediator.Send(new GetAllQuery <Tag>(x => uiTags.Contains(x.Title)));

            foreach (var uiTag in uiTags)
            {
                var tagDb = existingTags.FirstOrDefault(x => x.Title == uiTag);

                if (tagDb == null)
                {
                    tagDb = new Tag {
                        Title = uiTag
                    };

                    _unitOfWork.Add(tagDb);

                    await _unitOfWork.Commit();
                }

                _unitOfWork.Add(new StoryTags {
                    TagId = tagDb.Id, StoryId = story.Id
                });
            }

            await _unitOfWork.Commit();
        }
Ejemplo n.º 4
0
        public async Task <IActionResult> Share(AddOrUpdateStoryInputModel model)
        {
            model.UserId = (await GetLoggedUserAsync()).Id;

            if (!ModelState.IsValid)
            {
                return(View("Share", model));
            }

            var response = await _mediator.Send(model);

            if (response.HasErrors)
            {
                MapToModelState(response);
                return(View(model));
            }

            return(Redirect("/"));
        }
Ejemplo n.º 5
0
        public async Task <IActionResult> Edit(AddOrUpdateStoryInputModel model)
        {
            var user = await GetLoggedUserAsync();

            model.UserId = user.Id;

            var response = await _mediator.Send(model);

            if (response.HasErrors)
            {
                foreach (var responseError in response.Errors)
                {
                    ModelState.AddModelError(responseError.Key, responseError.Message);
                }

                return(View("Share", model));
            }

            TempData[_ErrorKey] = "Story succesfully saved!";

            return(RedirectToAction("Edit", new { id = response.Result.Slug }));
        }
Ejemplo n.º 6
0
        public async Task <IActionResult> Edit(string id)
        {
            var model = new AddOrUpdateStoryInputModel();

            var story = await _mediator.Send(new GetStoryQuery(id));

            var user = await GetLoggedUserAsync();

            if (story == null)
            {
                return(NotFound("Story not found"));
            }

            if (story.AuthorId != user.GetRole <Author>()?.Id&& !user.Is <Administrator>())
            {
                return(Unauthorized());
            }

            var tags = await _mediator.Send(new GetAllQuery <Tag>(tag => tag.StoryTags.Any(st => st.StoryId == story.Id)));

            model.StoryId    = story.Id;
            model.StoryTitle = story.Title;
            model.Content    = story.Content;
            model.Tags       = string.Join(',', tags.Select(x => x.Title));
            model.Title      = $"Edit {story.Title}";

            if (!string.IsNullOrEmpty(story.Photo))
            {
                model.ExistingImage = $"{_appSettings.StorageDomain}{_appSettings.StoryPhotoContainer}/{story.Photo}";
            }

            if (TempData.ContainsKey(_ErrorKey))
            {
                model.Informations.Add((string)TempData[_ErrorKey]);
            }

            return(View("Share", model));
        }
Ejemplo n.º 7
0
        public async Task <IActionResult> Edit(AddOrUpdateStoryInputModel model)
        {
            var user = await GetLoggedUserAsync();

            model.UserId = user.Id;

            if (!ModelState.IsValid)
            {
                return(View("Share", model));
            }

            var response = await _mediator.Send(model);

            if (response.HasErrors)
            {
                MapToModelState(response);
                return(View("Share", model));
            }

            TempData[_ErrorKey] = "Story succesfully saved!";

            return(RedirectToAction("Edit", new { id = response.Result.Slug }));
        }
Ejemplo n.º 8
0
        public async Task <Response <Model.Story> > Handle(AddOrUpdateStoryInputModel message)
        {
            var response = new Response <Model.Story>();

            var user = await _mediator.Send(new GetOneQuery <User>(x => x.Id == message.UserId, u => u.Roles));

            if (user == null)
            {
                response.AddError("User", "User not foound");
                return(response);
            }

            Author author;

            if (!user.Is <Author>())
            {
                author = new Author();
                user.Roles.Add(author);

                _unitOfWork.Update(user);

                await _unitOfWork.Commit();
            }
            else
            {
                author = user.GetRole <Author>();
            }

            Model.Story story;
            if (message.StoryId.HasValue)
            {
                story = await GetAndUpdateAsync(message);

                if (!user.Is <Administrator>())
                {
                    story.Status = Status.Draft;
                }
            }
            else
            {
                story = author.CreateNewStory(message.StoryTitle, message.Content);
            }

            story.Modified = DateTime.UtcNow;

            if (message.StoryId.HasValue)
            {
                _unitOfWork.Update(story);
            }
            else
            {
                _unitOfWork.Add(story);
            }

            try
            {
                await _unitOfWork.Commit();

                await UpdateTags(message, story);

                response.Result = story;
            }
            catch (Exception e)
            {
                response.AddError("", e.Unwrap().Message);
            }

            return(response);
        }
Ejemplo n.º 9
0
        public async Task <Response <Model.Story> > Handle(AddOrUpdateStoryInputModel message)
        {
            var response = new Response <Model.Story>();

            var user = await _mediator.Send(new GetOneQuery <User>(x => x.Id == message.UserId, u => u.Roles));

            if (user == null)
            {
                response.AddError("User", "User not foound");
                return(response);
            }

            Author author;

            if (!user.Is <Author>())
            {
                author = new Author();
                user.Roles.Add(author);

                _unitOfWork.Update(user);

                await _unitOfWork.CommitAsync();
            }
            else
            {
                author = user.GetRole <Author>();
            }

            Model.Story story;
            if (message.StoryId.HasValue)
            {
                story = await GetAndUpdateAsync(message);

                if (!user.Is <Administrator>())
                {
                    story.Status = Status.Draft;
                }
            }
            else
            {
                story = author.CreateNewStory(message.StoryTitle, message.Content);
            }

            story.Modified = DateTime.UtcNow;

            if (message.StoryId.HasValue)
            {
                _unitOfWork.Update(story);
            }
            else
            {
                _unitOfWork.Add(story);
            }

            try
            {
                await _unitOfWork.CommitAsync();

                await UpdateTags(message, story);

                response.Result = story;

                var fileName = $"{story.Id}-{message.Image?.FileName}";

                if (await TryUploadPhoto(message.Image, fileName, response))
                {
                    if (!string.IsNullOrEmpty(story.Photo))
                    {
                        await _storageService.DeleteAsync(story.Photo, ContentType.Story);
                    }

                    story.Photo = fileName;

                    await _unitOfWork.CommitAsync();
                }
            }
            catch (Exception e)
            {
                response.AddError("", e.Unwrap().Message);
                _logger.LogError("Error saving story: " + e.Unwrap().Message, e);
            }

            return(response);
        }