using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.IRepository;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Nito.AsyncEx;
namespace CoreCms.Net.Web.WebApi.Controllers
{
///
/// 签到控制器
///
[Route("api/[controller]/[action]")]
[ApiController]
public class CheckInController : ControllerBase
{
private readonly ICoreCmsUserCheckInDetailsServices _userCheckInDetailsServices;
private readonly IHttpContextUser _user;
//简单的异步锁
private readonly AsyncLock _mutex = new AsyncLock();
///
/// 构造函数
///
public CheckInController(IHttpContextUser user, ICoreCmsUserCheckInDetailsServices userCheckInDetailsServices)
{
_user = user;
_userCheckInDetailsServices = userCheckInDetailsServices;
}
///
/// 用户签到
///
///
[HttpPost]
[Authorize]
public async Task DoUserCheckIn([FromBody] FMDoUserCheckIn entity)
{
using (await _mutex.LockAsync())
{
var jm = new WebApiCallBack();
var isHave = await _userCheckInDetailsServices.ExistsAsync(p => p.userId == _user.ID && p.checkInData == entity.date);
if (isHave)
{
jm.msg = "今日您已签到";
return jm;
}
var detail = new CoreCmsUserCheckInDetails
{
userId = _user.ID,
checkInData = entity.date,
createTime = DateTime.Now
};
var callBack = await _userCheckInDetailsServices.DoCheckIn(detail);
jm.status = callBack.code == 0;
jm.msg = callBack.msg;
jm.data = callBack.data;
return jm;
}
}
///
/// 获取用户总签到次数
///
///
[HttpPost]
[Authorize]
public async Task GetUserCheckCount()
{
var jm = new WebApiCallBack
{
status = true,
data = await _userCheckInDetailsServices.GetCountAsync(p => p.userId == _user.ID),
msg = "获取成功"
};
return jm;
}
///
/// 获取用户按月签到数据
///
///
[HttpPost]
[Authorize]
public async Task GetUserCheckByMonth([FromBody] FMGetUserCheckInByMonth entity)
{
var jm = new WebApiCallBack();
var dt = new DateTime(entity.year, entity.month, 1);
var min = dt.AddDays(-1);
var max = dt.AddMonths(1);
var list = await _userCheckInDetailsServices.QueryListByClauseAsync(p => p.userId == _user.ID && p.checkInData > min && p.checkInData < max);
var stringArr = new List();
foreach (var item in list)
{
var stringStr = item.checkInData.ToString("yyyy-MM-dd");
stringArr.Add(stringStr);
}
jm.status = true;
jm.data = stringArr;
jm.msg = "获取成功";
return jm;
}
}
}