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(m)); } } }