/// <summary> /// find <typeparamref name="TContact"/> by <paramref name="query"/> /// </summary> /// <param name="query"></param> /// <returns></returns> public async Task <TContact?> Find([DisallowNull] ContactQueryFilter query) { if (Logger.IsEnabled(LogLevel.Trace)) { Logger.LogTrace($"find({JsonConvert.SerializeObject(query)})"); } var contactList = await FindAll(query); if (contactList.Count > 1) { Logger.LogWarning($"find() got more than one({contactList.Count}) result"); } var index = 0; foreach (var contact in contactList) { var valid = await Puppet.ContactValidate(contact.Id); if (valid) { if (Logger.IsEnabled(LogLevel.Trace)) { Logger.LogTrace($"find() confirm contact[{index}] with id={contact.Id} is valid result, return it."); } } else { if (Logger.IsEnabled(LogLevel.Trace)) { Logger.LogTrace($"find() confirm contact[{index}] with id={contact.Id} is INVALID result, try next"); } } if (valid) { await contact.Ready(true); return(contact); } index++; } Logger.LogWarning($"find() got {contactList.Count} contacts but no one is valid."); return(null); }