public Profile GetProfile()
        {
            lock (locker)
            {
                var profile = barrel.Get <Profile>("profile");
                profile ??= new Profile
                {
                    Fruit           = (int)Model.Fruit.Apple,
                    Status          = "😍",
                    Name            = string.Empty,
                    FriendCode      = string.Empty,
                    IslandName      = string.Empty,
                    GateClosesAtUTC = DateTime.UtcNow,
                    DodoCode        = string.Empty,
                    GateStatus      = (int)Model.GateStatus.Closed,
                    GatesOpenLength = .5,
                    TimeZone        = string.Empty
                };

                //if(profile.GateStatus != (int)GateStatus.Closed && profile.GateClosesAtUTC < DateTime.UtcNow)
                //{
                //    profile.GateStatus = (int)GateStatus.Closed;
                //    profile.DodoCode = string.Empty;
                //    profile.GatesOpenLength = .5;
                //}

                return(profile);
            }
        }
예제 #2
0
        public async Task <Edition> GetEditionAsync(string id, bool forceRefresh = false)
        {
            var editionFile = $"{id}.json";
            var edition     = _barrel.Get <Edition>(key: editionFile);

            if (await CachedEditionUpToDate(edition) && !forceRefresh)
            {
                return(edition);
            }

            if (_connectivity.NetworkAccess != NetworkAccess.Internet)
            {
                return(edition);
            }

            try
            {
                var editionResponse = await _httpClient.GetStringAsync(editionFile);

                edition = JsonConvert.DeserializeObject <Edition>(editionResponse);

                _barrel.Add(key: editionFile, data: edition, expireIn: TimeSpan.FromDays(999));
                return(edition);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, nameof(GetEditionsAsync));
                return(edition);
            }
        }
        public async Task <Edition> GetEditionAsync(string id, bool forceRefresh = false)
        {
            var editionFile = $"{id}.json";
            var edition     = _barrel.Get <Edition>(key: editionFile);

            var cacheInvalid = !await CachedEditionUpToDate(edition);

            if ((cacheInvalid || forceRefresh) &&
                _connectivity.NetworkAccess == NetworkAccess.Internet)
            {
                try
                {
                    // get from the interwebs
                    var editionResponse = await _httpClient.GetStringAsync(editionFile);

                    edition = JsonConvert.DeserializeObject <Edition>(editionResponse);

                    _barrel.Add(key: editionFile, data: edition, expireIn: TimeSpan.FromDays(999));
                    //return edition;
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, nameof(GetEditionsAsync));
                    //return edition;
                }
            }

            CheckEditionForSavedArticles(edition);
            return(edition);
        }
예제 #4
0
 public static Profile GetProfile()
 {
     lock (locker)
     {
         var profile = barrel.Get <Profile>("profile");
         return(profile ?? new Profile());
     }
 }
예제 #5
0
 public static Person GetPerson()
 {
     lock (_locker)
     {
         var person = _barrel.Get <Person>("person");
         return(person ?? new Person());
     }
 }
예제 #6
0
        public void GetStringTest()
        {
            //Saves the cache and pass it a timespan for expiration
            barrel.Add(key: url, data: json, expireIn: TimeSpan.FromDays(1));


            var cached = barrel.Get <string>(url);

            Assert.IsNotNull(cached);
        }
예제 #7
0
        public async Task <IEnumerable <PlayerDTO> > GetPlayers(string team)
        {
            var key = $"{this.ToString()}/{nameof(GetPlayers)}/{team}";

            if (!_barrel.IsExpired(key: key))
            {
                return(_barrel.Get <IEnumerable <PlayerDTO> >(key: key));
            }

            var data = await _playersService.GetPlayers(team);

            AddToCache(_barrel, key, data);

            return(data);
        }
예제 #8
0
 public Profile GetProfile()
 {
     lock (locker)
     {
         var profile = barrel.Get <Profile>("profile");
         return(profile ?? new Profile
         {
             Fruit = (int)Model.Fruit.Apple,
             Status = "😍",
             Name = string.Empty,
             FriendCode = string.Empty,
             IslandName = string.Empty,
             TimeZone = string.Empty
         });
     }
 }
예제 #9
0
 public ObservableCollection <T> GetMonkey <T>(string nameMonkey) where T : Entity
 {
     if (file.Exists(nameMonkey))
     {
         var enumerableMonkey = file.Get <ObservableCollection <T> >(nameMonkey);
         return(enumerableMonkey);
     }
     return(null);
 }
