// Combine data to conform a valid swcharacter view model
        public SWCharacter GenerateNewCharacter(int id, SWCharRootObject charRoot, SWPlanetRootObject planetRoot)
        {
            SWCharacter character = new SWCharacter()
            {
                Id         = id,
                Name       = charRoot.name,
                Height     = int.Parse(charRoot.height),
                Mass       = float.Parse(charRoot.mass),
                Hair_Color = charRoot.hair_color,
                Skin_Color = charRoot.skin_color,
                Eye_Color  = charRoot.eye_color,
                Birth_Year = charRoot.birth_year,
                Gender     = charRoot.gender,
                HomeWorld  = new SWHomeWorld()
                {
                    Name = planetRoot.name, Population = planetRoot.population, Know_Residents_Count = planetRoot.residents.Count()
                },

                Species_Name = charRoot.species.First(),

                Average_Rating = 1,

                Max_Rating = 1
            };

            return(character);
        }
        public async Task <ActionResult <SWCharacter> > GetById(int id)
        {
            // invalid parameter passed case
            if (id < 1)
            {
                return(NotFound());
            }
            SWCharacter myCharacter;

            //access cache
            if (!_cache.TryGetValue(id, out SWCharacter characterCacheEntry))
            {
                //entity not stored in cache , retrieve and cache it.
                //...
                SWCharRootObject myChar = await _swapiService.PopulateCharacterData(id);

                // retrieve character's planet data , extract id from character root object  homeplanet slot.

                string planetId = Regex.Match(myChar.homeworld, @"\d+").Value;

                SWPlanetRootObject itsPlanet = await _swapiService.PopulatePlanetData(int.Parse(planetId));

                //Generate a Character viewModel using populated data from swapi...

                myCharacter = _swapiService.GenerateNewCharacter(id, myChar, itsPlanet);

                //replace path to species with  species name

                string speciesId = Regex.Match(myCharacter.Species_Name, @"\d+").Value;

                myCharacter.Species_Name = await _swapiService.GetSpeciesName(int.Parse(speciesId));

                myCharacter.Average_Rating = 1;
                myCharacter.Max_Rating     = 1;

                //generate options required by memcache module...
                var cacheEntryOptions = new MemoryCacheEntryOptions()
                                        // Set cache entry size by extension method.
                                        .SetSize(1)
                                        // Keep in cache for this time, reset time if accessed.
                                        .SetSlidingExpiration(TimeSpan.FromSeconds(3600));

                // finaly , store it in memcache...
                _cache.Set(id, myCharacter, cacheEntryOptions);
            }
            else
            {
                // cache entry found...
                myCharacter = characterCacheEntry;
            }



            if (myCharacter == null)
            {
                return(NotFound());
            }
            else
            {
                return(myCharacter);
            }
        }