25. EPMO Open Source Coordination Office Redaction File Detail Report

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.

25.1 Files compared

# 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

25.2 Comparison summary

Description Between
Files 1 and 2
Text Blocks Lines
Unchanged 3 1238
Changed 2 6
Inserted 0 0
Removed 0 0

25.3 Comparison options

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

25.4 Active regular expressions

No regular expressions were active.

25.5 Comparison detail

  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   }