public async Task <ICacheableDataDigest> SetAvatarAsync(long userId, ByteData avatar) { if (avatar is null) { throw new ArgumentNullException(nameof(avatar)); } await _imageService.ValidateAsync(avatar.Data, avatar.ContentType, true); await _basicUserService.ThrowIfUserNotExist(userId); var entity = await _database.UserAvatars.Where(a => a.UserId == userId).SingleOrDefaultAsync(); await using var transaction = await _database.Database.BeginTransactionAsync(); var tag = await _dataManager.RetainEntryAsync(avatar.Data); var now = _clock.GetCurrentTime(); if (entity is null) { var newEntity = new UserAvatarEntity { DataTag = tag, Type = avatar.ContentType, LastModified = now, UserId = userId }; _database.Add(newEntity); } else { if (entity.DataTag is not null) { await _dataManager.FreeEntryAsync(entity.DataTag); } entity.DataTag = tag; entity.Type = avatar.ContentType; entity.LastModified = now; } await _database.SaveChangesAsync(); await transaction.CommitAsync(); _logger.LogInformation(Resource.LogSetAvatar, userId); return(new CacheableDataDigest(tag, now)); }
public async Task <IResult> SetAvatarAsync(long userId, BinaryFile avatar) { var user = await _userRepository.FirstOrDefaultAsync(u => u.Id == userId); var newAvatar = new UserAvatarEntity { Filename = avatar.Name, Avatar = avatar.Bytes }; await _userAvatarRepository.DeleteAsync(avatar => avatar.UserId == userId); user.Avatar = newAvatar; await _userRepository.UpdateAsync(user.Id, user); await _unitOfWork.SaveChangesAsync(); return(Result.Success()); }