Exemplo n.º 1
0
 /// <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);
 }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
        /// <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);
        }