MergeController.cs 6.3 KB

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