using Masuit.MyBlogs.Core.Common;
using Masuit.MyBlogs.Core.Extensions;
using Masuit.MyBlogs.Core.Models.DTO;
using Masuit.MyBlogs.Core.Models.Entity;
using Masuit.MyBlogs.Core.Models.Enum;
using Masuit.Tools;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Net.Http.Headers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
namespace Masuit.MyBlogs.Core.Controllers
{
///
/// 友情链接管理
///
public class LinksController : BaseController
{
public IHttpClientFactory HttpClientFactory { get; set; }
private HttpClient HttpClient => HttpClientFactory.CreateClient();
///
/// 友情链接页
///
///
[Route("links"), ResponseCache(Duration = 600, VaryByHeader = HeaderNames.Cookie)]
public ActionResult Index()
{
var list = LinksService.LoadEntities(l => l.Status == Status.Available, l => l.Recommend, false).ToList();
return CurrentUser.IsAdmin ? View("Index_Admin", list) : View(list);
}
///
/// 申请友链
///
///
///
public async Task Apply(Links links)
{
if (!links.Url.MatchUrl())
{
return ResultData(null, false, "添加失败!链接非法!");
}
var host = new Uri(links.Url).Host;
if (LinksService.Any(l => l.Url.Contains(host)))
{
return ResultData(null, false, "添加失败!检测到您的网站已经是本站的友情链接了!");
}
HttpClient.DefaultRequestHeaders.UserAgent.Add(ProductInfoHeaderValue.Parse("Mozilla/5.0"));
HttpClient.DefaultRequestHeaders.Referrer = new Uri(Request.Scheme + "://" + Request.Host.ToString());
return await await HttpClient.GetAsync(links.Url).ContinueWith(async t =>
{
if (t.IsFaulted || t.IsCanceled)
{
return ResultData(null, false, "添加失败!检测到您的网站疑似挂了,或者连接到你网站的时候超时,请检查下!");
}
var res = await t;
if (!res.IsSuccessStatusCode)
{
return ResultData(null, false, "添加失败!检测到您的网站疑似挂了!返回状态码为:" + res.StatusCode);
}
var s = await res.Content.ReadAsStringAsync();
if (!s.Contains(CommonHelper.SystemSettings["Domain"]))
{
return ResultData(null, false, $"添加失败!检测到您的网站上未将本站设置成友情链接,请先将本站主域名:{CommonHelper.SystemSettings["Domain"]}在您的网站设置为友情链接,并且能够展示后,再次尝试添加即可!");
}
var entry = LinksService.GetFirstEntity(l => l.Url.Equals(links.Url));
bool b;
if (entry is null)
{
b = LinksService.AddEntitySaved(links) != null;
}
else
{
entry.Url = links.Url;
entry.Except = links.Except;
entry.Name = links.Name;
entry.Recommend = links.Recommend;
b = LinksService.UpdateEntitySaved(entry);
}
return ResultData(null, b, b ? "添加成功!这可能有一定的延迟,如果没有看到您的链接,请稍等几分钟后刷新页面即可,如有疑问,请联系站长。" : "添加失败!这可能是由于网站服务器内部发生了错误,如有疑问,请联系站长。");
});
}
///
/// 添加友链
///
///
///
[Authority]
public ActionResult Add(Links links)
{
var entry = LinksService.GetById(links.Id);
bool b;
if (entry is null)
{
b = LinksService.AddEntitySaved(links) != null;
}
else
{
entry.Url = links.Url;
entry.Except = links.Except;
entry.Name = links.Name;
entry.Recommend = links.Recommend;
b = LinksService.UpdateEntitySaved(entry);
}
return b ? ResultData(null, message: "添加成功!") : ResultData(null, false, "添加失败!");
}
///
/// 检测回链
///
///
///
[Authority]
public async Task Check(string link)
{
HttpClient.DefaultRequestHeaders.UserAgent.Add(ProductInfoHeaderValue.Parse("Mozilla/5.0"));
return await await HttpClient.GetAsync(link).ContinueWith(async t =>
{
if (t.IsFaulted || t.IsCanceled)
{
return ResultData(null, false, link + " 似乎挂了!");
}
var res = await t;
if (!res.IsSuccessStatusCode)
{
return ResultData(null, false, link + " 对方网站返回错误的状态码!http响应码为:" + res.StatusCode);
}
var s = await res.Content.ReadAsStringAsync();
if (s.Contains(CommonHelper.SystemSettings["Domain"]))
{
return ResultData(null, true, "友情链接正常!");
}
return ResultData(null, false, link + " 对方似乎没有本站的友情链接!");
});
}
///
/// 删除友链
///
///
///
[Authority]
public ActionResult Delete(int id)
{
bool b = LinksService.DeleteByIdSaved(id);
return ResultData(null, b, b ? "删除成功!" : "删除失败!");
}
///
/// 编辑友链
///
///
///
[Authority]
public ActionResult Edit(Links model)
{
Links links = LinksService.GetById(model.Id);
links.Name = model.Name;
links.Url = model.Url;
bool b = LinksService.UpdateEntitySaved(links);
return ResultData(null, b, b ? "保存成功" : "保存失败");
}
///
/// 所有的友情链接
///
///
[Authority]
public ActionResult Get()
{
List list = LinksService.GetAll().OrderBy(p => p.Status).ThenByDescending(p => p.Recommend).ThenByDescending(p => p.Id).ToList();
return ResultData(list);
}
///
/// 切换友情链接的白名单状态
///
///
///
///
[HttpPost]
public ActionResult ToggleWhitelist(int id, bool state)
{
Links link = LinksService.GetById(id);
link.Except = !state;
bool b = LinksService.UpdateEntitySaved(link);
return ResultData(null, b, b ? "切换成功!" : "切换失败!");
}
///
/// 切换友情链接的推荐状态
///
///
///
///
[HttpPost]
public ActionResult ToggleRecommend(int id, bool state)
{
Links link = LinksService.GetById(id);
link.Recommend = !state;
bool b = LinksService.UpdateEntitySaved(link);
return ResultData(null, b, b ? "切换成功!" : "切换失败!");
}
///
/// 切换友情链接可用状态
///
///
///
///
[HttpPost]
public ActionResult Toggle(int id, bool state)
{
Links link = LinksService.GetById(id);
link.Status = !state ? Status.Available : Status.Unavailable;
bool b = LinksService.UpdateEntitySaved(link);
return ResultData(null, b, b ? "切换成功!" : "切换失败!");
}
}
}