Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        // 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);
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        //[Authorize]
        public ActionResult <List <SearchInfoResponse> > getDirectorySearcher(SearchInfoRequest se)
        {
            var result = everisLdapRepository.getDirectorySearcher(se);

            return(Ok(result));
        }