using AutoMapper;
using Kean.Application.Query.Interfaces;
using Kean.Application.Query.ViewModels;
using Kean.Infrastructure.Database;
using Kean.Infrastructure.Database.Repository.Default;
using Kean.Infrastructure.Database.Repository.Default.Entities;
using Kean.Infrastructure.NoSql.Repository.Default;
using Kean.Infrastructure.Utilities;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Kean.Application.Query.Implements
{
///
/// 身份查询服务实现
///
public class IdentityService : IIdentityService
{
private readonly IMapper _mapper; // 模型映射
private readonly IDefaultDb _database; // 默认数据库
private readonly IDefaultRedis _redis; // 默认 Redis
///
/// 依赖注入
///
public IdentityService(
IMapper mapper,
IDefaultDb database,
IDefaultRedis redis)
{
_mapper = mapper;
_database = database;
_redis = redis;
}
/*
* 实现 Kean.Application.Query.Interfaces.IIdentityService.GetUser(int id) 方法
*/
public async Task GetUser(int id)
{
if (await _redis.Hash[$"identity:{id}"].Get("tag") == "super")
{
var super = await _redis.Hash["param"].Get("super_user");
if (super != null)
{
return _mapper.Map(JsonHelper.Deserialize(super));
}
}
return _mapper.Map(await _database.From()
.Where(u => u.USER_ID == id)
.Single());
}
/*
* 实现 Kean.Application.Query.Interfaces.IIdentityService.GetMenu(int id) 方法
*/
public async Task> GetMenu(int id)
{
var menu = await _database.From()
.OrderBy(m => m.MENU_ORDER, Infrastructure.Database.Order.Ascending)
.OrderBy(m => m.MENU_ID, Infrastructure.Database.Order.Ascending)
.Where(m => m.MENU_FLAG == true)
.Select();
if (await _redis.Hash[$"identity:{id}"].Get("tag") == "super")
{
return _mapper.Map>(menu);
}
var permission = await _database.From()
.Join(Join.Inner, (rm, ur) => rm.ROLE_ID == ur.ROLE_ID && ur.USER_ID == id)
.Distinct()
.Select((rm, _) => new { rm.MENU_ID });
return menu.Join(permission,
m => m.MENU_ID,
p => p.MENU_ID,
(m, _) => _mapper.Map