/// <inheritdoc /> public void RefreshContext(ICoreForumContext context) { _context = context; _roleService.RefreshContext(context); _membershipUserPointsService.RefreshContext(context); _settingsService.RefreshContext(context); _voteService.RefreshContext(context); _uploadedFileService.RefreshContext(context); _favouriteService.RefreshContext(context); _postEditService.RefreshContext(context); }
/// <inheritdoc /> public async Task <IPipelineProcess <Post> > Process(IPipelineProcess <Post> input, IMvcForumContext context) { // Refresh the context in each of these services _voteService.RefreshContext(context); _membershipUserPointsService.RefreshContext(context); _uploadedFileService.RefreshContext(context); _favouriteService.RefreshContext(context); _postEditService.RefreshContext(context); _roleService.RefreshContext(context); _localizationService.RefreshContext(context); try { // Get the Current user from ExtendedData var username = input.ExtendedData[Constants.ExtendedDataKeys.Username] as string; var loggedOnUser = await context.MembershipUser.FirstOrDefaultAsync(x => x.UserName == username); var loggedOnUsersRole = loggedOnUser.GetRole(_roleService); var permissions = _roleService.GetPermissions(input.EntityToProcess.Topic.Category, loggedOnUsersRole); if (input.EntityToProcess.User.Id == loggedOnUser.Id || permissions[ForumConfiguration.Instance.PermissionDeletePosts].IsTicked) { // Get the topic var topic = input.EntityToProcess.Topic; var votes = _voteService.GetVotesByPost(input.EntityToProcess.Id); #region Deleting Points // Remove the points the user got for this post await _membershipUserPointsService.Delete(input.EntityToProcess.User, PointsFor.Post, input.EntityToProcess.Id); // Also get all the votes and delete anything to do with those foreach (var postVote in votes) { await _membershipUserPointsService.Delete(PointsFor.Vote, postVote.Id); } // Also the mark as solution await _membershipUserPointsService.Delete(PointsFor.Solution, input.EntityToProcess.Id); #endregion await context.SaveChangesAsync(); #region Deleting Votes var votesToDelete = new List <Vote>(); votesToDelete.AddRange(votes); foreach (var vote in votesToDelete) { input.EntityToProcess.Votes.Remove(vote); _voteService.Delete(vote); } input.EntityToProcess.Votes.Clear(); #endregion #region Files // Clear files attached to post var filesToDelete = new List <UploadedFile>(); filesToDelete.AddRange(input.EntityToProcess.Files); foreach (var uploadedFile in filesToDelete) { // store the file path as we'll need it to delete on the file system var filePath = uploadedFile.FilePath; input.EntityToProcess.Files.Remove(uploadedFile); _uploadedFileService.Delete(uploadedFile); // And finally delete from the file system if (!string.IsNullOrWhiteSpace(filePath)) { var mapped = HostingEnvironment.MapPath(filePath); if (mapped != null) { File.Delete(mapped); } } } input.EntityToProcess.Files.Clear(); #endregion #region Favourites var postFavourites = new List <Favourite>(); postFavourites.AddRange(input.EntityToProcess.Favourites); foreach (var postFavourite in postFavourites) { input.EntityToProcess.Favourites.Remove(postFavourite); _favouriteService.Delete(postFavourite); } input.EntityToProcess.Favourites.Clear(); #endregion #region Post Edits var postEdits = new List <PostEdit>(); postEdits.AddRange(input.EntityToProcess.PostEdits); foreach (var postEdit in postEdits) { input.EntityToProcess.PostEdits.Remove(postEdit); _postEditService.Delete(postEdit); } input.EntityToProcess.PostEdits.Clear(); #endregion await context.SaveChangesAsync(); // Before we delete the post, we need to check if this is the last post in the topic // and if so update the topic if (input.ExtendedData.ContainsKey(Constants.ExtendedDataKeys.IgnoreLastPost)) { var ignoreLastPost = input.ExtendedData[Constants.ExtendedDataKeys.IgnoreLastPost] as bool?; if (ignoreLastPost == false) { var lastPost = topic.Posts.OrderByDescending(x => x.DateCreated).FirstOrDefault(); if (lastPost != null && lastPost.Id == input.EntityToProcess.Id) { // Get the new last post and update the topic topic.LastPost = topic.Posts.Where(x => x.Id != input.EntityToProcess.Id).OrderByDescending(x => x.DateCreated).FirstOrDefault(); } if (topic.Solved && input.EntityToProcess.IsSolution) { topic.Solved = false; } // Save the topic await context.SaveChangesAsync(); } } // Remove from the topic topic.Posts.Remove(input.EntityToProcess); // now delete the post context.Post.Remove(input.EntityToProcess); // Save changes await context.SaveChangesAsync(); } else { input.AddError(_localizationService.GetResourceString("Errors.NoPermission")); } } catch (System.Exception ex) { input.AddError(ex.Message); _loggingService.Error(ex); } return(input); }
/// <inheritdoc /> public async Task <IPipelineProcess <Post> > Process(IPipelineProcess <Post> input, IMvcForumContext context) { _localizationService.RefreshContext(context); _uploadedFileService.RefreshContext(context); try { // Files if (input.ExtendedData.ContainsKey(Constants.ExtendedDataKeys.PostedFiles)) { // Get the files if (input.ExtendedData[Constants.ExtendedDataKeys.PostedFiles] is HttpPostedFileBase[] files) { if (files.Any(x => x != null)) { // Username var username = input.ExtendedData[Constants.ExtendedDataKeys.Username] as string; // Loggedonuser var loggedOnUser = await context.MembershipUser.FirstOrDefaultAsync(x => x.UserName == username); // Before we save anything, check the user already has an upload folder and if not create one var uploadFolderPath = HostingEnvironment.MapPath(string.Concat(ForumConfiguration.Instance.UploadFolderPath, loggedOnUser.Id)); if (!Directory.Exists(uploadFolderPath)) { Directory.CreateDirectory(uploadFolderPath); } // Loop through each file and get the file info and save to the users folder and Db foreach (var file in files) { if (file != null) { // If successful then upload the file var uploadResult = file.UploadFile(uploadFolderPath, _localizationService); if (!uploadResult.UploadSuccessful) { input.AddError(uploadResult.ErrorMessage); return(input); } // Add the filename to the database var uploadedFile = new UploadedFile { Filename = uploadResult.UploadedFileName, Post = input.EntityToProcess, MembershipUser = input.EntityToProcess.User }; _uploadedFileService.Add(uploadedFile); } } // Was the post successful if (await context.SaveChangesAsync() <= 0) { // Problem input.AddError(_localizationService.GetResourceString("Errors.GenericMessage")); } } } } } catch (System.Exception ex) { input.AddError(ex.Message); _loggingService.Error(ex); } return(input); }