예제 #10
0
        public static T Get <T>(this IBarrel source, string key, T defaultValue)
        {
            if (string.IsNullOrWhiteSpace(key) || !source.Exists(key))
            {
                return(defaultValue);
            }

            return(source.Get <T>(key));
        }
예제 #11
0
        public Task <IList <IPlaylist> > GetPlaylists()
        {
            var playlists = _barrel.Get <IList <IPlaylist> >("playlists");

            if (playlists == null)
            {
                playlists = new List <IPlaylist>();
            }
            return(Task.FromResult(playlists));
        }
예제 #12
0
        /// <summary>
        /// WebAPIから県別のデータを取得する.
        /// </summary>
        /// <returns></returns>
        public async Task <IEnumerable <Prefecture> > GetPrefectures()
        {
            try
            {
                //キャッシュが存在して,有効期間内の場合はキャッシュから
                if (!_barrel.IsExpired(key: CachePrefecturesKey))
                {
                    await Task.Yield();

                    return(_barrel.Get <IEnumerable <Prefecture> >(key: CachePrefecturesKey));
                }

                //インターネットに接続してれば取得
                if (Connectivity.NetworkAccess == NetworkAccess.Internet)
                {
                    //WebAPIからデータ取得
                    var prefecturesData = await _httpClient.GetFromJsonAsync <IEnumerable <Prefecture> >("prefectures");

                    //キャッシュを更新.キャッシュの有効期限を設定
                    _barrel.Add(key: CachePrefecturesKey, data: prefecturesData, expireIn: TimeSpan.FromMinutes(10));

                    return(prefecturesData);
                }

                //インターネットにも接続してないし,キャッシュも有効期限切れだった場合
                //それでも有効期限切れのキャッシュデータを返すか.
                if (_barrel.Exists(key: CachePrefecturesKey))
                {
                    //とりあえず返すことにした.
                    return(_barrel.Get <IEnumerable <Prefecture> >(key: CachePrefecturesKey));
                }

                return(new List <Prefecture>());
            }
            catch
            {
                throw;
            }
        }
예제 #13
0
        /// <summary>
        /// Find element in file store
        /// </summary>
        /// <typeparam name="T">type element savind in file store</typeparam>
        /// <param name="nameMonkey">name with the save element in file store</param>
        /// <returns></returns>
        public ConfigurationItem <T> GetMonkey <T>(string nameMonkey)
        {
            if (file.Exists(nameMonkey))
            {
                return(new ConfigurationItem <T>()
                {
                    IsExpired = file.IsExpired(nameMonkey),
                    Item = file.Get <T>(nameMonkey)
                });
            }

            return(null);
        }
예제 #14
0
        private async Task <string> GetJsonAsync(string resource, Xamarin.Essentials.NetworkAccess networkAccess, int cacheDuration = 24)
        {
            var cleanCacheKey = resource.CleanCacheKey();

            //Try Get data from Cache
            var cachedData = _cacheBarrel.Get <string>(cleanCacheKey);

            if (cacheDuration > 0 && cachedData != null)
            {
                //If the cached data is still valid
                if (!_cacheBarrel.IsExpired(cleanCacheKey))
                {
                    return(cachedData);
                }
            }

            //Check for internet connection and return cached data if possible
            if (networkAccess != NetworkAccess.Internet)
            {
                if (cachedData != null)
                {
                    return(cachedData);
                }
                else
                {
                    throw new InternetConnectionException();
                }
            }

            //No Cache Found, or Cached data was not required, or Internet connection is also available
            //Extract response from URI
            var response = await _httpClient.GetAsync(new Uri(_httpClient.BaseAddress, resource));

            response.EnsureSuccessStatusCode();

            //Read Response
            string json = await response.Content.ReadAsStringAsync();

            //Save to Cache if required
            if (cacheDuration > 0)
            {
                try
                {
                    _cacheBarrel.Add(cleanCacheKey, json, TimeSpan.FromHours(cacheDuration));
                }
                catch { }
            }

            //Return the result
            return(json);
        }
