MergeController.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. using AutoMapper;
  2. using AutoMapper.QueryableExtensions;
  3. using Hangfire;
  4. using Masuit.LuceneEFCore.SearchEngine.Linq;
  5. using Masuit.MyBlogs.Core.Common;
  6. using Masuit.MyBlogs.Core.Extensions;
  7. using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
  8. using Masuit.MyBlogs.Core.Models.Command;
  9. using Masuit.MyBlogs.Core.Models.DTO;
  10. using Masuit.MyBlogs.Core.Models.Entity;
  11. using Masuit.MyBlogs.Core.Models.Enum;
  12. using Masuit.Tools;
  13. using Masuit.Tools.Models;
  14. using Microsoft.AspNetCore.Hosting;
  15. using Microsoft.AspNetCore.Mvc;
  16. using System;
  17. using System.Linq;
  18. using System.Linq.Expressions;
  19. using System.Text.RegularExpressions;
  20. namespace Masuit.MyBlogs.Core.Controllers
  21. {
  22. [Route("merge/")]
  23. public class MergeController : AdminController
  24. {
  25. public IPostMergeRequestService PostMergeRequestService { get; set; }
  26. public IWebHostEnvironment HostEnvironment { get; set; }
  27. public MapperConfiguration MapperConfig { get; set; }
  28. /// <summary>
  29. /// 获取合并详情
  30. /// </summary>
  31. /// <param name="id"></param>
  32. /// <returns></returns>
  33. [HttpGet("{id}")]
  34. public ActionResult Get(int id)
  35. {
  36. return ResultData(Mapper.Map<PostMergeRequestDto>(PostMergeRequestService.GetById(id)));
  37. }
  38. /// <summary>
  39. /// 获取分页数据
  40. /// </summary>
  41. /// <param name="page"></param>
  42. /// <param name="size"></param>
  43. /// <param name="kw"></param>
  44. /// <returns></returns>
  45. [HttpGet]
  46. public ActionResult GetPageData(int page = 1, int size = 10, string kw = "")
  47. {
  48. Expression<Func<PostMergeRequest, bool>> where = r => true;
  49. if (!string.IsNullOrEmpty(kw))
  50. {
  51. where = where.And(r => r.Title.Contains(kw) || r.Content.Contains(kw) || r.Modifier.Contains(kw) || r.ModifierEmail.Contains(kw));
  52. }
  53. var list = PostMergeRequestService.GetQuery(where).OrderByDescending(d => d.MergeState == MergeStatus.Pending).ThenByDescending(r => r.Id).Skip((page - 1) * size).Take(size).ProjectTo<PostMergeRequestDtoBase>(MapperConfig).ToList();
  54. var count = PostMergeRequestService.Count(where);
  55. return Ok(new PagedList<PostMergeRequestDtoBase>(list, page, size, count));
  56. }
  57. /// <summary>
  58. /// 版本对比
  59. /// </summary>
  60. /// <param name="mid"></param>
  61. /// <returns></returns>
  62. [HttpGet("compare/{mid}")]
  63. public IActionResult MergeCompare(int mid)
  64. {
  65. var newer = PostMergeRequestService.GetById(mid) ?? throw new NotFoundException("待合并文章未找到");
  66. var old = newer.Post;
  67. var diffHelper = new HtmlDiff.HtmlDiff(old.Content, newer.Content);
  68. string diffOutput = diffHelper.Build();
  69. old.Content = Regex.Replace(Regex.Replace(diffOutput, "<ins.+?</ins>", string.Empty), @"<\w+></\w+>", string.Empty);
  70. newer.Content = Regex.Replace(Regex.Replace(diffOutput, "<del.+?</del>", string.Empty), @"<\w+></\w+>", string.Empty);
  71. return ResultData(new { old = old.Mapper<PostMergeRequestDto>(), newer = newer.Mapper<PostMergeRequestDto>() });
  72. }
  73. /// <summary>
  74. /// 直接合并
  75. /// </summary>
  76. /// <param name="id"></param>
  77. /// <returns></returns>
  78. [HttpPost("{id}")]
  79. public IActionResult Merge(int id)
  80. {
  81. var merge = PostMergeRequestService.GetById(id) ?? throw new NotFoundException("待合并文章未找到");
  82. var history = merge.Post.Mapper<PostHistoryVersion>();
  83. history.Id = 0;
  84. merge.Post = Mapper.Map(merge, merge.Post);
  85. merge.Post.PostHistoryVersion.Add(history);
  86. merge.Post.ModifyDate = DateTime.Now;
  87. merge.MergeState = MergeStatus.Merged;
  88. var b = PostMergeRequestService.SaveChanges() > 0;
  89. if (!b)
  90. {
  91. return ResultData(null, false, "文章合并失败!");
  92. }
  93. string link = Request.Scheme + "://" + Request.Host + "/" + merge.Post.Id;
  94. string content = System.IO.File.ReadAllText(HostEnvironment.WebRootPath + "/template/merge-pass.html").Replace("{{link}}", link).Replace("{{title}}", merge.Post.Title);
  95. BackgroundJob.Enqueue(() => CommonHelper.SendMail(CommonHelper.SystemSettings["Title"] + "博客你提交的修改已通过", content, merge.ModifierEmail));
  96. return ResultData(null, true, "文章合并完成!");
  97. }
  98. /// <summary>
  99. /// 编辑并合并
  100. /// </summary>
  101. /// <param name="dto"></param>
  102. /// <returns></returns>
  103. [HttpPost]
  104. public IActionResult Merge([FromForm]PostMergeRequestCommandBase dto)
  105. {
  106. var merge = PostMergeRequestService.GetById(dto.Id) ?? throw new NotFoundException("待合并文章未找到");
  107. Mapper.Map(dto, merge);
  108. var b = PostMergeRequestService.SaveChanges() > 0;
  109. return b ? Merge(merge.Id) : ResultData(null, false, "文章合并失败!");
  110. }
  111. /// <summary>
  112. /// 拒绝合并
  113. /// </summary>
  114. /// <param name="id"></param>
  115. /// <param name="reason"></param>
  116. /// <returns></returns>
  117. [HttpPost("reject/{id}")]
  118. public ActionResult Reject(int id, string reason)
  119. {
  120. var merge = PostMergeRequestService.GetById(id) ?? throw new NotFoundException("待合并文章未找到");
  121. merge.MergeState = MergeStatus.Reject;
  122. var b = PostMergeRequestService.SaveChanges() > 0;
  123. if (!b)
  124. {
  125. return ResultData(null, false, "操作失败!");
  126. }
  127. var link = Request.Scheme + "://" + Request.Host + "/" + merge.Post.Id + "/merge/" + id;
  128. var content = System.IO.File.ReadAllText(HostEnvironment.WebRootPath + "/template/merge-reject.html").Replace("{{link}}", link).Replace("{{title}}", merge.Post.Title).Replace("{{reason}}", reason);
  129. BackgroundJob.Enqueue(() => CommonHelper.SendMail(CommonHelper.SystemSettings["Title"] + "博客你提交的修改已被拒绝", content, merge.ModifierEmail));
  130. return ResultData(null, true, "合并已拒绝!");
  131. }
  132. /// <summary>
  133. /// 标记为恶意修改
  134. /// </summary>
  135. /// <param name="id"></param>
  136. /// <returns></returns>
  137. [HttpPost("block/{id}")]
  138. public ActionResult Block(int id)
  139. {
  140. var merge = PostMergeRequestService.GetById(id) ?? throw new NotFoundException("待合并文章未找到");
  141. merge.MergeState = MergeStatus.Block;
  142. var b = PostMergeRequestService.SaveChanges() > 0;
  143. return b ? ResultData(null, true, "操作成功!") : ResultData(null, false, "操作失败!");
  144. }
  145. }
  146. }