using AutoMapper; using AutoMapper.QueryableExtensions; using Hangfire; using Masuit.LuceneEFCore.SearchEngine.Linq; using Masuit.MyBlogs.Core.Common; using Masuit.MyBlogs.Core.Extensions; using Masuit.MyBlogs.Core.Infrastructure.Services.Interface; using Masuit.MyBlogs.Core.Models.DTO; using Masuit.MyBlogs.Core.Models.Entity; using Masuit.MyBlogs.Core.Models.Enum; using Masuit.Tools; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using System; using System.Linq; using System.Linq.Expressions; using System.Text.RegularExpressions; namespace Masuit.MyBlogs.Core.Controllers { [Route("merge/")] public class MergeController : AdminController { public IPostMergeRequestService PostMergeRequestService { get; set; } public IWebHostEnvironment HostEnvironment { get; set; } public MapperConfiguration MapperConfig { get; set; } /// /// 获取合并详情 /// /// /// [HttpGet("{id}")] public ActionResult Get(int id) { return ResultData(Mapper.Map(PostMergeRequestService.GetById(id))); } /// /// 获取分页数据 /// /// /// /// /// [HttpGet] public ActionResult GetPageData(int page = 1, int size = 10, string kw = "") { Expression> where = r => true; if (!string.IsNullOrEmpty(kw)) { where = where.And(r => r.Title.Contains(kw) || r.Content.Contains(kw) || r.Modifier.Contains(kw) || r.ModifierEmail.Contains(kw)); } var list = PostMergeRequestService.GetQuery(where).OrderBy(d => d.MergeState).ThenByDescending(r => r.Id).Skip((page - 1) * size).Take(size).ProjectTo(MapperConfig).ToList(); var count = PostMergeRequestService.Count(where); var pageCount = Math.Ceiling(count * 1.0 / size).ToInt32(); return PageResult(list, pageCount, count); } /// /// 版本对比 /// /// /// [HttpGet("compare/{mid}")] public IActionResult MergeCompare(int mid) { var newer = PostMergeRequestService.GetById(mid) ?? throw new NotFoundException("待合并文章未找到"); var old = newer.Post; var diffHelper = new HtmlDiff.HtmlDiff(old.Content, newer.Content); string diffOutput = diffHelper.Build(); old.Content = Regex.Replace(Regex.Replace(diffOutput, "", string.Empty), @"<\w+>", string.Empty); newer.Content = Regex.Replace(Regex.Replace(diffOutput, "", string.Empty), @"<\w+>", string.Empty); return ResultData(new { old = old.Mapper(), newer = newer.Mapper() }); } /// /// 直接合并 /// /// /// [HttpPost("{id}")] public IActionResult Merge(int id) { var merge = PostMergeRequestService.GetById(id) ?? throw new NotFoundException("待合并文章未找到"); var history = merge.Post.Mapper(); history.Id = 0; merge.Post = Mapper.Map(merge, merge.Post); merge.Post.PostHistoryVersion.Add(history); merge.Post.ModifyDate = DateTime.Now; merge.MergeState = MergeStatus.Merged; var b = PostMergeRequestService.SaveChanges() > 0; if (!b) { return ResultData(null, false, "文章合并失败!"); } string link = Request.Scheme + "://" + Request.Host + "/" + merge.Post.Id; string content = System.IO.File.ReadAllText(HostEnvironment.WebRootPath + "/template/merge-pass.html").Replace("{{link}}", link).Replace("{{title}}", merge.Post.Title); BackgroundJob.Enqueue(() => CommonHelper.SendMail(CommonHelper.SystemSettings["Title"] + "博客你提交的修改已通过", content, merge.ModifierEmail)); return ResultData(null, true, "文章合并完成!"); } /// /// 编辑并合并 /// /// /// [HttpPost] public IActionResult Merge([FromForm]PostMergeRequestInputDtoBase dto) { var merge = PostMergeRequestService.GetById(dto.Id) ?? throw new NotFoundException("待合并文章未找到"); Mapper.Map(dto, merge); var b = PostMergeRequestService.SaveChanges() > 0; if (b) { return Merge(merge.Id); } return ResultData(null, false, "文章合并失败!"); } /// /// 拒绝合并 /// /// /// /// [HttpPost("reject/{id}")] public ActionResult Reject(int id, string reason) { var merge = PostMergeRequestService.GetById(id) ?? throw new NotFoundException("待合并文章未找到"); merge.MergeState = MergeStatus.Reject; var b = PostMergeRequestService.SaveChanges() > 0; if (!b) { return ResultData(null, false, "操作失败!"); } var link = Request.Scheme + "://" + Request.Host + "/" + merge.Post.Id + "/merge/" + id; var content = System.IO.File.ReadAllText(HostEnvironment.WebRootPath + "/template/merge-reject.html").Replace("{{link}}", link).Replace("{{title}}", merge.Post.Title).Replace("{{reason}}", reason); BackgroundJob.Enqueue(() => CommonHelper.SendMail(CommonHelper.SystemSettings["Title"] + "博客你提交的修改已被拒绝", content, merge.ModifierEmail)); return ResultData(null, true, "合并已拒绝!"); } } }