using AutoMapper; using IM_API.Dtos.User; using IM_API.Exceptions; using IM_API.Interface.Services; using IM_API.Models; using IM_API.Tools; using Microsoft.EntityFrameworkCore; using StackExchange.Redis; namespace IM_API.Services { public class UserService : IUserService { private readonly ImContext _context; private readonly ILogger _logger; private readonly IMapper _mapper; private readonly ICacheService _cacheService; public UserService(ImContext imContext,ILogger logger,IMapper mapper, ICacheService cacheService) { this._context = imContext; this._logger = logger; this._mapper = mapper; _cacheService = cacheService; } #region 获取用户信息 public async Task GetUserInfoAsync(int userId) { //查询redis缓存,如果存在直接返回不走查库逻辑 var key = RedisKeys.GetUserinfoKey(userId.ToString()); var userinfoCache = await _cacheService.GetAsync(key); if (userinfoCache != null) return _mapper.Map(userinfoCache); //无缓存查库 var user = await _context.Users .FirstOrDefaultAsync(x => x.Id == userId); if (user == null) { throw new BaseException(CodeDefine.USER_NOT_FOUND); } await _cacheService.SetUserCacheAsync(user); return _mapper.Map(user); } #endregion #region 通过用户名获取用户信息 public async Task GetUserInfoByUsernameAsync(string username) { var userinfo = await _cacheService.GetUserCacheAsync(username); if (userinfo != null) return _mapper.Map(userinfo); var user = await _context.Users.FirstOrDefaultAsync(x => x.Username == username); if (user == null) { throw new BaseException(CodeDefine.USER_NOT_FOUND); } await _cacheService.SetUserCacheAsync(user); return _mapper.Map(user); } #endregion #region 重置用户密码 public async Task ResetPasswordAsync(int userId, string oldPassword, string password) { var user = await _context.Users.FirstOrDefaultAsync(x => x.Id == userId); if (user is null) throw new BaseException(CodeDefine.USER_NOT_FOUND); //验证原密码 if (user.Password != oldPassword) throw new BaseException(CodeDefine.PASSWORD_ERROR); user.Password = password; await _context.SaveChangesAsync(); return true; } #endregion #region 更新用户在线状态 public async Task UpdateOlineStatusAsync(int userId,UserOnlineStatus onlineStatus) { var user = await _context.Users.FirstOrDefaultAsync(x => x.Id == userId); if (user is null) throw new BaseException(CodeDefine.USER_NOT_FOUND); user.OnlineStatusEnum = onlineStatus; await _context.SaveChangesAsync(); return true; } #endregion #region 更新用户信息 public async Task UpdateUserAsync(int userId,UpdateUserDto dto) { var user = await _context.Users.FirstOrDefaultAsync(x => x.Id == userId); if (user is null) throw new BaseException(CodeDefine.USER_NOT_FOUND); _mapper.Map(dto,user); await _context.SaveChangesAsync(); await _cacheService.SetUserCacheAsync(user); return _mapper.Map(user); } #endregion } }