/// <summary>
        /// 本接口用于对一张待识别的商品图片,在指定图片库中检索出最相似的图片列表。
        /// </summary>
        /// <param name="req"><see cref="SearchImageRequest"/></param>
        /// <returns><see cref="SearchImageResponse"/></returns>
        public SearchImageResponse SearchImageSync(SearchImageRequest req)
        {
            JsonResponseModel <SearchImageResponse> rsp = null;

            try
            {
                var strResp = this.InternalRequestSync(req, "SearchImage");
                rsp = JsonConvert.DeserializeObject <JsonResponseModel <SearchImageResponse> >(strResp);
            }
            catch (JsonSerializationException e)
            {
                throw new TencentCloudSDKException(e.Message);
            }
            return(rsp.Response);
        }
Esempio n. 2
0
        public string Get(string username)
        {
            try
            {
                _logger.LogInformation($"Getting property details for {username} for image url {HttpContext.Request.Query["image"]}");
                var imgSearchReq = new SearchImageRequest {
                    org_image_url = HttpContext.Request.Query["image"]
                };
                var response = new Response();
                response.milestones.Add("Getting property details");

                try
                {
                    _logger.LogInformation("ORCHESTRATOR SERVICE: get all images from DB");
                    using (var sqlConn = new SqlConnection(DB_CONN))
                    {
                        sqlConn.Open();
                        var query = "SELECT Path from [dbo].[Image]";
                        using (SqlCommand cmd = new SqlCommand(query, sqlConn))
                        {
                            using (var reader = cmd.ExecuteReader())
                            {
                                while (reader.Read())
                                {
                                    imgSearchReq.comp_image_urls.Add(reader.GetString(0));
                                }
                            }
                        }
                    }
                    _logger.LogInformation($"ORCHESTRATOR SERVICE: retrieved {imgSearchReq.comp_image_urls.Count} images from DB");
                    response.milestones.Add("Retrieved images from DB");
                }
                catch (Exception ex)
                {
                    response.milestones.Add($"Error getting details from DB: {ex.Message}");
                    return($"Error getting all images from DB: {ex.Message}");
                }

                VerifyImage verifyImg;
                try
                {
                    _logger.LogInformation($"ORCHESTRATOR SERVICE: verify if the image is a house");
                    response.milestones.Add("Verifying image");
                    using (var httpClient = new HttpClient())
                    {
                        _logger.LogInformation($"ORCHESTRATOR SERVICE: calling {ML_API}/? image_url={imgSearchReq.org_image_url}");
                        using (var res = httpClient.GetAsync(ML_API + "/?image_url=" + imgSearchReq.org_image_url))
                        {
                            var apiResponse = res.Result.Content.ReadAsStringAsync().Result;
                            _logger.LogInformation($"ORCHESTRATOR SERVICE: received response from {ML_API}/? image_url={imgSearchReq.org_image_url} ---- {res.Result.StatusCode}");
                            if (res.Result.IsSuccessStatusCode)
                            {
                                _logger.LogInformation($"ORCHESTRATOR SERVICE: Deserializing response {apiResponse}");
                                verifyImg = JsonConvert.DeserializeObject <VerifyImage>(apiResponse);
                                _logger.LogInformation($"ORCHESTRATOR SERVICE: Deserialized response {string.Join(';', verifyImg.tags.ToArray())}");
                                response.milestones.Add("It is a house");
                            }
                            else
                            {
                                _logger.LogInformation($"ORCHESTRATOR SERVICE: Image is not a house");
                                verifyImg = new VerifyImage {
                                    is_house = false
                                };
                                _logger.LogInformation($"ORCHESTRATOR SERVICE: Image is {string.Join(';', verifyImg.tags.ToArray())}");
                                response.milestones.Add("It is not a house");
                            }
                        }
                        response.isHouse = verifyImg.is_house;
                    }

                    _logger.LogInformation("ORCHESTRATOR SERVICE: get user details from DB");
                    response.milestones.Add("Getting User details from DB");
                    using (var sqlConn = new SqlConnection(DB_CONN))
                    {
                        sqlConn.Open();
                        var query = $"SELECT * from [dbo].[UserProfile] where username='******'";
                        using (SqlCommand cmd = new SqlCommand(query, sqlConn))
                        {
                            using (var reader = cmd.ExecuteReader())
                            {
                                while (reader.Read())
                                {
                                    response.user = new Core.UserProfile
                                    {
                                        userId          = reader.GetInt32(0).ToString(),
                                        username        = reader.GetString(1),
                                        firstName       = reader.GetString(3),
                                        lastName        = reader.GetString(4),
                                        middleName      = reader.GetString(5),
                                        creditScore     = reader.GetInt32(6),
                                        aum             = reader.GetInt32(7),
                                        relationshipAge = reader.GetInt32(8),
                                        phone           = reader.GetString(9),
                                        emailAddress    = reader.GetString(10),
                                        accountNumber   = reader.GetString(11)
                                    };
                                }
                            }
                        }
                    }
                    _logger.LogInformation($"ORCHESTRATOR SERVICE: retrieved {JsonConvert.SerializeObject(response.user)}  from DB");
                    response.milestones.Add("Got User details from DB");
                }
                catch (Exception ex)
                {
                    return($"Error verifying image: {ex.Message}");
                }

                if (!verifyImg.is_house)
                {
                    _logger.LogInformation($"ORCHESTRATOR SERVICE: returning early since the image is not a house");
                    return(JsonConvert.SerializeObject(response));
                }
                SearchImageResponse imgSearchResponse;

                try
                {
                    _logger.LogInformation($"ORCHESTRATOR SERVICE: send query image and all DB images to ML model");
                    response.milestones.Add("calling vision service");
                    using (var httpClient = new HttpClient())
                    {
                        var httpContent = new StringContent(JsonConvert.SerializeObject(imgSearchReq), Encoding.UTF8, "application/json");
                        {
                            _logger.LogInformation($"ORCHESTRATOR SERVICE: calling {ML_API} using {httpContent}");
                            using (var res = httpClient.PostAsync(ML_API, httpContent))
                            {
                                var apiResponse = res.Result.Content.ReadAsStringAsync().Result;
                                _logger.LogInformation($"ORCHESTRATOR SERVICE: received response from {ML_API} for image matching ---- {res.Result.StatusCode}");
                                if (res.Result.IsSuccessStatusCode)
                                {
                                    _logger.LogInformation($"ORCHESTRATOR SERVICE: Deserializing response {apiResponse}");
                                    imgSearchResponse      = JsonConvert.DeserializeObject <SearchImageResponse>(apiResponse);
                                    response.propertyFound = true;
                                    _logger.LogInformation($"ORCHESTRATOR SERVICE: Deserialized response {imgSearchResponse.comp_image_url} and {imgSearchResponse.message}");
                                    response.milestones.Add("Property was found");
                                }
                                else
                                {
                                    response.propertyFound = false;
                                    imgSearchResponse      = new SearchImageResponse {
                                        comp_image_url = "https://azsnappersblob.blob.core.windows.net/images/HouseNotFound.PNG", message = "Property not found"
                                    };
                                    _logger.LogInformation($"ORCHESTRATOR SERVICE: Image not matched... returning property not found image");
                                    response.milestones.Add("Property was not found");
                                    //    var p = new Random().Next(0, 65);
                                    //_logger.LogInformation($"ORCHESTRATOR SERVICE: Image not matched... picking a random image {p}");
                                    //if (p == 0)
                                    //{
                                    //    imgSearchResponse = new SearchImageResponse { comp_image_url = "https://azsnappersblob.blob.core.windows.net/images/HouseNotFound.PNG", message = "Property not found" };
                                    //}
                                    //else
                                    //{
                                    //    imgSearchResponse = new SearchImageResponse { comp_image_url = imgSearchReq.comp_image_urls[p - 1], message = "Randomly chosen house image" };
                                    //}
                                    //_logger.LogInformation($"ORCHESTRATOR SERVICE: Image not matched... picked a random image {JsonConvert.SerializeObject(imgSearchResponse)}");
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    return($"Error matching image from vision service: {ex.Message}");
                }

                var mtgReq = new MortgageQuoteRequest();
                try
                {
                    _logger.LogInformation($"ORCHESTRATOR SERVICE: get property from return image url");
                    response.milestones.Add("Getting property details from DB");
                    using (var sqlConn = new SqlConnection(DB_CONN))
                    {
                        sqlConn.Open();
                        var query = $"select P.*, I.Path from [dbo].[image] I, [dbo].[Property] P where I.PropertyId = P.PropertyId and I.Path = '{imgSearchResponse.comp_image_url}'";
                        using (SqlCommand cmd = new SqlCommand(query, sqlConn))
                        {
                            using (var reader = cmd.ExecuteReader())
                            {
                                var added = false;
                                while (reader.Read())
                                {
                                    if (!added)
                                    {
                                        added = true;
                                        response.propertyList.Add(new Property
                                        {
                                            imageUrl          = reader.GetString(16),
                                            address           = $"{reader.GetString(1)}, {reader.GetString(3)}, {reader.GetString(4)} {reader.GetString(5)}",
                                            area              = reader.GetDouble(14).ToString(),
                                            numberOfBedrooms  = reader.GetInt32(7),
                                            numberOfBathrooms = reader.GetInt32(8),
                                            cost              = reader.GetDouble(13).ToString(),
                                            status            = reader.GetString(12),
                                            tax        = reader.GetDouble(15).ToString(),
                                            zip        = reader.GetString(5),
                                            propertyId = reader.GetInt32(0).ToString()
                                        });
                                    }
                                    response.propertyList[0].moreImages.Add(reader.GetString(16));
                                }
                            }
                        }
                    }
                    _logger.LogInformation($"ORCHESTRATOR SERVICE: retrieved property details from DB --- {JsonConvert.SerializeObject(response.propertyList)}");
                    response.milestones.Add("Got property details from DB");

                    mtgReq.AccountDetails = new AccountDetails
                    {
                        AccountNumber = response.user.accountNumber,
                        AUM           = decimal.Parse(response.user.aum.ToString()),
                        Tenure        = response.user.relationshipAge.ToString(),
                        UserId        = response.user.userId
                    };
                    var age = new Random().Next(5, 50);
                    mtgReq.PropertyDetails = new PropertyDetails
                    {
                        Zipcode          = response.propertyList[0].zip,
                        Area             = response.propertyList[0].area.ToString(),
                        Cost             = decimal.Parse(response.propertyList[0].cost),
                        AgeInYears       = age,
                        contrustedIn     = DateTime.Now.AddYears(-1 * age),
                        NumberOfBedrooms = response.propertyList[0].numberOfBedrooms,
                        PropertyId       = response.propertyList[0].propertyId
                    };

                    _logger.LogInformation($"ORCHESTRATOR SERVICE: send user and property details to mortgage service --- {JsonConvert.SerializeObject(mtgReq)}");
                }
                catch (Exception ex)
                {
                    return($"Error getting selected property from DB: {ex.Message}");
                }

                response.milestones.Add("Getting quote from Mortgage service");
                try
                {
                    MortgageQuoteResponse mtgResponse;
                    using (var httpClient = new HttpClient())
                    {
                        var httpContent = new StringContent(JsonConvert.SerializeObject(mtgReq), Encoding.UTF8, "application/json");
                        {
                            _logger.LogInformation($"ORCHESTRATOR SERVICE: calling {MTG_API} using {httpContent}");
                            using (var res = httpClient.PostAsync(MTG_API, httpContent))
                            {
                                var apiResponse = res.Result.Content.ReadAsStringAsync().Result;
                                _logger.LogInformation($"ORCHESTRATOR SERVICE: received response from {MTG_API} for mortgage saearch ---- {res.Result.StatusCode}");
                                if (res.Result.IsSuccessStatusCode)
                                {
                                    _logger.LogInformation($"ORCHESTRATOR SERVICE: Deserializing response {apiResponse}");
                                    mtgResponse         = JsonConvert.DeserializeObject <MortgageQuoteResponse>(apiResponse);
                                    response.quoteFound = true;
                                    _logger.LogInformation($"ORCHESTRATOR SERVICE: Deserialized response {JsonConvert.SerializeObject(mtgResponse)}");
                                    response.milestones.Add("Got quote from Mortgage service");
                                }
                                else
                                {
                                    mtgResponse = new MortgageQuoteResponse
                                    {
                                        AccountNumber  = mtgReq.AccountDetails.AccountNumber,
                                        UserId         = response.user.userId,
                                        IsPreApproved  = false,
                                        PropertyId     = mtgReq.PropertyDetails.PropertyId,
                                        DownPayment    = 0,
                                        MonthlyEMI     = 0,
                                        RateofInterest = "0"
                                    };
                                    response.quoteFound = false;
                                    _logger.LogInformation($"ORCHESTRATOR SERVICE: Image not matched... setting default dummy response {JsonConvert.SerializeObject(mtgResponse)}");
                                    response.milestones.Add("Dummy quote generated");
                                }
                                response.propertyList[0].quoteDetails.downPayment    = mtgResponse.DownPayment;
                                response.propertyList[0].quoteDetails.isPreApproved  = mtgResponse.IsPreApproved;
                                response.propertyList[0].quoteDetails.monthlyPayment = mtgResponse.MonthlyEMI;
                                response.propertyList[0].quoteDetails.rateOfInterest = mtgResponse.RateofInterest;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    return($"Error getting mortgage quote: {ex.Message}");
                }

                _logger.LogInformation($"ORCHESTRATOR SERVICE: send user, property and mortgage details back to UI {JsonConvert.SerializeObject(response)}");
                response.milestones.Add("Sending full response back");
                return(JsonConvert.SerializeObject(response));
            }
            catch (Exception exc)
            {
                return(exc.Message);
            }
        }
Esempio n. 3
0
 public async Task <SearchImageResponse> SearchImageAsync(SearchImageRequest request)
 {
     AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
     return(await SearchImageWithOptionsAsync(request, runtime));
 }
Esempio n. 4
0
 public SearchImageResponse SearchImage(SearchImageRequest request)
 {
     AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
     return(SearchImageWithOptions(request, runtime));
 }
Esempio n. 5
0
 public async Task <SearchImageResponse> SearchImageWithOptionsAsync(SearchImageRequest request, AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime)
 {
     AlibabaCloud.TeaUtil.Common.ValidateModel(request);
     return(TeaModel.ToObject <SearchImageResponse>(await DoRequestWithActionAsync("SearchImage", "2019-03-25", "HTTPS", "POST", "AK", "/v2/image/search", null, request.Headers, request.Body.ToMap(), runtime)));
 }
Esempio n. 6
0
        public SearchImageResponse SearchImageAdvance(SearchImageAdvanceRequest request, AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime)
        {
            // Step 0: init client
            string accessKeyId     = this._credential.GetAccessKeyId();
            string accessKeySecret = this._credential.GetAccessKeySecret();

            AlibabaCloud.RPCClient.Models.Config authConfig = new AlibabaCloud.RPCClient.Models.Config
            {
                AccessKeyId     = accessKeyId,
                AccessKeySecret = accessKeySecret,
                Type            = "access_key",
                Endpoint        = "openplatform.aliyuncs.com",
                Protocol        = _protocol,
                RegionId        = _regionId,
            };
            AlibabaCloud.SDK.OpenPlatform20191219.Client authClient = new AlibabaCloud.SDK.OpenPlatform20191219.Client(authConfig);
            AlibabaCloud.SDK.OpenPlatform20191219.Models.AuthorizeFileUploadRequest authRequest = new AlibabaCloud.SDK.OpenPlatform20191219.Models.AuthorizeFileUploadRequest
            {
                Product  = "imgsearch",
                RegionId = _regionId,
            };
            AlibabaCloud.SDK.OpenPlatform20191219.Models.AuthorizeFileUploadResponse authResponse = authClient.AuthorizeFileUploadWithOptions(authRequest, runtime);
            // Step 1: request OSS api to upload file
            AlibabaCloud.OSS.Models.Config ossConfig = new AlibabaCloud.OSS.Models.Config
            {
                AccessKeyId     = authResponse.AccessKeyId,
                AccessKeySecret = accessKeySecret,
                Type            = "access_key",
                Endpoint        = AlibabaCloud.Commons.Common.GetEndpoint(authResponse.Endpoint, authResponse.UseAccelerate, _endpointType),
                Protocol        = _protocol,
                RegionId        = _regionId,
            };
            AlibabaCloud.OSS.Client ossClient = new AlibabaCloud.OSS.Client(ossConfig);
            AlibabaCloud.SDK.TeaFileform.Models.FileField fileObj = new AlibabaCloud.SDK.TeaFileform.Models.FileField
            {
                Filename    = authResponse.ObjectKey,
                Content     = request.ImageUrlObject,
                ContentType = "",
            };
            AlibabaCloud.OSS.Models.PostObjectRequest.PostObjectRequestHeader ossHeader = new AlibabaCloud.OSS.Models.PostObjectRequest.PostObjectRequestHeader
            {
                AccessKeyId         = authResponse.AccessKeyId,
                Policy              = authResponse.EncodedPolicy,
                Signature           = authResponse.Signature,
                Key                 = authResponse.ObjectKey,
                File                = fileObj,
                SuccessActionStatus = "201",
            };
            AlibabaCloud.OSS.Models.PostObjectRequest uploadRequest = new AlibabaCloud.OSS.Models.PostObjectRequest
            {
                BucketName = authResponse.Bucket,
                Header     = ossHeader,
            };
            AlibabaCloud.OSSUtil.Models.RuntimeOptions ossRuntime = new AlibabaCloud.OSSUtil.Models.RuntimeOptions();
            AlibabaCloud.Commons.Common.Convert(runtime, ossRuntime);
            ossClient.PostObject(uploadRequest, ossRuntime);
            // Step 2: request final api
            SearchImageRequest searchImagereq = new SearchImageRequest();

            AlibabaCloud.Commons.Common.Convert(request, searchImagereq);
            searchImagereq.ImageUrl = "http://" + authResponse.Bucket + "." + authResponse.Endpoint + "/" + authResponse.ObjectKey;
            SearchImageResponse searchImageResp = SearchImage(searchImagereq, runtime);

            return(searchImageResp);
        }
Esempio n. 7
0
 public async Task <SearchImageResponse> SearchImageAsync(SearchImageRequest request, AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime)
 {
     AlibabaCloud.TeaUtil.Common.ValidateModel(request);
     return(TeaModel.ToObject <SearchImageResponse>(await DoRequestAsync("SearchImage", "HTTPS", "POST", "2020-03-20", "AK", null, request.ToMap(), runtime)));
 }