private bool EnrichAccountData(Guid accountId, SearchInfoRequest requestBody) { var request = _restClient.CreateJsonRequest(SearchMethodName, requestBody); IRestResponse response; try { response = _restClient.Post(request); } catch (Exception ex) { throw new HttpException((int)HttpStatusCode.InternalServerError, ex.Message); } HandleRestClientError(response); SearchInfoResponse responseInfo = ServiceStackTextHelper.Deserialize <SearchInfoResponse>(response.Content); if (responseInfo.Status == "error") { throw new HttpException((int)HttpStatusCode.InternalServerError, responseInfo.Message); } if (responseInfo.CommunicationInfo == null) { var message = $"CommunicationInfo is null. StatusCode = '{response.StatusCode}' " + $"ResponseStatus = '{response.ResponseStatus}' ErrorMessage = '{response.ErrorMessage}' " + $"Content: {response.Content}"; throw new HttpException((int)HttpStatusCode.InternalServerError, message); } bool result = UpdateEnrichedData(accountId, responseInfo.CommunicationInfo); return(result); }
private SearchInfoRequest PrepareEnrichmentRequest() { string serviceUrl; string apiKey; GetRequiredParameters(out serviceUrl, out apiKey); #if NETFRAMEWORK _restClient.BaseUrl = serviceUrl; #else _restClient.BaseUrl = new Uri(serviceUrl); #endif _restClient.AddDefaultHeader("ApiKey", apiKey); int maxSocialLinksCount = SysSettings.GetValue(UserConnection, "EnrichmentSocialLinksLimit", 3); int maxPhoneNumbersCount = SysSettings.GetValue(UserConnection, "EnrichmentPhoneNumbersLimit", 3); int maxEmailsCount = SysSettings.GetValue(UserConnection, "EnrichmentEmailsLimit", 3); var requestBody = new SearchInfoRequest { ApiKey = apiKey, Config = new SearchInfoConfiguration { MaxSocialLinksCount = maxSocialLinksCount, MaxPhoneNumberCount = maxPhoneNumbersCount, MaxEmailsCount = maxEmailsCount } }; return(requestBody); }
// Esta es la versión más eficiente para buscar empleados de Everis por // nombre corto (= SamAccountName en AD). // ó nombre completo (= DisplayName en AD). // Por eficiencia se propone mutilar a n resultados. // Es el parametro pageSize por defecto a 5. // Devuelve en un directorio la fotos que cumplen el patrón // con el nombre corto.jpg public List <SearchInfoResponse> getDirectorySearcher(SearchInfoRequest se) { List <SearchInfoResponse> result = new List <SearchInfoResponse>(); DirectorySearcher searcher = new DirectorySearcher(); // Esta es la manera de mutilar el número de resultados. searcher.SearchRoot = new DirectoryEntry("LDAP://OU=Spain,OU=Europe,OU=Everis,DC=usersad,DC=everis,DC=int"); searcher.SizeLimit = se.pagesize; // Desactivamos el timeout. En principio no sería necesario. searcher.ClientTimeout = TimeSpan.FromSeconds(-1); // A continuación el patrón. // Con userAccountControl controlamos que el usuario esté enable (ver método anterior) // Se permite * para subcadenas. //searcher.Filter = string.Format("(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(DisplayName=*{0}*)(SamAccountName=*{0}*)))",se.stringSearch); searcher.Filter = string.Format("(|(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(DisplayName=*{0}*))(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(SamAccountName=*{0}*)))", se.stringSearch); // Por eficiencia indicamos los parámetros a recuperar. // Esto mejora el tiempo searcher.PropertiesToLoad.Add("SamAccountName"); searcher.PropertiesToLoad.Add("thumbnailPhoto"); searcher.PropertiesToLoad.Add("displayName"); searcher.PropertiesToLoad.Add("employeeNumber"); searcher.PropertiesToLoad.Add("title"); using (SearchResultCollection results = searcher.FindAll()) { foreach (SearchResult domainUsers in results) { DirectoryEntry user = domainUsers.GetDirectoryEntry(); if (user != null) { // Cacheamos por el nombre corto que puede constituir // una clave primeria. Con esto conseguimos más eficiencia. user.RefreshCache(new string[] { "SamAccountName" }); SearchInfoResponse elem = new SearchInfoResponse(); // Extraemos el nombre corto y la foto. elem.shortName = user.Properties["SamAccountName"][0].ToString(); elem.longName = user.Properties["displayName"][0].ToString(); elem.numEmployee = (long)Convert.ToInt64(user.Properties["employeeNumber"][0].ToString()); elem.title = user.Properties["title"][0].ToString(); var photoP = user.Properties["thumbnailPhoto"].Value; // Como ejemplo del método las salvamos en un directorio. // quizás se deberían devolver de forma rest. if (photoP != null) { elem.photo = (byte[])photoP; /* * Bitmap photo = new Bitmap(new MemoryStream(photoInBytes)); * photo.Save(String.Format("./fotos1/{0}.jpg",samAccountName),ImageFormat.Jpeg); */ } result.Add(elem); } } } return(result); }
public SearchAccountInfoResult SearchAccountInfo(Guid accountId) { bool success = false; SearchInfoRequest requestBody = PrepareEnrichmentRequest(); var enoughDataToRequest = SetupAccountData(accountId, requestBody); if (enoughDataToRequest) { success = EnrichAccountData(accountId, requestBody); } var result = new SearchAccountInfoResult { IsSuccessSearch = success, IsEnoughDataForEnrichment = enoughDataToRequest }; return(result); }
private bool EnrichAccountData(Guid accountId, SearchInfoRequest requestBody) { var request = new RestRequest { Method = Method.POST, RequestFormat = DataFormat.Json }; request.JsonSerializer = new NewtonsoftBasedSerializer(); request.AddBody(requestBody); request.Resource = SearchMethodName; IRestResponse response; try { response = _restClient.Post(request); } catch (Exception ex) { throw new HttpException((int)HttpStatusCode.InternalServerError, ex.Message); } HandleRestClientError(response); SearchInfoResponse responseInfo = ServiceStack.Text.JsonSerializer.DeserializeFromString <SearchInfoResponse>(response.Content); if (responseInfo.Status == "error") { throw new HttpException((int)HttpStatusCode.InternalServerError, responseInfo.Message); } if (responseInfo.CommunicationInfo == null) { var message = $"CommunicationInfo is null. StatusCode = '{response.StatusCode}' " + $"ResponseStatus = '{response.ResponseStatus}' ErrorMessage = '{response.ErrorMessage}' " + $"Content: {response.Content}"; throw new HttpException((int)HttpStatusCode.InternalServerError, message); } bool result = UpdateEnrichedData(accountId, responseInfo.CommunicationInfo); return(result); }
private bool SetupAccountData(Guid accountId, SearchInfoRequest targetRequest) { var schema = UserConnection.EntitySchemaManager.GetInstanceByName("Account"); var esq = new EntitySchemaQuery(schema); var accountColumn = esq.AddColumn("Name"); var mainContactEmailColumn = esq.AddColumn("PrimaryContact.Email"); var numberColumn = esq.AddColumn("[AccountCommunication:Account:Id].Number"); var commTypeColumn = esq.AddColumn("[AccountCommunication:Account:Id].CommunicationType"); var accountIdFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Id", accountId); esq.Filters.Add(accountIdFilter); var commTypeGroup = new EntitySchemaQueryFilterCollection(esq, LogicalOperationStrict.Or); commTypeGroup.Add(esq.CreateIsNullFilter("[AccountCommunication:Account:Id].CommunicationType")); var commTypeFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "[AccountCommunication:Account:Id].CommunicationType", CommunicationTypeConsts.WebId, CommunicationTypeConsts.EmailId); commTypeGroup.Add(commTypeFilter); esq.Filters.Add(commTypeGroup); var list = esq.GetEntityCollection(UserConnection); string accountName = string.Empty; string primaryContactEmail = string.Empty; var urls = new List <string>(); var emails = new List <string>(); var webCommunicationTypeId = new Guid(CommunicationTypeConsts.WebId); foreach (var item in list) { if (string.IsNullOrEmpty(accountName)) { accountName = item.GetTypedColumnValue <string>(accountColumn.Name); } if (string.IsNullOrEmpty(primaryContactEmail)) { primaryContactEmail = item.GetTypedColumnValue <string>(mainContactEmailColumn.Name); } var value = item.GetTypedColumnValue <string>(numberColumn.Name); if (string.IsNullOrEmpty(value)) { continue; } if (item.GetTypedColumnValue <Guid>(commTypeColumn.Name + "Id") == webCommunicationTypeId) { if (!IsSocialLink(value)) { urls.Add(value); } } else { emails.Add(value); } } if (urls.Count == 0 && emails.Count == 0 && primaryContactEmail.IsNotNullOrEmpty()) { emails.Add(primaryContactEmail); } targetRequest.Name = accountName; targetRequest.Urls = urls; targetRequest.Emails = emails; return(targetRequest.Urls.Count > 0 || targetRequest.Emails.Count > 0); }
//[Authorize] public ActionResult <List <SearchInfoResponse> > getDirectorySearcher(SearchInfoRequest se) { var result = everisLdapRepository.getDirectorySearcher(se); return(Ok(result)); }