using JNPF.Common.Const;
using JNPF.Common.Core.Manager;
using JNPF.Common.Enums;
using JNPF.Common.Filter;
using JNPF.Common.Manager;
using JNPF.Common.Models.User;
using JNPF.DependencyInjection;
using JNPF.DynamicApiController;
using JNPF.FriendlyException;
using JNPF.Message.Interfaces;
using JNPF.Systems.Entitys.Dto.SysCache;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace JNPF.Systems;
///
/// 缓存管理
/// 版 本:V3.2
/// 版 权:拓通智联科技有限公司(http://www.tuotong-tech.com)
/// 日 期:2021-06-01.
///
[ApiDescriptionSettings(Tag = "System", Name = "CacheManage", Order = 100)]
[Route("api/system/[controller]")]
public class SysCacheService : IDynamicApiController, ITransient
{
///
/// IM消息中心服务.
///
private readonly IImReplyService _imReplyService;
///
/// 缓存管理器.
///
private readonly ICacheManager _cacheManager;
///
/// 用户管理.
///
private readonly IUserManager _userManager;
private readonly IHttpContextAccessor _httpContextAccessor;
///
/// 初始化一个类型的新实例.
///
public SysCacheService(
ICacheManager cacheManager,
IHttpContextAccessor httpContextAccessor,
IUserManager userManager,
IImReplyService imReplyService)
{
_imReplyService = imReplyService;
_cacheManager = cacheManager;
_userManager = userManager;
_httpContextAccessor = httpContextAccessor;
}
#region GET
///
/// 列表.
///
/// 请求参数.
///
[HttpGet("")]
public async Task GetList([FromQuery] KeywordInput input)
{
var tenantId = _userManager.TenantId;
var keys = _cacheManager.GetAllCacheKeys().FindAll(q => q.Contains(tenantId));
var output = new List();
foreach (var key in keys)
{
var model = new CacheListOutput();
model.name = key;
model.overdueTime = _cacheManager.GetCacheOutTime(model.name);
model.cacheSize = await RedisHelper.StrLenAsync(key);
output.Add(model);
}
if (!string.IsNullOrEmpty(input.keyword))
output = output.FindAll(x => x.name.Contains(input.keyword));
return new { list = output.OrderBy(o => o.overdueTime) };
}
///
/// 信息.
///
/// 缓存名称.
[HttpGet("{name}")]
public async Task GetInfo(string name)
{
var strJson = await _cacheManager.GetAsync(name);
var cacheInfoOutput = new CacheInfoOutput();
cacheInfoOutput.name = name;
cacheInfoOutput.value = strJson;
return cacheInfoOutput;
}
#endregion
#region POST
///
/// 清空单个缓存.
///
/// name.
///
[HttpDelete("{name}")]
public async Task Clear(string name)
{
if (!await _cacheManager.DelAsync(name))
throw Oops.Oh(ErrorCode.D1700);
}
///
/// 清空所有缓存.
///
///
[HttpPost("Actions/ClearAll")]
public async Task ClearAll()
{
var tenantId = _userManager.TenantId;
var httpContext = _httpContextAccessor.HttpContext;
httpContext.SignoutToSwagger();
// 清除IM中的webSocket
var list = await GetOnlineUserList(tenantId);
var user = list.Find(it => it.tenantId == tenantId && it.userId == _userManager.UserId);
if (user != null)
{
_imReplyService.ForcedOffline(user.connectionId);
await DelOnlineUser(tenantId, user.userId);
await DelUserInfo(tenantId, user.userId);
}
var keys = _cacheManager.GetAllCacheKeys().FindAll(q => q.Contains(tenantId));
var isOk = await _cacheManager.DelAsync(keys.ToArray());
if (!isOk)
throw Oops.Oh(ErrorCode.D1700);
}
#endregion
///
/// 获取在线用户列表.
///
/// 租户ID.
///
private async Task> GetOnlineUserList(string tenantId)
{
var cacheKey = string.Format("{0}{1}", CommonConst.CACHEKEYONLINEUSER, tenantId);
return await _cacheManager.GetAsync>(cacheKey);
}
///
/// 删除在线用户ID.
///
/// 租户ID.
/// 用户ID.
///
private async Task DelOnlineUser(string tenantId, string userId)
{
var cacheKey = string.Format("{0}{1}", CommonConst.CACHEKEYONLINEUSER, tenantId);
var list = await _cacheManager.GetAsync>(cacheKey);
var online = list.Find(it => it.userId == userId);
list.RemoveAll((x) => x.connectionId == online.connectionId);
return await _cacheManager.SetAsync(cacheKey, list);
}
///
/// 删除用户登录信息缓存.
///
/// 租户ID.
/// 用户ID.
///
private async Task DelUserInfo(string tenantId, string userId)
{
var cacheKey = string.Format("{0}:{1}:{2}", tenantId, CommonConst.CACHEKEYUSER, userId);
return await _cacheManager.DelAsync(cacheKey);
}
}