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); }
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))); }
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 }); }