private bool NoOtherPresentationWithSameName(string userId, Presentation p, UploadPresentationModel updateModel)
        {
            var numOfSameNamePresentations = _context.UserPresentations.Where(u => u.UserId == userId && u.PresentationId != p.Id)
                                             .Include(u => u.Presentation).Count(u => u.Presentation.Name == updateModel.Name);

            return(numOfSameNamePresentations == 0);
        }
Esempio n. 2
0
        public async Task <IActionResult> ModifyPresentation(UpdatePresentationModel vm)
        {
            var id = _userManager.GetUserId(this.User);

            vm.ViewInput = new UpdatePresentationModel.Input();
            var categoriesResult = await _categoriesRepository.GetCurrentCategories();

            if (categoriesResult.ErrorMessageIfAny != null)
            {
                vm.ViewInput.ErrorMessageIfAny = categoriesResult.ErrorMessageIfAny;
                return(View(vm));
            }

            vm.ViewInput.Categories = categoriesResult.Value;

            if (vm.NameBeforeUpdate == null)
            {
                vm.ViewInput.ErrorMessageIfAny = "Error. The name before update is missing";
                return(View(vm));
            }

            if (!ModelState.IsValid)
            {
                return(View(vm));
            }

            var tags = vm.ViewOutput.TagsList != null?vm.ViewOutput.TagsList.Split(new char[] { ',', ' ' }) : new string[]
            {
            };
            var tagsList = new List <string>(tags);

            var updateModel = new UploadPresentationModel
            {
                Name        = vm.ViewOutput.Name,
                Description = vm.ViewOutput.Description,
                CategoryId  = vm.ViewOutput.CategoryId,
                Tags        = tagsList,
                IsPublic    = vm.ViewOutput.IsPublic
            };

            if (vm.ViewOutput.File != null)
            {
                updateModel.SourceStream = vm.ViewOutput.File.OpenReadStream();
            }

            var updateResult = await _presentationsRepository.UpdatePresentationForUser(id,
                                                                                        vm.NameBeforeUpdate, updateModel);

            if (updateResult.ErrorMessageIfAny != null)
            {
                vm.ViewInput.ErrorMessageIfAny = updateResult.ErrorMessageIfAny;
                return(View(vm));
            }

            return(RedirectToAction(nameof(HomeController.MyPresentations)));
        }
