using AutoMapper; using GamificationService.Database.Repositories; using GamificationService.Exceptions.Services.ProfileService; using GamificationService.Models.Database; using GamificationService.Models.DTO; namespace GamificationService.Services.UsersProfile; public class UserProfileService : IUserProfileService { private readonly UnitOfWork _unitOfWork; # region Services private readonly ILogger _logger; private readonly IMapper _mapper; #endregion #region Constructor public UserProfileService(UnitOfWork unitOfWork, ILogger logger, IMapper mapper) { _unitOfWork = unitOfWork; _logger = logger; _mapper = mapper; } #endregion # region Methods public async Task AddUserProfile(long userId, UserProfileCreateDTO userProfile) { UserProfile userProfileEntity = _mapper.Map(userProfile); userProfileEntity.UserId = userId; return _mapper.Map(await AddUserProfile(userProfileEntity)); } public async Task AddUserProfile(UserProfile userProfile) { UserProfile userProfileEntity = userProfile; // Make sure a user profile for the given user does not exist yet if (_unitOfWork.UserProfileRepository.Get(x => x.UserId == userProfile.UserId).Any()) { _logger.LogWarning("A user profile already exists for the given user id: {UserId}", userProfile.UserId); throw new ProfileExistsException($"{userProfile.UserId}"); } await _unitOfWork.UserProfileRepository.InsertAsync(userProfileEntity); if (await _unitOfWork.SaveAsync()) { _logger.LogInformation("User profile added for user id: {UserId}", userProfile.UserId); return userProfileEntity; } _logger.LogError("Failed to add user profile for user id: {UserId}", userProfile.UserId); throw new ProfileCreationException(); } public UserProfile? GetUserProfileByUserId(long id) { return _unitOfWork.UserProfileRepository.Get(x => x.UserId == id).FirstOrDefault(); } public UserProfile? GetUserProfileById(long id) { return _unitOfWork.UserProfileRepository.GetByID(id); } public async Task UpdateUserProfileByUserId(long userId, UserProfileCreateDTO userProfile) { var userProfileEntityUpdated = _mapper.Map(userProfile); var profile = _unitOfWork.UserProfileRepository .Get(x => x.UserId == userId).FirstOrDefault() ?? throw new ProfileNotFoundException($"{userId}"); userProfileEntityUpdated.Id = profile.Id; return await UpdateUserProfile(userProfileEntityUpdated); } public async Task UpdateUserProfile(UserProfile userProfile) { var userProfileEntityUpdated = userProfile; var userProfileEntity = await _unitOfWork.UserProfileRepository.GetByIDAsync(userProfileEntityUpdated.Id); if (userProfileEntity == null) { throw new ProfileNotFoundException($"{userProfileEntityUpdated.Id}"); } _mapper.Map(userProfileEntityUpdated, userProfileEntity); if (!await _unitOfWork.SaveAsync()) { throw new ProfileUpdateException($"Failed to update user profile {userProfileEntityUpdated.Id}"); } _logger.LogInformation("User profile updated for user id: {UserId}", userProfile.UserId); return true; } public bool DeleteUserProfile(long id) { var profile = _unitOfWork.UserProfileRepository.GetByID(id); if (profile == null) { throw new ProfileNotFoundException($"{id}"); } _unitOfWork.UserProfileRepository.Delete(id); if (_unitOfWork.Save()) { _logger.LogInformation("User profile deleted: {UserId}", id); return true; } throw new ProfileDeletionException($"Failed to delete user profile {id}"); } #endregion }