using JNPF.Common.Const;
using JNPF.Common.Core.Manager;
using JNPF.Common.Extension;
using JNPF.Common.Filter;
using JNPF.Common.Manager;
using JNPF.Common.Models.User;
using JNPF.DependencyInjection;
using JNPF.DynamicApiController;
using JNPF.Message.Entitys.Dto.IM;
using JNPF.Message.Interfaces;
using JNPF.Systems.Entitys.Dto.OnlineUser;
using Mapster;
using Microsoft.AspNetCore.Mvc;
namespace JNPF.Systems;
///
/// 业务实现:在线用户.
///
[ApiDescriptionSettings(Tag = "System", Name = "OnlineUser", Order = 176)]
[Route("api/system/[controller]")]
public class OnlineUserService : IDynamicApiController, ITransient
{
///
/// IM回应服务.
///
private readonly IImReplyService _imReplyService;
///
/// 缓存管理器.
///
private readonly ICacheManager _cacheManager;
///
/// 用户管理.
///
private readonly IUserManager _userManager;
///
/// 初始化一个类型的新实例.
///
public OnlineUserService(
IImReplyService imReplyService,
ICacheManager cacheManager,
IUserManager userManager)
{
_imReplyService = imReplyService;
_cacheManager = cacheManager;
_userManager = userManager;
}
///
/// 获取在线用户列表.
///
/// 参数.
///
[HttpGet("")]
public async Task GetList([FromQuery] KeywordInput input)
{
var tenantId = _userManager.TenantId;
var userOnlineList = new List();
var onlineKey = string.Format("{0}{1}", CommonConst.CACHEKEYONLINEUSER, tenantId);
if (_cacheManager.Exists(onlineKey))
{
userOnlineList = await GetOnlineUserList(tenantId);
if (!input.keyword.IsNullOrEmpty())
userOnlineList = userOnlineList.FindAll(x => x.userName.Contains(input.keyword));
}
return userOnlineList.Adapt>();
}
///
/// 强制下线.
///
///
[HttpDelete("{id}")]
public async Task ForcedOffline(string id)
{
var tenantId = _userManager.TenantId;
var list = await GetOnlineUserList(tenantId);
if (list == null)
return;
var user = list.Find(it => it.tenantId == tenantId && it.userId == id);
if (user != null)
{
_imReplyService.ForcedOffline(user.connectionId);
await DelOnlineUser(tenantId, user.userId);
await DelUserInfo(tenantId, user.userId);
}
}
///
/// 批量下线在线用户.
///
///
/// 下线用户信息.
[HttpDelete("")]
public async Task Clear(string id, [FromBody] BatchOnlineInput input)
{
var tenantId = _userManager.TenantId;
var list = await GetOnlineUserList(tenantId);
var userList = list.FindAll(it => it.tenantId == tenantId && input.ids.Contains(it.userId));
userList.ForEach(async item =>
{
_imReplyService.ForcedOffline(item.connectionId);
await DelOnlineUser(tenantId, item.userId);
await DelUserInfo(tenantId, item.userId);
});
}
///
/// 获取在线用户列表.
///
/// 租户ID.
///
public async Task> GetOnlineUserList(string tenantId)
{
var cacheKey = string.Format("{0}{1}", CommonConst.CACHEKEYONLINEUSER, tenantId);
return await _cacheManager.GetAsync>(cacheKey);
}
///
/// 删除在线用户ID.
///
/// 租户ID.
/// 用户ID.
///
public 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.
///
public async Task DelUserInfo(string tenantId, string userId)
{
var cacheKey = string.Format("{0}:{1}:{2}", tenantId, CommonConst.CACHEKEYUSER, userId);
return await _cacheManager.DelAsync(cacheKey);
}
}