using JiebaNet.Segmenter.Common;
using Masuit.LuceneEFCore.SearchEngine.Linq;
using Masuit.MyBlogs.Core.Common;
using Masuit.MyBlogs.Core.Extensions;
using Masuit.MyBlogs.Core.Infrastructure.Repository;
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.MyBlogs.Core.Models.ViewModel;
using Masuit.Tools.Core.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
namespace Masuit.MyBlogs.Core.Controllers
{
[Route("partner/[action]")]
public class AdvertisementController : BaseController
{
public ICategoryService CategoryService { get; set; }
///
/// 前往
///
/// 广告id
///
[HttpGet("{id:int}"), ResponseCache(Duration = 3600)]
public async Task Redirect(int id)
{
var ad = await AdsService.GetByIdAsync(id) ?? throw new NotFoundException("推广链接不存在");
if (!HttpContext.Request.IsRobot() && string.IsNullOrEmpty(HttpContext.Session.Get("ads" + id)))
{
HttpContext.Session.Set("ads" + id, id.ToString());
ad.ViewCount++;
await AdsService.SaveChangesAsync();
}
return Redirect(ad.Url);
}
///
/// 获取分页
///
///
[MyAuthorize]
public async Task GetPageData([Range(1, int.MaxValue, ErrorMessage = "页数必须大于0")] int page = 1, [Range(1, int.MaxValue, ErrorMessage = "页大小必须大于0")] int size = 10, string kw = "")
{
Expression> where = p => true;
if (!string.IsNullOrEmpty(kw))
{
where = where.And(p => p.Title.Contains(kw) || p.Description.Contains(kw));
}
var list = AdsService.GetQuery(where).OrderByDescending(p => p.Status == Status.Available).ThenByDescending(a => a.Price).ToPagedList(page, size, MapperConfig);
var cids = list.Data.Where(m => !string.IsNullOrEmpty(m.CategoryIds)).SelectMany(m => m.CategoryIds.Split(",", StringSplitOptions.RemoveEmptyEntries).Select(int.Parse)).Distinct().ToArray();
var dic = await CategoryService.GetQuery(c => cids.Contains(c.Id)).ToDictionaryAsync(c => c.Id + "", c => c.Name);
foreach (var ad in list.Data.Where(ad => !string.IsNullOrEmpty(ad.CategoryIds)))
{
ad.CategoryNames = ad.CategoryIds.Split(",").Select(c => dic.GetValueOrDefault(c)).Join(",");
ad.CreateTime = ad.CreateTime.ToTimeZone(HttpContext.Session.Get(SessionKey.TimeZone));
ad.UpdateTime = ad.UpdateTime.ToTimeZone(HttpContext.Session.Get(SessionKey.TimeZone));
}
return Ok(list);
}
///
/// 保存banner
///
///
///
[HttpPost, MyAuthorize]
public async Task Save(AdvertisementDto model)
{
model.CategoryIds = model.CategoryIds?.Replace("null", "");
var b = await AdsService.AddOrUpdateSavedAsync(a => a.Id, model.Mapper()) > 0;
return ResultData(null, b, b ? "保存成功" : "保存失败");
}
///
/// 删除banner
///
///
///
[HttpPost("{id}"), HttpGet("{id}"), MyAuthorize]
public async Task Delete(int id)
{
bool b = await AdsService.DeleteByIdSavedAsync(id) > 0;
return ResultData(null, b, b ? "删除成功" : "删除失败");
}
///
/// 禁用或开启文章评论
///
/// 文章id
///
[MyAuthorize, HttpPost("{id}")]
public async Task ChangeState(int id)
{
var ad = await AdsService.GetByIdAsync(id) ?? throw new NotFoundException("广告不存在!");
ad.Status = ad.Status == Status.Available ? Status.Unavailable : Status.Available;
return ResultData(null, await AdsService.SaveChangesAsync() > 0, ad.Status == Status.Available ? $"【{ad.Title}】已上架!" : $"【{ad.Title}】已下架!");
}
}
}