Esempio n. 3
0
        public async Task <IActionResult> UploadPresentation(UploadPresentationViewModel vm)
        {
            Action <UploadPresentationViewModel> populateVMWithCategories = async(UploadPresentationViewModel m) =>
            {
                m.ViewInput = new UploadPresentationViewModel.Input();
                var result = await _categoriesRepository.GetCurrentCategories();

                m.ViewInput.Categories = result.Value;
            };

            if (!ModelState.IsValid)
            {
                populateVMWithCategories(vm);
                return(View(vm));
            }

            var userId = _userManager.GetUserId(User);
            var tags   = vm.ViewOutput.TagsList != null?vm.ViewOutput.TagsList.Split(new char[] { ',', ' ' }) : new string[]
            {
            };
            var tagsList = new List <string>(tags);

            var uploadModel = new UploadPresentationModel
            {
                CategoryId   = vm.ViewOutput.CategoryId,
                Name         = vm.ViewOutput.Name,
                Description  = vm.ViewOutput.Description,
                Tags         = tagsList,
                IsPublic     = vm.ViewOutput.IsPublic,
                SourceStream = vm.ViewOutput.File.OpenReadStream()
            };

            var opResult = await _presentationsRepository.UploadPresentationForUser(userId, uploadModel);


            if (opResult.ErrorMessageIfAny != null)
            {
                populateVMWithCategories(vm);
                vm.ViewInput.ErrorMessageIfAny = opResult.ErrorMessageIfAny;
                return(View(vm));
            }

            return(new RedirectToActionResult("Index", "Home", new { }));
        }
        private async Task <OperationStatus> ModifyPresentationByCopying(string userId, Presentation p, UploadPresentationModel updateModel)
        {
            var newPresentation = new Presentation
            {
                CategoryId       = p.CategoryId,
                Name             = p.Name,
                Description      = p.Description,
                IsPublic         = p.IsPublic,
                FileID           = p.FileID,
                PresentationTags = new List <PresentationTag>()
            };

            var list = await _context.UserPresentations.Where(u => u.UserId == userId && u.PresentationId == p.Id).ToListAsync();

            _context.UserPresentations.Remove(list.First());

            _context.Presentations.Add(newPresentation);
            var rows = await _context.SaveChangesAsync();

            if (rows == 0)
            {
                return(new OperationStatus
                {
                    ErrorMessageIfAny = "Error while trying to update the database"
                });
            }

            var newUP = new UserPresentation
            {
                UserId         = userId,
                PresentationId = newPresentation.Id
            };

            _context.UserPresentations.Add(newUP);

            return(await ModifyPresentationInPlace(userId, newPresentation, updateModel));
        }
        private async Task <OperationStatus> ModifyPresentationInPlace(string userId, Presentation p, UploadPresentationModel updateModel)
        {
            p.Name             = updateModel.Name;
            p.Description      = updateModel.Description;
            p.CategoryId       = updateModel.CategoryId;
            p.IsPublic         = updateModel.IsPublic;
            p.PresentationTags = new List <PresentationTag>();

            var associatedPTs = await _context.PresentationTags.Where(pt => pt.PresentationId == p.Id).ToListAsync();

            _context.PresentationTags.RemoveRange(associatedPTs);

            var newTagsResult = await _tagsRepository.CreateOrGetTags(updateModel.Tags);

            if (newTagsResult.ErrorMessageIfAny != null)
            {
                return(newTagsResult);
            }

            foreach (var tag in newTagsResult.Value)
            {
                var pt = new PresentationTag
                {
                    Tag          = tag,
                    Presentation = p
                };

                tag.PresentationTags.Add(pt);
                p.PresentationTags.Add(pt);
            }

            if (updateModel.SourceStream != null)
            {
                await _filesRepository.DeleteFileWithId(p.FileID);

                var createResult = await _filesRepository.SaveFile(updateModel.SourceStream);

                if (createResult.ErrorMessageIfAny != null)
                {
                    return(createResult);
                }

                p.FileID = createResult.Value;
            }

            _context.Presentations.Update(p);
            var rows = await _context.SaveChangesAsync();

            if (rows == 0)
            {
                return(new OperationStatus
                {
                    ErrorMessageIfAny = "An error ocurred while trying to update the database"
                });
            }

            return(new OperationStatus());
        }
        public async Task <OperationStatus> UpdatePresentationForUser(string userId, string presentationName, UploadPresentationModel updateModel)
        {
            var opStatus = new OperationStatus();

            var foundPresentationResult = await GetPresentationForUser(userId, presentationName);

            if (foundPresentationResult.ErrorMessageIfAny != null)
            {
                return(foundPresentationResult);
            }

            var presentation = foundPresentationResult.Value;

            if (!await IsUpdateNecessary(presentation, updateModel))
            {
                opStatus.ErrorMessageIfAny = "No modification required";
                return(opStatus);
            }

            if (!NoOtherPresentationWithSameName(userId, presentation, updateModel))
            {
                opStatus.ErrorMessageIfAny = "Another presentation has the same name.";
                return(opStatus);
            }

            if (!_context.Categories.Any(c => c.Id == updateModel.CategoryId))
            {
                return(new OperationStatus {
                    ErrorMessageIfAny = OperationStatus.kNoSuchCategoryWithId
                });
            }

            if (!presentation.IsPublic || _context.UserPresentations.Count(up => up.PresentationId == presentation.Id) == 1)
            {
                return(await ModifyPresentationInPlace(userId, presentation, updateModel));
            }

            return(await ModifyPresentationByCopying(userId, presentation, updateModel));
        }
        public async Task <OperationStatus> UploadPresentationForUser(string userId, UploadPresentationModel model)
        {
            var upList = await _context.UserPresentations.Where(userPresentation => userPresentation.UserId == userId)
                         .Include(userp => userp.Presentation).Where(userp => userp.Presentation.Name == model.Name).ToListAsync();

            if (upList.Count > 0)
            {
                return(new OperationStatus {
                    ErrorMessageIfAny = OperationStatus.kPresentationWithSameNameExists
                });
            }

            if (!_context.Categories.Any(c => c.Id == model.CategoryId))
            {
                return(new OperationStatus {
                    ErrorMessageIfAny = OperationStatus.kNoSuchCategoryWithId
                });
            }

            var tagsForPresentationResult = await _tagsRepository.CreateOrGetTags(model.Tags);

            if (tagsForPresentationResult.ErrorMessageIfAny != null)
            {
                return(tagsForPresentationResult);
            }
            var tagsForPresentation = tagsForPresentationResult.Value;

            var currentPresentation = new Presentation
            {
                Name              = model.Name,
                Description       = model.Description,
                UserPresentations = new List <UserPresentation>(),
                CategoryId        = model.CategoryId,
                PresentationTags  = new List <PresentationTag>(),
                IsPublic          = model.IsPublic
            };

            var saveResult = await _filesRepository.SaveFile(model.SourceStream);

            if (saveResult.ErrorMessageIfAny != null)
            {
                return(saveResult);
            }
            currentPresentation.FileID = saveResult.Value;

            await _context.Presentations.AddAsync(currentPresentation);

            foreach (var tag in tagsForPresentation)
            {
                var pt = new PresentationTag
                {
                    Tag          = tag,
                    Presentation = currentPresentation
                };

                tag.PresentationTags.Add(pt);
                currentPresentation.PresentationTags.Add(pt);
            }

            var up = new UserPresentation
            {
                PresentationId = currentPresentation.Id,
                UserId         = userId
            };

            _context.UserPresentations.Add(up);


            int rows = await _context.SaveChangesAsync();

            if (rows > 0)
            {
                return(new OperationStatus());
            }

            return(new OperationStatus()
            {
                ErrorMessageIfAny = OperationStatus.kUnknownError
            });
        }