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+>\w+>", string.Empty);
newer.Content = Regex.Replace(Regex.Replace(diffOutput, "", string.Empty), @"<\w+>\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, "合并已拒绝!");
}
}
}