Ejemplo n.º 1
0
        /// <summary>
        /// Récupère les données du WS et décode le JSON dans la bonne instance
        /// </summary>
        /// <returns>The data.</returns>
        public async Task <List <T> > GetData(Func <JsonObject, T> DecodeJSONObject,
                                              Func <JsonPrimitive, T> DecodeJSONPrimitive,
                                              bool isInCache   = true,
                                              int?RecordsCount = null)
        {
            // On checke la présence de la table SI on veut stocker les données en local
            if (isInCache)
            {
                sqlData.CreateTable();
            }

            List <T> instances = new List <T>();

            // MODE CONNECTE
            if (!IsHorsConnexion)
            {
                // Attention : on vide en fonction du type de données
                // La donnée peut être IsManifFiltered :
                //      Dans ce cas, on purge la donnée where idManif = idManif de la donnée
                // ou IsParticipantFiltered, IsPrestationFiltered...
                if (isInCache)
                {
                    sqlData.PurgeDataWithParameters(this.IdManif, this.IdPrestation, this.IdParticipant);
                }


                // Creates HTTP web request
                string url = Global.GetUrlBase() + this.ActionUrl;


                // On récupère les données (ou la page de données)
                if (RecordsCount == null)
                {
                    instances.AddRange(await getPagedData(DecodeJSONObject, DecodeJSONPrimitive, url, isInCache, null, null));
                }
                else
                {
                    // On pagine
                    int nbRecords   = RecordsCount.Value;
                    int startRecord = 0;
                    while (nbRecords == RecordsCount)
                    {
                        // On récupère la page
                        var pagedInstances = await getPagedData(DecodeJSONObject, DecodeJSONPrimitive, url, isInCache, startRecord, RecordsCount);

                        // Attention : le WS a été mal codé ! Il renvoie un doubon pour le premier élément !
                        // Pour éviter le problème, on va vérifier si le 1er élément trouvé n'est pas déjà dans la liste...
                        if (pagedInstances != null &&
                            pagedInstances.Count > 0 &&
                            instances.Where(x => x.Id == pagedInstances.First().Id).Any())
                        {
                            // On retire le premier
                            pagedInstances.Remove(pagedInstances.First());
                        }

                        instances.AddRange(pagedInstances);
                        nbRecords    = pagedInstances.Count;
                        startRecord += nbRecords;
                    }
                }
            }

            return(instances);
        }