Example #1
0
        public LinkTokenResponse GetLinkToken()
        {
            LinkTokenResponse linkTokenResponse = null;

            try
            {
                LinkTokenParam obj = new LinkTokenParam();
                obj.ClientId   = ClientId;
                obj.Secret     = Secret;
                obj.ClientName = "Plaid App";
                obj.User       = new User {
                    ClientUserId = "test_user"
                };
                obj.Products     = new string[] { "auth" };
                obj.CountryCodes = new string[] { "GB", "US" };
                obj.Language     = "en";

                IRestResponse response = RestCall(string.Format("{0}/link/token/create", ApiUrl), obj);
                linkTokenResponse = JsonConvert.DeserializeObject <LinkTokenResponse>(response.Content);
            }
            catch (Exception ex)
            {
            }

            return(linkTokenResponse);
        }
        public ActionResult Connection()
        {
            if (Session["LoginDtl"] != null)
            {
                tblUser loginDtl = (tblUser)Session["LoginDtl"];
            }

            if (Session["LinkToken"] != null)
            {
                ViewBag.LinkToken = Session["LinkToken"];
            }
            else
            {
                LinkTokenResponse linkResponse = null;
                linkResponse = helper.GetLinkToken();
                if (linkResponse != null)
                {
                    ViewBag.LinkToken    = linkResponse.LinkToken;
                    Session["LinkToken"] = linkResponse.LinkToken;
                }
            }
            using (PlaidEntities DB = new PlaidEntities())
            {
                List <tblInstance> Instances = DB.tblInstances.Select(x => x).ToList <tblInstance>();
                return(View(Instances));
            }
        }
        public ActionResult Connection()
        {
            tblUser loginDtl = null;

            if (Session["LoginDtl"] != null)
            {
                loginDtl = (tblUser)Session["LoginDtl"];
            }

            if (Session["LinkToken"] != null)
            {
                ViewBag.LinkToken = Session["LinkToken"];
            }
            else
            {
                LinkTokenResponse linkResponse = null;
                linkResponse = helper.GetLinkToken();
                if (linkResponse != null)
                {
                    ViewBag.LinkToken    = linkResponse.LinkToken;
                    Session["LinkToken"] = linkResponse.LinkToken;
                }
            }
            using (PlaidEntities DB = new PlaidEntities())
            {
                var instanceCollection = DB.tblInstances.Where(item => item.UserId == loginDtl.Id).Select(instance => new
                {
                    instance.ConnectionId,
                    instance.InstanceId,
                    instance.InstanceName,
                    AccessToken = instance.AccessToken.Trim()
                }).AsEnumerable().Select(x => new
                {
                    ConnectionId = x.ConnectionId,
                    InstanceId   = x.InstanceId,
                    InstanceName = x.InstanceName,
                    AccessToken  = Base64Decode(x.AccessToken.ToString())
                });
                if (instanceCollection?.Count() > 0)
                {
                    int index = 0;
                    Task <KeyValuePair <string, List <HoldingDisplay> > >[] concurrentTasks = new Task <KeyValuePair <string, List <HoldingDisplay> > > [instanceCollection.Count()];
                    foreach (var instance in instanceCollection)
                    {
                        concurrentTasks[index] = Task.Run(() => GetHoldingResponse(instance.AccessToken));
                        index++;
                        if (index == instanceCollection.Count())
                        {
                            break;
                        }
                    }
                    try
                    {
                        Task.WaitAll(concurrentTasks);
                        if (concurrentTasks != null)
                        {
                            ConcurrentDictionary <string, List <HoldingDisplay> > allThreadSafeHoldings = new ConcurrentDictionary <string, List <HoldingDisplay> >();
                            Parallel.ForEach(concurrentTasks, (task) =>
                            {
                                if (task != null && task.IsCompleted && !task.IsFaulted && !task.IsCanceled &&
                                    task.Status == TaskStatus.RanToCompletion)
                                {
                                    KeyValuePair <string, List <HoldingDisplay> > keyValuePair = task.Result;
                                    allThreadSafeHoldings.TryAdd(keyValuePair.Key, keyValuePair.Value);
                                }
                            });

                            if (allThreadSafeHoldings?.Count > 0)
                            {
                                List <HoldingDisplayExt> allHoldings = (from eachKeyValuePair in allThreadSafeHoldings
                                                                        where eachKeyValuePair.Value?.Count > 0
                                                                        from value in eachKeyValuePair.Value
                                                                        select new HoldingDisplayExt(value)
                                {
                                    ConnectionId = instanceCollection.First(o => o.AccessToken.Equals(eachKeyValuePair.Key)).ConnectionId,
                                    InstanceId = instanceCollection.First(o => o.AccessToken.Equals(eachKeyValuePair.Key)).InstanceId,
                                    InstanceName = instanceCollection.First(o => o.AccessToken.Equals(eachKeyValuePair.Key)).InstanceName,
                                })
                                                                       .ToList();

                                ViewBag.ClientId           = ClientId;
                                ViewBag.Secret             = Secret;
                                ViewBag.ApiUrl             = ApiUrl;
                                ViewBag.LinkToken          = Session["LinkToken"];
                                ViewBag.InstanceCollection = instanceCollection;
                                return(View("holding", allHoldings));

                                //return View("holding", allHoldings.OrderByDescending(o => o.ConnectionId));
                            }
                            else
                            {
                                TempData["error"] = "Error occurred to process all holding data simultaneously.";
                                return(View("holding", null));
                            }
                        }
                        else
                        {
                            TempData["error"] = "Error occurred to get all holding data simultaneously.";
                            return(View("holding", null));
                        }
                    }
                    catch (System.AggregateException agEx)
                    {
                        if (agEx.InnerExceptions?.Count > 0)
                        {
                            TempData["error"] = agEx.Flatten().Message;
                        }
                        return(View("holding", null));
                    }
                    catch (System.Exception ex)
                    {
                        TempData["error"] = ex.Message;
                        return(View("holding", null));
                    }
                }
                else
                {
                    TempData["error"] = "No instance(s) found in DB.";
                    return(View("holding", null));
                }
            }
        }