Produced by Araxis Merge on 11/29/2018 1:28:44 PM Eastern Standard Time. See www.araxis.com for information about Merge. This report uses XHTML and CSS2, and is best viewed with a modern standards-compliant browser. For optimum results when printing this report, use landscape orientation and enable printing of background images and colours in your browser.
| # | Location | File | Last Modified |
|---|---|---|---|
| 1 | PPMS Build 9.zip\CIF B10S1\VA.PPMS.DataWebServiceV1\VA.PPMS.DataWebServiceV1\PpmsDataService | GlobalFunctionsController.cs | Tue Nov 20 19:10:54 2018 UTC |
| 2 | PPMS Build 9.zip\CIF B10S1\VA.PPMS.DataWebServiceV1\VA.PPMS.DataWebServiceV1\PpmsDataService | GlobalFunctionsController.cs | Tue Nov 27 21:21:34 2018 UTC |
| Description | Between Files 1 and 2 |
|
|---|---|---|
| Text Blocks | Lines | |
| Unchanged | 3 | 1238 |
| Changed | 2 | 6 |
| Inserted | 0 | 0 |
| Removed | 0 | 0 |
| Whitespace | |
|---|---|
| Character case | Differences in character case are significant |
| Line endings | Differences in line endings (CR and LF characters) are ignored |
| CR/LF characters | Not shown in the comparison detail |
No regular expressions were active.
| 1 | using Syst em; | |
| 2 | using Syst em.Collect ions.Gener ic; | |
| 3 | using Syst em.Configu ration; | |
| 4 | using Syst em.Device. Location; | |
| 5 | using Syst em.Linq; | |
| 6 | using Syst em.Net; | |
| 7 | using Syst em.Net.Htt p; | |
| 8 | using Syst em.Threadi ng.Tasks; | |
| 9 | using Syst em.Web.Htt p; | |
| 10 | using Syst em.Web.Htt p.Descript ion; | |
| 11 | using Syst em.Web.ODa ta; | |
| 12 | using Syst em.Web.ODa ta.Routing ; | |
| 13 | using Bing MapsRESTTo olkit; | |
| 14 | using Micr osoft.Web. Http; | |
| 15 | using Ppms DataServic e.Models; | |
| 16 | using Ppms DataServic e.ModelsEn umTypes; | |
| 17 | using Ppms DataServic e.V1.Mappe rs; | |
| 18 | using Ppms DataServic e.VA.PPMS. Context; | |
| 19 | using VA.P PMS.Contex t; | |
| 20 | using Syst em.Net.Htt p.Headers; | |
| 21 | using Syst em.Runtime .Serializa tion.Json; | |
| 22 | using Syst em.Securit y.Cryptogr aphy.X509C ertificate s; | |
| 23 | using Syst em.Text; | |
| 24 | using Syst em.IO; | |
| 25 | ||
| 26 | namespace PpmsDataSe rvice | |
| 27 | { | |
| 28 | /// <s ummary> | |
| 29 | /// Pr ovides unb ound, util ity functi ons. | |
| 30 | /// </ summary> | |
| 31 | [ApiVe rsionNeutr al] | |
| 32 | public class Glo balFunctio nsControll er : OData Controller | |
| 33 | { | |
| 34 | [H ttpGet] | |
| 35 | [M apToApiVer sion("1.0" )] | |
| 36 | [R esponseTyp e(typeof(P roviderLoc atorResult ))] | |
| 37 | [O DataRoute( "ProviderL ocator")] | |
| 38 | pu blic async Task<Http ResponseMe ssage> Pro viderLocat or([FromOD ataUri] st ring addre ss, [FromO DataUri] i nt radius, [FromODat aUri] int driveTime, [FromODat aUri] stri ng special tycode1, [ FromODataU ri] string specialty code2, [Fr omODataUri ] string s pecialtyco de3, [From ODataUri] string spe cialtycode 4, [FromOD ataUri] in t network, [FromODat aUri] int gender, [F romODataUr i] int pri marycare, [FromOData Uri] int a cceptingne wpatients, [FromODat aUri] int maxResults ) | |
| 39 | { | |
| 40 | //Defaul t Values f or maxResu lts | |
| 41 | if (maxR esults > 6 25) { maxR esults = 6 25; } | |
| 42 | ||
| 43 | using (v ar context = new Ppm sContext(a wait PpmsC ontextHelp er.GetProx y())) | |
| 44 | { | |
| 45 | stri ng key = C onfigurati onManager. AppSetting s["BingMap sKey"]; | |
| 46 | ||
| 47 | //Ge ocode the Starting A ddress fir st | |
| 48 | var request = new Geocod eRequest() | |
| 49 | { | |
| 50 | Query = ad dress, | |
| 51 | IncludeIso 2 = true, | |
| 52 | IncludeNei ghborhood = true, | |
| 53 | MaxResults = 25, | |
| 54 | BingMapsKe y = key | |
| 55 | }; | |
| 56 | ||
| 57 | //Pr ocess the request by using the ServiceMa nager. | |
| 58 | var response = await Ser viceManage r.GetRespo nseAsync(r equest); | |
| 59 | ||
| 60 | if ( response ! = null && | |
| 61 | response.R esourceSet s != null && | |
| 62 | response.R esourceSet s.Length > 0 && | |
| 63 | response.R esourceSet s[0].Resou rces != nu ll && | |
| 64 | response.R esourceSet s[0].Resou rces.Lengt h > 0) | |
| 65 | { | |
| 66 | var result = respons e.Resource Sets[0].Re sources[0] as Locati on; | |
| 67 | if (result != null) | |
| 68 | { | |
| 69 | double startLati tude = res ult.Point. Coordinate s[0]; | |
| 70 | double startLong itude = re sult.Point .Coordinat es[1]; | |
| 71 | var st artingCoor d = new Co ordinate(s tartLatitu de, startL ongitude); | |
| 72 | var st artingWayP oint = new SimpleWay point(star tingCoord) ; | |
| 73 | var or igin = new List<Simp leWaypoint > { starti ngWayPoint }; | |
| 74 | ||
| 75 | var pr ovServices = from ps in contex t.ppms_pro viderservi ceSet | |
| 76 | where p s.StateCod e.Value == (int)ppms _providers erviceStat e.Active | |
| 77 | where p s.StatusCo de.Value = = (int)ppm s_provider service_St atusCode.A ctive | |
| 78 | where p s.ppms_net work != nu ll | |
| 79 | where p s.ppms_Pro viderId != null | |
| 80 | where p s.ppms_spe cialty != null | |
| 81 | where p s.ppms_lat itude != n ull | |
| 82 | where p s.ppms_lon gitude != null | |
| 83 | select ps; | |
| 84 | ||
| 85 | //Add Optional F ilters | |
| 86 | ||
| 87 | //If a ny Special ty Codes a re given, check for Provider S ervices wi th match S pecialty C odes | |
| 88 | if (sp ecialtycod e1 != null || specia ltycode2 ! = null || specialtyc ode3 != nu ll || spec ialtycode4 != null) | |
| 89 | pr ovServices = provSer vices.Wher e(ps => ps .ppms_spec ialtycode. Equals(spe cialtycode 1) || ps.p pms_specia ltycode.Eq uals(speci altycode2) || ps.ppm s_specialt ycode.Equa ls(special tycode3) | | ps.ppms_ specialtyc ode.Equals (specialty code4)); | |
| 90 | ||
| 91 | //Netw ork Switch | |
| 92 | var pr oviderNetw ork = Netw orkIds.Get Network(ne twork); | |
| 93 | if (pr oviderNetw ork.Number != (int)N etwork.Any Network) | |
| 94 | pr ovServices = provSer vices.Wher e(ps => ps .ppms_netw ork.Id == providerNe twork.Id); | |
| 95 | ||
| 96 | switch (gender) | |
| 97 | { | |
| 98 | ca se 0: | |
| 99 | //Any ge nder | |
| 100 | break; | |
| 101 | ca se 1: | |
| 102 | //Male | |
| 103 | provServ ices = pro vServices. Where(ps = > ps.ppms_ providerge nder.Equal s(ppms_Gen der.Male)) ; | |
| 104 | break; | |
| 105 | ca se 2: | |
| 106 | //Female | |
| 107 | provServ ices = pro vServices. Where(ps = > ps.ppms_ providerge nder.Equal s(ppms_Gen der.Female )); | |
| 108 | break; | |
| 109 | de fault: | |
| 110 | break; | |
| 111 | } | |
| 112 | ||
| 113 | switch (primaryc are) | |
| 114 | { | |
| 115 | ca se 0: | |
| 116 | //No Pre ference | |
| 117 | break; | |
| 118 | ca se 1: | |
| 119 | provServ ices = pro vServices. Where(ps = > ps.ppms_ provideris primarycar e.Equals(t rue)); | |
| 120 | break; | |
| 121 | ca se 2: | |
| 122 | provServ ices = pro vServices. Where(ps = > ps.ppms_ provideris primarycar e.Equals(f alse)); | |
| 123 | break; | |
| 124 | de fault: | |
| 125 | break; | |
| 126 | } | |
| 127 | ||
| 128 | switch (acceptin gnewpatien ts) | |
| 129 | { | |
| 130 | ca se 0: | |
| 131 | //No Pre ference | |
| 132 | break; | |
| 133 | ca se 1: | |
| 134 | provServ ices = pro vServices. Where(ps = > ps.ppms_ providerac ceptingnew patients.E quals(true ) && ps.pp ms_provide raccepting va.Equals( true)); | |
| 135 | break; | |
| 136 | ca se 2: | |
| 137 | provServ ices = pro vServices. Where(ps = > ps.ppms_ providerac ceptingnew patients.E quals(fals e) && ps.p pms_provid eracceptin gva.Equals (false)); | |
| 138 | break; | |
| 139 | de fault: | |
| 140 | break; | |
| 141 | } | |
| 142 | ||
| 143 | ||
| 144 | ||
| 145 | var pp msProvider ServicesIn Radius = p rovService s | |
| 146 | .Sel ect(psr => new Provi derInRadiu s | |
| 147 | { | |
| 148 | ProviderSe rvice = ps r, | |
| 149 | Distance = Haversine .GetDistan ce(startLa titude, st artLongitu de | |
| 150 | , Convert.T oDouble(ps r.ppms_Car eSiteAddre ssLatitude ), Convert .ToDouble( psr.ppms_C areSiteAdd ressLongit ude)) | |
| 151 | }).A sEnumerabl e(); | |
| 152 | ||
| 153 | //var ppmsProvid erServices List = ppm sProviderS ervicesInR adius.Orde rBy(psr => psr.Dista nce).Take( 100).Selec t(x => x.P roviderSer vice).ToLi st(); | |
| 154 | var pp msProvider ServicesLi st = ppmsP roviderSer vicesInRad ius.Where( psr => psr .Distance <= radius) .OrderBy(p sr => psr. Distance). Take(maxRe sults).Sel ect(x => x .ProviderS ervice).To List(); | |
| 155 | if (pp msProvider ServicesLi st.Count > 0) | |
| 156 | { | |
| 157 | ||
| 158 | // Split up i nto separa te lists o f max 625 for the Di stance Mat rix Reques t. | |
| 159 | // If adding a Start ti me the max # in a re quest is 1 00 | |
| 160 | // var ppmsPr oviderServ icesParsed = ppmsPro viderServi ces.Select ((x, i) => new { Ind ex = i, Va lue = x }) .GroupBy(x => x.Inde x / 100).S elect(x => x.Select( v => v.Val ue).ToList ()).ToList (); | |
| 161 | ||
| 162 | va r provLoca torList = new List<P roviderLoc atorResult >(); | |
| 163 | // foreach ( var provSe rviceList in ppmsPro viderServi cesParsed) | |
| 164 | // { | |
| 165 | // Create the List of D estination s | |
| 166 | va r destinat ionsList = new List< SimpleWayp oint>(); | |
| 167 | fo reach (var ppmsProvi derService in ppmsPr oviderServ icesList) | |
| 168 | { | |
| 169 | double l atitude = Convert.To Double(ppm sProviderS ervice.ppm s_CareSite AddressLat itude); | |
| 170 | double l ongitude = Convert.T oDouble(pp msProvider Service.pp ms_CareSit eAddressLo ngitude); | |
| 171 | var coor d = new Co ordinate(l atitude, l ongitude); | |
| 172 | var wayP oint = new SimpleWay point(coor d); | |
| 173 | destinat ionsList.A dd(wayPoin t); | |
| 174 | } | |
| 175 | // Define the Distance Matrix Req uest | |
| 176 | va r distance MatrixReq = new Dist anceMatrix Request() | |
| 177 | { | |
| 178 | Origins = origin, | |
| 179 | BingMaps Key = key, | |
| 180 | Distance Units = Di stanceUnit Type.Miles , | |
| 181 | TimeUnit s = TimeUn itType.Min ute, | |
| 182 | Destinat ions = des tinationsL ist, | |
| 183 | TravelMo de = Trave lModeType. Driving, | |
| 184 | StartTim e = DateTi me.Now | |
| 185 | }; | |
| 186 | ||
| 187 | // Process th e request by using t he Service Manager. | |
| 188 | va r distMatr ixResponse = await S erviceMana ger.GetRes ponseAsync (distanceM atrixReq); | |
| 189 | ||
| 190 | if (distMatr ixResponse != null & & | |
| 191 | distMatr ixResponse .ResourceS ets != nul l && | |
| 192 | distMatr ixResponse .ResourceS ets.Length > 0 && | |
| 193 | distMatr ixResponse .ResourceS ets[0].Res ources != null && | |
| 194 | distMatr ixResponse .ResourceS ets[0].Res ources.Len gth > 0) | |
| 195 | { | |
| 196 | if (dist MatrixResp onse.Resou rceSets[0] .Resources [0] is Dis tanceMatri x distance Matrix) | |
| 197 | { | |
| 198 | var travelTime sDistances = distanc eMatrix.Re sults; | |
| 199 | ||
| 200 | for (var i = 0 ; i < trav elTimesDis tances.Len gth; i++) | |
| 201 | { | |
| 202 | //Only do mapping if the Provi der Servic e falls wi thin Radiu s & DriveT ime | |
| 203 | if (travel TimesDista nces[i].Tr avelDistan ce <= radi us && trav elTimesDis tances[i]. TravelDura tion <= dr iveTime) | |
| 204 | { | |
| 205 | var pr ovLocatorR esult = ne w Provider LocatorRes ult(); | |
| 206 | provLo catorResul t.Miles = travelTime sDistances [i].Travel Distance; | |
| 207 | provLo catorResul t.Minutes = travelTi mesDistanc es[i].Trav elDuration ; | |
| 208 | provLo catorResul t.Provider Name = ppm sProviderS ervicesLis t[i].ppms_ providerna me; | |
| 209 | provLo catorResul t.Provider Specialty = ppmsProv iderServic esList[i]. ppms_speci altynamete xt; | |
| 210 | provLo catorResul t.Specialt yCode = pp msProvider ServicesLi st[i].ppms _specialty code; | |
| 211 | provLo catorResul t.Provider Identifier = ppmsPro viderServi cesList[i] .ppms_prov ideridenti fer; | |
| 212 | provLo catorResul t.WorkHour s = ppmsPr oviderServ icesList[i ].ppms_wor khours; | |
| 213 | ||
| 214 | if (pp msProvider ServicesLi st[i].ppms _qualityra nkingtotal score != n ull) | |
| 215 | { | |
| 216 | pr ovLocatorR esult.Qual ityRanking = (int)pp msProvider ServicesLi st[i].ppms _qualityra nkingtotal score; | |
| 217 | } | |
| 218 | provLo catorResul t.Latitude = Convert .ToDouble( ppmsProvid erServices List[i].pp ms_CareSit eAddressLa titude); | |
| 219 | provLo catorResul t.Longitud e = Conver t.ToDouble (ppmsProvi derService sList[i].p pms_CareSi teAddressL ongitude); | |
| 220 | if (pp msProvider ServicesLi st[i].ppms _caresite != null) | |
| 221 | { | |
| 222 | pr ovLocatorR esult.Care Site = | |
| 223 | ppmsProv iderServic esList[i]. ppms_cares ite.Name; | |
| 224 | va r careSite = context .ppms_care siteSet.Fi rst( | |
| 225 | c => c.I d == ppmsP roviderSer vicesList[ i].ppms_ca resite.Id) ; | |
| 226 | pr ovLocatorR esult.Care SitePhoneN umber = ca reSite.ppm s_mainsite phone; | |
| 227 | } | |
| 228 | ||
| 229 | provLo catorResul t.CareSite Address = ppmsProvid erServices List[i].pp ms_caresit eaddress + ' ' + ppm sProviderS ervicesLis t[i].ppms_ caresiteci ty + ',' + ' ' + | |
| 230 | pp msProvider ServicesLi st[i].ppms _caresites tateprovin ce + ' ' + ppmsProvi derService sList[i].p pms_caresi tezipcode; | |
| 231 | //Gend er | |
| 232 | if (pp msProvider ServicesLi st[i].ppms _providerg ender != n ull) | |
| 233 | sw itch (ppms ProviderSe rvicesList [i].ppms_p rovidergen der.Value) | |
| 234 | { | |
| 235 | case (in t)ppms_Gen der.Male: | |
| 236 | prov LocatorRes ult.Provid erGender = ProviderG ender.Male ; | |
| 237 | brea k; | |
| 238 | case (in t)ppms_Gen der.Female : | |
| 239 | prov LocatorRes ult.Provid erGender = ProviderG ender.Fema le; | |
| 240 | brea k; | |
| 241 | case (in t)ppms_Gen der.NotSpe cified: | |
| 242 | prov LocatorRes ult.Provid erGender = ProviderG ender.NotS pecified; | |
| 243 | brea k; | |
| 244 | case (in t)ppms_Gen der.Other: | |
| 245 | prov LocatorRes ult.Provid erGender = ProviderG ender.Othe r; | |
| 246 | brea k; | |
| 247 | } | |
| 248 | ||
| 249 | if (pp msProvider ServicesLi st[i].ppms _qualityra nkingtotal score != n ull) | |
| 250 | pr ovLocatorR esult.Qual ityRanking = (int)pp msProvider ServicesLi st[i].ppms _qualityra nkingtotal score; | |
| 251 | if (pp msProvider ServicesLi st[i].ppms _network ! = null) | |
| 252 | { | |
| 253 | pr ovLocatorR esult.Prov iderNetwor k = ppmsPr oviderServ icesList[i ].ppms_net work.Name; | |
| 254 | va r provNetw ork = Netw orkIds.Get Network(pp msProvider ServicesLi st[i].ppms _network.I d); | |
| 255 | pr ovLocatorR esult.Netw orkId = pr ovNetwork. Number; | |
| 256 | } | |
| 257 | if (pp msProvider ServicesLi st[i].ppms _provideri sprimaryca re != null ) | |
| 258 | pr ovLocatorR esult.Prov iderPrimar yCare = pp msProvider ServicesLi st[i].ppms _provideri sprimaryca re.Value; | |
| 259 | if (pp msProvider ServicesLi st[i].ppms _providera cceptingne wpatients != null) | |
| 260 | pr ovLocatorR esult.Prov iderAccept ingNewPati ents = ppm sProviderS ervicesLis t[i].ppms_ providerac ceptingnew patients.V alue; | |
| 261 | provLo catorList. Add(provLo catorResul t); | |
| 262 | } | |
| 263 | } | |
| 264 | } | |
| 265 | } | |
| 266 | // } | |
| 267 | ||
| 268 | // Sort the R esults on Distance a scending. | |
| 269 | pr ovLocatorL ist.Sort(( x, y) => x .Miles.Com pareTo(y.M iles)); | |
| 270 | // Return the Results | |
| 271 | re turn Reque st.CreateR esponse(pr ovLocatorL ist); | |
| 272 | ||
| 273 | } | |
| 274 | var me ssage = st ring.Forma t("No Prov iders foun d based on Address, Radius and Filter Cr iteria giv en"); | |
| 275 | HttpEr ror err = new HttpEr ror(messag e); | |
| 276 | return Request.C reateError Response(H ttpStatusC ode.NotFou nd, err); | |
| 277 | } | |
| 278 | } | |
| 279 | var geoCodeErr orMessage = string.F ormat("Una ble to Geo code the g iven addre ss"); | |
| 280 | Http Error geoE rr = new H ttpError(g eoCodeErro rMessage); | |
| 281 | retu rn Request .CreateErr orResponse (HttpStatu sCode.NotF ound, geoE rr); | |
| 282 | } | |
| 283 | } | |
| 284 | pu blic stati c class Ha versine | |
| 285 | { | |
| 286 | public s tatic bool IsInRadiu s(double l at1, doubl e lon1, do uble lat2, double lo n2, int ra dius) | |
| 287 | { | |
| 288 | var R = 6372.8 ; // In ki lometers | |
| 289 | var dLat = toR adians(lat 2 - lat1); | |
| 290 | var dLon = toR adians(lon 2 - lon1); | |
| 291 | lat1 = toRadia ns(lat1); | |
| 292 | lat2 = toRadia ns(lat2); | |
| 293 | ||
| 294 | var a = Math.S in(dLat / 2) * Math. Sin(dLat / 2) + Math .Sin(dLon / 2) * Mat h.Sin(dLon / 2) * Ma th.Cos(lat 1) * Math. Cos(lat2); | |
| 295 | var c = 2 * Ma th.Asin(Ma th.Sqrt(a) ); | |
| 296 | var distance = R * 2 * M ath.Asin(M ath.Sqrt(a )); | |
| 297 | if ( distance < = radius) | |
| 298 | { | |
| 299 | return tru e; | |
| 300 | } | |
| 301 | retu rn false; | |
| 302 | } | |
| 303 | ||
| 304 | public s tatic doub le GetDist ance(doubl e lat1, do uble lon1, double la t2, double lon2) | |
| 305 | { | |
| 306 | var R = 6372.8 ; // In ki lometers | |
| 307 | var dLat = toR adians(lat 2 - lat1); | |
| 308 | var dLon = toR adians(lon 2 - lon1); | |
| 309 | lat1 = toRadia ns(lat1); | |
| 310 | lat2 = toRadia ns(lat2); | |
| 311 | var a = Math.S in(dLat / 2) * Math. Sin(dLat / 2) + Math .Sin(dLon / 2) * Mat h.Sin(dLon / 2) * Ma th.Cos(lat 1) * Math. Cos(lat2); | |
| 312 | var c = 2 * Ma th.Asin(Ma th.Sqrt(a) ); | |
| 313 | var distance = R * 2 * M ath.Asin(M ath.Sqrt(a )); | |
| 314 | retu rn distanc e; | |
| 315 | } | |
| 316 | ||
| 317 | public s tatic ppms _providers ervice Ret urnInRadiu s(ppms_pro viderservi ce provSer vice, doub le lat1, d ouble lon1 , int radi us) | |
| 318 | { | |
| 319 | doub le lat2 = Convert.To Double(pro vService.p pms_CareSi teAddressL atitude); | |
| 320 | doub le lon2 = Convert.To Double(pro vService.p pms_CareSi teAddressL ongitude); | |
| 321 | var R = 6372.8 ; // In ki lometers | |
| 322 | var dLat = toR adians(lat 2 - lat1); | |
| 323 | var dLon = toR adians(lon 2 - lon1); | |
| 324 | lat1 = toRadia ns(lat1); | |
| 325 | lat2 = toRadia ns(lat2); | |
| 326 | ||
| 327 | var a = Math.S in(dLat / 2) * Math. Sin(dLat / 2) + Math .Sin(dLon / 2) * Mat h.Sin(dLon / 2) * Ma th.Cos(lat 1) * Math. Cos(lat2); | |
| 328 | var c = 2 * Ma th.Asin(Ma th.Sqrt(a) ); | |
| 329 | var distance = R * 2 * M ath.Asin(M ath.Sqrt(a )); | |
| 330 | prov Service.pp ms_distanc e = distan ce; | |
| 331 | if ( distance < = radius) | |
| 332 | { | |
| 333 | return pro vService; | |
| 334 | } | |
| 335 | retu rn null; | |
| 336 | } | |
| 337 | ||
| 338 | public s tatic doub le toRadia ns(double angle) | |
| 339 | { | |
| 340 | retu rn Math.PI * angle / 180.0; | |
| 341 | } | |
| 342 | } | |
| 343 | ||
| 344 | pu blic class ProviderI nRadius | |
| 345 | { | |
| 346 | public p pms_provid erservice ProviderSe rvice { ge t; set; } | |
| 347 | public d ouble Dist ance { get ; set; } | |
| 348 | } | |
| 349 | ||
| 350 | ||
| 351 | /* | |
| 352 | [H ttpGet] | |
| 353 | [M apToApiVer sion("1.0" )] | |
| 354 | [R esponseTyp e(typeof(C oordinates ))] | |
| 355 | [O DataRoute( "Geocode") ] | |
| 356 | pu blic async Task<Http ResponseMe ssage> Geo code([From ODataUri] string add ress) | |
| 357 | { | |
| 358 | using (v ar context = new Ppm sContext(a wait PpmsC ontextHelp er.GetProx y())) | |
| 359 | { | |
| 360 | stri ng key = C onfigurati onManager. AppSetting s["BingMap sKey"]; | |
| 361 | var request = new Geocod eRequest() | |
| 362 | { | |
| 363 | Query = ad dress, | |
| 364 | IncludeIso 2 = true, | |
| 365 | IncludeNei ghborhood = true, | |
| 366 | MaxResults = 25, | |
| 367 | BingMapsKe y = key | |
| 368 | }; | |
| 369 | ||
| 370 | //Pr ocess the request by using the ServiceMa nager. | |
| 371 | var response = await Ser viceManage r.GetRespo nseAsync(r equest); | |
| 372 | ||
| 373 | if ( response ! = null && | |
| 374 | response.R esourceSet s != null && | |
| 375 | response.R esourceSet s.Length > 0 && | |
| 376 | response.R esourceSet s[0].Resou rces != nu ll && | |
| 377 | response.R esourceSet s[0].Resou rces.Lengt h > 0) | |
| 378 | { | |
| 379 | var result = respons e.Resource Sets[0].Re sources[0] as Locati on; | |
| 380 | if (result != null) | |
| 381 | { | |
| 382 | double latitude = result.P oint.Coord inates[0]; | |
| 383 | double longitude = result. Point.Coor dinates[1] ; | |
| 384 | var co ordinate = new GeoCo ordinate(l atitude, l ongitude); | |
| 385 | ||
| 386 | ||
| 387 | //Map the Lat, L ong, and c oordinate to Coordin ates Class . | |
| 388 | var co ordinates = new Coor dinates(); | |
| 389 | coordi nates.Lati tude = lat itude; | |
| 390 | coordi nates.Long itude = lo ngitude; | |
| 391 | coordi nates.Coor dinate = c oordinate; | |
| 392 | ||
| 393 | //Retr un the Coo rdinates | |
| 394 | return Request.C reateRespo nse(coordi nates); | |
| 395 | } | |
| 396 | } | |
| 397 | ||
| 398 | var message = string.For mat("Unabl e to Geoco de the giv en address ."); | |
| 399 | Http Error err = new Http Error(mess age); | |
| 400 | retu rn Request .CreateErr orResponse (HttpStatu sCode.NotF ound, err) ; | |
| 401 | } | |
| 402 | } | |
| 403 | ||
| 404 | [H ttpGet] | |
| 405 | [M apToApiVer sion("1.0" )] | |
| 406 | [R esponseTyp e(typeof(A ddressData ))] | |
| 407 | [O DataRoute( "ValidateA ddress")] | |
| 408 | pu blic async Task<Http ResponseMe ssage> Val idateAddre ss([FromOD ataUri] st ring stree tAddress, [FromOData Uri] strin g city, [F romODataUr i] string state, [Fr omODataUri ] string z ip) | |
| 409 | { | |
| 410 | ServiceP ointManage r.ServerCe rtificateV alidationC allback += (sender, certificat e, chain, sslPolicyE rrors) => true; | |
| 411 | ServiceP ointManage r.Security Protocol = SecurityP rotocolTyp e.Tls12; | |
| 412 | try | |
| 413 | { | |
| 414 | //Th is Control ler Action called th e Address Validation API from Vets360 | |
| 415 | usin g (var cli ent = GetH ttpClient( )) | |
| 416 | { | |
| 417 | client.Bas eAddress = new Uri(" https:// DNS . URL "); | |
| 418 | //client.B aseAddress = new Uri ("https:// DNS . URL "); | |
| 419 | ||
| 420 | var payloa d = new Ro otObjectRe quest | |
| 421 | { | |
| 422 | reques tAddress = new Model s.Address | |
| 423 | { | |
| 424 | ad dressLine1 = streetA ddress, | |
| 425 | ci ty = city, | |
| 426 | st ateProvinc e = new St ateProvinc e | |
| 427 | { | |
| 428 | name = s tate | |
| 429 | }, | |
| 430 | zi pCode5 = z ip | |
| 431 | } | |
| 432 | }; | |
| 433 | ||
| 434 | var json = Serialize e(payload) ; | |
| 435 | ||
| 436 | var conten t = new St ringConten t(json, En coding.UTF 8, "applic ation/json "); | |
| 437 | content.He aders.Cont entType = new MediaT ypeHeaderV alue("appl ication/js on"); | |
| 438 | ||
| 439 | var respon se = clien t.PostAsyn c("/addres s-validati on/address /v1/valida te", conte nt).GetAwa iter().Get Result(); | |
| 440 | ||
| 441 | if (respon se.IsSucce ssStatusCo de) | |
| 442 | { | |
| 443 | var re sult = res ponse.Cont ent.ReadAs StringAsyn c().GetAwa iter().Get Result(); | |
| 444 | if (st ring.IsNul lOrEmpty(r esult)) | |
| 445 | { | |
| 446 | // | |
| 447 | } | |
| 448 | else | |
| 449 | { | |
| 450 | va r addressV alidationR esult = De serialize< RootObject Response>( result); | |
| 451 | va r addressD ata = awai t AddressD ataMap.Map AddressDat a(addressV alidationR esult); | |
| 452 | re turn Reque st.CreateR esponse(ad dressData) ; | |
| 453 | } | |
| 454 | } | |
| 455 | var addres sValidatio nError = s tring.Form at("Addres s Validati on Unsucce ssful: " + response. StatusCode .ToString( )); | |
| 456 | HttpError addErr = n ew HttpErr or(address Validation Error); | |
| 457 | return Req uest.Creat eErrorResp onse(HttpS tatusCode. NotFound, addErr); | |
| 458 | ||
| 459 | } | |
| 460 | } | |
| 461 | catch (W ebExceptio n we) | |
| 462 | { | |
| 463 | var addressVal idationErr or = we.To String(); | |
| 464 | Http Error addE rr = new H ttpError(a ddressVali dationErro r); | |
| 465 | retu rn Request .CreateErr orResponse (HttpStatu sCode.NotF ound, addE rr); | |
| 466 | ||
| 467 | } | |
| 468 | catch (H ttpRequest Exception he) | |
| 469 | { | |
| 470 | var addressVal idationErr or = he.To String(); | |
| 471 | Http Error addE rr = new H ttpError(a ddressVali dationErro r); | |
| 472 | retu rn Request .CreateErr orResponse (HttpStatu sCode.NotF ound, addE rr); | |
| 473 | } | |
| 474 | catch (E xception e ) | |
| 475 | { | |
| 476 | var addressVal idationErr or = e.ToS tring(); | |
| 477 | Http Error addE rr = new H ttpError(a ddressVali dationErro r); | |
| 478 | retu rn Request .CreateErr orResponse (HttpStatu sCode.NotF ound, addE rr); | |
| 479 | } | |
| 480 | ||
| 481 | ||
| 482 | } | |
| 483 | */ | |
| 484 | ||
| 485 | ||
| 486 | /* | |
| 487 | pu blic stati c string S erializee< T>(T data) | |
| 488 | { | |
| 489 | var ms = new Memor yStream(); | |
| 490 | var ser = new Data ContractJs onSerializ er(typeof( T)); | |
| 491 | ser.Writ eObject(ms , data); | |
| 492 | var json = ms.ToAr ray(); | |
| 493 | ms.Close (); | |
| 494 | ||
| 495 | return E ncoding.UT F8.GetStri ng(json, 0 , json.Len gth); | |
| 496 | } | |
| 497 | ||
| 498 | pu blic stati c T Deseri alize<T>(s tring json ) | |
| 499 | { | |
| 500 | var ms = new Memor yStream(En coding.UTF 8.GetBytes (json)); | |
| 501 | var ser = new Data ContractJs onSerializ er(typeof( T)); | |
| 502 | var resu lt = (T)se r.ReadObje ct(ms); | |
| 503 | ms.Close (); | |
| 504 | ||
| 505 | return r esult; | |
| 506 | } | |
| 507 | ||
| 508 | pr ivate stat ic HttpCli ent GetHtt pClient() | |
| 509 | { | |
| 510 | var clie ntHandler = new WebR equestHand ler(); | |
| 511 | clientHa ndler.Clie ntCertific ates.Add(G etCertKeyV ault()); | |
| 512 | //client Handler.Cl ientCertif icates.Add (GetLocalC ert()); | |
| 513 | return n ew HttpCli ent(client Handler); | |
| 514 | } | |
| 515 | ||
| 516 | pu blic stati c X509Cert ificate2 G etLocalCer t() | |
| 517 | { | |
| 518 | var stor e = new X5 09Store(St oreName.My , StoreLoc ation.Loca lMachine); | |
| 519 | store.Op en(OpenFla gs.OpenExi stingOnly | OpenFlag s.ReadOnly ); | |
| 520 | string cer tificateSu bjectName = "CN= DNS . URL , OU=PPMS, O=VA, L=W ashington, S=DC, C=U S"; | |
| 521 | var cert = store.C ertificate s.Find(X50 9FindType. FindBySubj ectDisting uishedName , certific ateSubject Name, true ); | |
| 522 | if (cert .Count < 1 ) | |
| 523 | { | |
| 524 | thro w new Exce ption(stri ng.Format( "Could not find a va lid client certifica te with su bject {0}" , certific ateSubject Name)); | |
| 525 | } | |
| 526 | return c ert[0]; | |
| 527 | } | |
| 528 | ||
| 529 | pr ivate stat ic X509Cer tificate2 GetCertKey Vault() | |
| 530 | { | |
| 531 | const st ring appId = "b39bbc 92-24f7-4c 26-961f-fa e26b9290bb "; | |
| 532 | const st ring secre t = "wgnf5 EwiMkDQG37 9L031MLpGm xli+1WHtSd qGuGXGMs=" ; | |
| 533 | const st ring tenan tId = "f7c 49e36-971b -42c7-b244 -a88eed6c0 bf6"; | |
| 534 | //const string cer tUri = "ht tps://vanp eastppmskv 1.vault.us govcloudap i.net/cert ificates/n p-dws-ppms -va-gov-ss lcert/716e 28540d3e45 2d9ed47cf4 053bb790"; | |
| 535 | const st ring certU ri = "http s://vanpea stppmskv1. vault.usgo vcloudapi. net/certif icates/np- dws-ppms-n prod/ca92b a8988c64a6 091d23c6ad bdf1f1a"; | |
| 536 | ||
| 537 | var toke n = GetTok en(appId, secret, te nantId); | |
| 538 | var cert = GetCert ificateFro mKeyVault( token.acce ss_token, certUri); | |
| 539 | var priv ateKey = G etPrivateK eyKeyVault (token.acc ess_token, cert.sid) ; | |
| 540 | ||
| 541 | //return new X509C ertificate 2(privateK ey, (strin g)null); | |
| 542 | return n ew X509Cer tificate2( privateKey , (string) null, X509 KeyStorage Flags.Mach ineKeySet | X509KeyS torageFlag s.PersistK eySet | X5 09KeyStora geFlags.Ex portable); | |
| 543 | } | |
| 544 | ||
| 545 | ||
| 546 | pr ivate stat ic TokenRe sponse Get Token(stri ng clientI d, string clientSecr et, string tenantId) | |
| 547 | { | |
| 548 | using (v ar httpCli ent = new HttpClient ()) | |
| 549 | { | |
| 550 | var formConten t = new Fo rmUrlEncod edContent( new[] | |
| 551 | { | |
| 552 | new KeyVal uePair<str ing, strin g>("resour ce", "http s://vault. usgovcloud api.net"), | |
| 553 | new KeyVal uePair<str ing, strin g>("client _id", clie ntId), | |
| 554 | new KeyVal uePair<str ing, strin g>("client _secret", clientSecr et), | |
| 555 | new KeyVal uePair<str ing, strin g>("grant_ type", "cl ient_crede ntials") | |
| 556 | }); | |
| 557 | ||
| 558 | var response = httpClien t.PostAsyn c("https:/ /login.win dows.net/" + tenantI d + "/oaut h2/token", formConte nt).GetAwa iter().Get Result(); | |
| 559 | ||
| 560 | retu rn Deseria lize<Token Response>( response.C ontent.Rea dAsStringA sync().Res ult); | |
| 561 | } | |
| 562 | } | |
| 563 | ||
| 564 | pu blic stati c Certific ateRespons e GetCerti ficateFrom KeyVault(s tring toke n, string certificat eUrl) | |
| 565 | { | |
| 566 | using (v ar httpCli ent = new HttpClient ()) | |
| 567 | { | |
| 568 | var request = new HttpRe questMessa ge(HttpMet hod.Get, n ew Uri(cer tificateUr l + "?api- version=20 16-10-01") ); | |
| 569 | requ est.Header s.Authoriz ation = ne w Authenti cationHead erValue("B earer", to ken); | |
| 570 | ||
| 571 | var response = httpClien t.SendAsyn c(request) .GetAwaite r().GetRes ult(); | |
| 572 | ||
| 573 | retu rn Deseria lize<Certi ficateResp onse>(resp onse.Conte nt.ReadAsS tringAsync ().GetAwai ter().GetR esult()); | |
| 574 | } | |
| 575 | } | |
| 576 | ||
| 577 | pu blic stati c byte[] G etPrivateK eyKeyVault (string to ken, strin g certific ateUrl) | |
| 578 | { | |
| 579 | using (v ar httpCli ent = new HttpClient ()) | |
| 580 | { | |
| 581 | var request = new HttpRe questMessa ge(HttpMet hod.Get, n ew Uri(cer tificateUr l + "?api- version=20 16-10-01") ); | |
| 582 | requ est.Header s.Authoriz ation = ne w Authenti cationHead erValue("B earer", to ken); | |
| 583 | var response = httpClien t.SendAsyn c(request) .GetAwaite r().GetRes ult(); | |
| 584 | var privateKey = Deseria lize<Priva teKeyRespo nse>(respo nse.Conten t.ReadAsSt ringAsync( ).GetAwait er().GetRe sult()); | |
| 585 | retu rn Convert .FromBase6 4String(pr ivateKey.v alue); | |
| 586 | } | |
| 587 | } | |
| 588 | ||
| 589 | ||
| 590 | } | |
| 591 | ||
| 592 | public class Tok enResponse | |
| 593 | { | |
| 594 | pu blic strin g token_ty pe { get; set; } | |
| 595 | pu blic strin g expires_ in { get; set; } | |
| 596 | pu blic strin g ext_expi res_in { g et; set; } | |
| 597 | pu blic strin g expires_ on { get; set; } | |
| 598 | pu blic strin g not_befo re { get; set; } | |
| 599 | pu blic strin g resource { get; se t; } | |
| 600 | pu blic strin g access_t oken { get ; set; } | |
| 601 | } | |
| 602 | ||
| 603 | public class Cer tificateRe sponse | |
| 604 | { | |
| 605 | pu blic strin g id { get ; set; } | |
| 606 | pu blic strin g kid { ge t; set; } | |
| 607 | pu blic strin g sid { ge t; set; } | |
| 608 | pu blic strin g x5t { ge t; set; } | |
| 609 | pu blic strin g cer { ge t; set; } | |
| 610 | } | |
| 611 | ||
| 612 | public class Pri vateKeyRes ponse | |
| 613 | { | |
| 614 | pu blic strin g value { get; set; } | |
| 615 | } | |
| 616 | */ | |
| 617 | ||
| 618 | ||
| 619 | ||
| 620 | ||
| 621 | } | |
| 622 | } |
Araxis Merge (but not the data content of this report) is Copyright © 1993-2016 Araxis Ltd (www.araxis.com). All rights reserved.