예제 #15
0
        public static T GetOrCreate <T>(this IBarrel barrel, string key, T defaultValue, TimeSpan timeSpan = default)
        {
            if (string.IsNullOrWhiteSpace(key) || !barrel.Exists(key))
            {
                if (timeSpan == default)
                {
                    timeSpan = TimeSpan.MaxValue;
                }
                barrel.Add(key, defaultValue, timeSpan);
                return(defaultValue);
            }

            return(barrel.Get <T>(key));
        }
        public async Task <Edition> GetEditionAsync(string id, bool forceRefresh = false)
        {
            //_logger.Log(LogLevel.Information, $"Getting Edition {id}");
            var editionFile = $"{id}.json";
            var edition     = _barrel.Get <Edition>(key: editionFile);

            var cacheInvalid = !await CachedEditionUpToDate(edition);

            if ((cacheInvalid || forceRefresh) &&
                _connectivity.NetworkAccess == NetworkAccess.Internet)
            {
                try
                {
                    //_logger.Log(LogLevel.Information, $"  Getting {id} from the web");
                    // get from the interwebs
                    var editionResponse = await _httpClient.GetStringAsync(editionFile);

                    edition = JsonConvert.DeserializeObject <Edition>(editionResponse);

                    _barrel.Add(key: editionFile, data: edition, expireIn: TimeSpan.FromDays(999));
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, nameof(GetEditionsAsync));
                    _analytics.TrackError(ex, new Dictionary <string, string> {
                        { Constants.Analytics.Properties.FileName, editionFile }
                    });
                }
            }

            if (edition != null) // smelly??!?!
            {
                CheckEditionForSavedArticles(edition);
            }

            return(edition);
        }
예제 #17
0
        public Task <IEnumerable <IPlaylist> > GetAll()
        {
            try
            {
                if (!_barrel.Exists("playlists"))
                {
                    _barrel.Add <IEnumerable <IPlaylist> >("playlists", new List <IPlaylist>(), TimeSpan.MaxValue);
                }

                var items = _barrel.Get <IEnumerable <IPlaylist> >("playlists");
                return(Task.FromResult(items));
            }
            catch
            { }
            return(Task.FromResult <IEnumerable <IPlaylist> >(null));
        }
예제 #18
0
        public override User GetUser(string userPid)
        {
            User user = null;

            if (!_barrel.IsExpired(userPid))
            {
                user = _barrel.Get <User>(userPid);
            }
            else
            {
                user = base.GetUser(userPid);
                _barrel.Add(userPid, user, TimeSpan.FromDays(_expiryLengthDays));
            }

            return(user);
        }
예제 #19
0
        public CommentEntity GetCached(string videoId)
        {
            var commentDbId = videoId + "_c";

            return(_barrel.Get <CommentEntity>(commentDbId));
        }
예제 #20
0
        /// <summary>
        /// Send a cached requests
        /// </summary>
        /// <param name="http">Http client ot use</param>
        /// <param name="barrel">Barrel to use for cache</param>
        /// <param name="req">request to send</param>
        /// <param name="expireIn">expire in</param>
        /// <param name="forceUpdate">If we should force the update or not</param>
        /// <param name="throttled">If throttled or not</param>
        /// <returns>The new or cached response.</returns>
        public static async Task <string> SendCachedAsync(this HttpClient http, IBarrel barrel, HttpRequestMessage req, TimeSpan expireIn, bool forceUpdate = false, bool throttled = true)
        {
            var url = req.RequestUri.ToString();

            var contents = barrel.Get <string>(url);
            var eTag     = barrel.GetETag(url);

            if (!forceUpdate && !string.IsNullOrEmpty(contents) && !barrel.IsExpired(url))
            {
                return(contents);
            }

            var etag = eTag ?? null;

            if (throttled)
            {
                await getThrottle.WaitAsync();
            }

            HttpResponseMessage r;
            string c = null;

            try {
                if (!forceUpdate && !string.IsNullOrEmpty(etag) && !string.IsNullOrEmpty(contents))
                {
                    req.Headers.IfNoneMatch.Clear();
                    req.Headers.IfNoneMatch.Add(new EntityTagHeaderValue(etag));
                }

                r = await http.SendAsync(req);

                if (r.StatusCode == HttpStatusCode.NotModified)
                {
                    if (string.IsNullOrEmpty(contents))
                    {
                        throw new IndexOutOfRangeException($"Cached value missing for HTTP request: {url}");
                    }

                    return(contents);
                }

                c = await r.Content.ReadAsStringAsync();
            } finally {
                if (throttled)
                {
                    getThrottle.Release();
                }
            }

            if (r.StatusCode == HttpStatusCode.OK)
            {
                // Cache it?
                var newEtag = r.Headers.ETag != null ? r.Headers.ETag.Tag : null;
                if (!string.IsNullOrEmpty(newEtag) && newEtag != etag)
                {
                    barrel.Add(url, c, expireIn, newEtag);
                }

                return(c);
            }
            else
            {
                throw new HttpCacheRequestException(r.StatusCode, "HTTP Cache Request Failed");
            }
        }
예제 #21
0
 public Task <T> Get <T>(string key, CancellationToken cancellationToken = default)
 {
     return(Task.FromResult(_barrel.Get <T>(key)));
 }