diff --git a/src/CAServer.Application.Contracts/Contacts/Dtos/CreateUpdateContactDto.cs b/src/CAServer.Application.Contracts/Contacts/Dtos/CreateUpdateContactDto.cs index 6816b54c1..a5840d865 100644 --- a/src/CAServer.Application.Contracts/Contacts/Dtos/CreateUpdateContactDto.cs +++ b/src/CAServer.Application.Contracts/Contacts/Dtos/CreateUpdateContactDto.cs @@ -20,20 +20,5 @@ public IEnumerable<ValidationResult> Validate(ValidationContext validationContex { yield return new ValidationResult("Invalid input."); } - - if (!RelationId.IsNullOrWhiteSpace()) - { - if (Addresses is { Count: > 0 }) - { - yield return new ValidationResult("Invalid input."); - } - } - else - { - if (Addresses?.Count != 1) - { - yield return new ValidationResult("Invalid input."); - } - } } } \ No newline at end of file diff --git a/src/CAServer.Application/Contacts/ContactAppService.cs b/src/CAServer.Application/Contacts/ContactAppService.cs index 27b4d0a02..ac3a26106 100644 --- a/src/CAServer.Application/Contacts/ContactAppService.cs +++ b/src/CAServer.Application/Contacts/ContactAppService.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using AElf; using AElf.Types; using CAServer.Common; using CAServer.Commons; @@ -123,6 +124,23 @@ public async Task<ContactResultDto> UpdateAsync(Guid id, CreateUpdateContactDto } var contact = contactResult.Data; + if (contact.Addresses?.Count > 1) + { + contact.Addresses.ForEach(t => + { + var validResult = ValidAddress(t.Address); + if (!validResult) + { + throw new UserFriendlyException("invalid address."); + } + }); + + var dto = ObjectMapper.Map<ContactGrainDto, ContactDto>(contact); + dto.Addresses = input.Addresses; + dto.Name = input.Name; + return await UpdateContactAsync(id, userId, dto); + } + if (contact.Addresses != null && contact.Addresses.Count > 1 && input.Addresses != null && input.Addresses.Count == 1) { @@ -145,17 +163,41 @@ public async Task<ContactResultDto> UpdateAsync(Guid id, CreateUpdateContactDto var contactDto = await GetContactDtoAsync(input, id); await CheckContactAsync(contactDto); + return await UpdateContactAsync(id, userId, contactDto); + } + + private bool ValidAddress(string address) + { + try + { + var isValid = AddressHelper.VerifyFormattedAddress(address); + if (!isValid) + { + Logger.LogInformation("invalid address: {address}", address); + } + + return isValid; + } + catch (Exception e) + { + Logger.LogError(e, "valid address error", address); + return false; + } + } + + private async Task<ContactResultDto> UpdateContactAsync(Guid contactId, Guid userId, ContactDto contactDto) + { + var contactGrain = _clusterClient.GetGrain<IContactGrain>(contactId); var result = await contactGrain.UpdateContactAsync(userId, ObjectMapper.Map<ContactDto, ContactGrainDto>(contactDto)); + if (!result.Success) { throw new UserFriendlyException(result.Message); } await _distributedEventBus.PublishAsync(ObjectMapper.Map<ContactGrainDto, ContactUpdateEto>(result.Data)); - // return ObjectMapper.Map<ContactGrainDto, ContactResultDto>(result.Data); - var contactResultDto = ObjectMapper.Map<ContactGrainDto, ContactResultDto>(result.Data); var imageMap = _variablesOptions.ImageMap; @@ -168,9 +210,9 @@ await contactGrain.UpdateContactAsync(userId, contactAddressDto.Image = imageMap.GetOrDefault(contactAddressDto.ChainName); } - if (contact.Name != input.Name) + if (contactResultDto.ImInfo != null && !contactResultDto.ImInfo.RelationId.IsNullOrEmpty()) { - await ImRemarkAsync(contactResultDto?.ImInfo?.RelationId, userId, input.Name); + contactResultDto.ImInfo.RelationId = string.Empty; } return contactResultDto;