public Recipe GetRecipe(string token, Guid recipeGuid)
        {
            Guid userGuid = Guid.Parse(JwtCookieManager.GetUserGuid(token));

            if (_recipeCache.ContainsKey(userGuid) && _recipeCache[userGuid].ContainsKey(recipeGuid))
            {
                string file = _recipeCache[userGuid][recipeGuid];
                return(JsonConvert.DeserializeObject <Recipe>(File.ReadAllText(file)));
            }

            return(_backingProvider.GetRecipe(token, recipeGuid));
        }
        public Content GetContent(string token, Guid contentGuid)
        {
            Guid userGuid = Guid.Parse(JwtCookieManager.GetUserGuid(token));

            if (_contentCache.ContainsKey(userGuid) && _contentCache[userGuid].ContainsKey(contentGuid))
            {
                string file = _contentCache[userGuid][contentGuid];
                return(JsonConvert.DeserializeObject <Content>(File.ReadAllText(file)));
            }

            return(_backingProvider.GetContent(token, contentGuid));
        }
        private bool SaveWeenie(string token, Weenie weenie)
        {
            if (_weenieCache == null)
            {
                throw new ApplicationException("Sandboxing is not configured correctly.  See error logs for details.");
            }

            string userGuidString = JwtCookieManager.GetUserGuid(token);
            Guid   userGuid       = Guid.Parse(userGuidString);
            string weenieFolder   = Path.Combine(_cacheDirectory, "weenies", userGuid.ToString());

            if (!Directory.Exists(weenieFolder))
            {
                Directory.CreateDirectory(weenieFolder);
            }

            WeenieChange wc         = null;
            string       weenieFile = Path.Combine(weenieFolder, $"{weenie.WeenieClassId}.json");

            if (File.Exists(weenieFile))
            {
                // replace the weenie
                wc           = JsonConvert.DeserializeObject <WeenieChange>(File.ReadAllText(weenieFile));
                wc.Weenie    = weenie;
                wc.Submitted = false;
            }
            else
            {
                wc                = new WeenieChange();
                wc.UserGuid       = JwtCookieManager.GetUserGuid(token);
                wc.Weenie         = weenie;
                wc.UserName       = JwtCookieManager.GetUserDisplayName(token);
                wc.SubmissionTime = DateTime.Now;
            }

            string content = JsonConvert.SerializeObject(wc);

            File.WriteAllText(weenieFile, content);

            if (!_weenieCache.ContainsKey(userGuid))
            {
                _weenieCache.TryAdd(userGuid, new Dictionary <uint, string>());
            }

            if (!_weenieCache[userGuid].ContainsKey(weenie.WeenieClassId))
            {
                _weenieCache[userGuid].Add(weenie.WeenieClassId, weenieFile);
            }

            return(true);
        }
        public WeenieChange GetMySandboxedChange(string token, uint weenieClassId)
        {
            string userGuidString = JwtCookieManager.GetUserGuid(token);
            Guid   userGuid       = Guid.Parse(userGuidString);

            if (_weenieCache.ContainsKey(userGuid) && _weenieCache[userGuid].ContainsKey(weenieClassId))
            {
                string       fileName = _weenieCache[userGuid][weenieClassId];
                WeenieChange wc       = JsonConvert.DeserializeObject <WeenieChange>(File.ReadAllText(fileName));
                return(wc);
            }

            return(null);
        }
        public Weenie GetWeenie(string token, uint weenieClassId)
        {
            if (token != null)
            {
                string userGuidString = JwtCookieManager.GetUserGuid(token);

                Guid userGuid = Guid.Parse(userGuidString);

                if (_weenieCache != null && _weenieCache.ContainsKey(userGuid) &&
                    _weenieCache[userGuid].ContainsKey(weenieClassId))
                {
                    string       file = _weenieCache[userGuid][weenieClassId];
                    WeenieChange wc   = JsonConvert.DeserializeObject <WeenieChange>(File.ReadAllText(file));
                    return(wc.Weenie);
                }
            }

            return(_backingProvider.GetWeenie(token, weenieClassId));
        }
        public List <WeenieChange> GetMyWeenieChanges(string token)
        {
            string userGuidString    = JwtCookieManager.GetUserGuid(token);
            Guid   userGuid          = Guid.Parse(userGuidString);
            List <WeenieChange> mine = new List <WeenieChange>();

            if (_weenieCache.ContainsKey(userGuid))
            {
                var c = _weenieCache[userGuid];
                foreach (var file in c.Values)
                {
                    var wc = JsonConvert.DeserializeObject <WeenieChange>(File.ReadAllText(file));
                    if (wc != null)
                    {
                        mine.Add(wc);
                    }
                }
            }

            return(mine);
        }
        public ApiAccountModel GetAccount(string token, string accountGuid)
        {
            RestRequest request;

            if (string.IsNullOrWhiteSpace(accountGuid))
            {
                accountGuid = JwtCookieManager.GetUserGuid(token);
            }

            if (JwtCookieManager.GetUserGuid(token).ToLower() == accountGuid.ToLower())
            {
                // bypass the admin api if we're asking for our own account
                request = BuildRequest("/Account/GetMyAccount", Method.GET, token);
            }
            else
            {
                request = BuildRequest("/Account/Get", Method.GET, token);
                request.AddQueryParameter("accountGuid", accountGuid);
            }

            var response = _client.Execute(request);

            if (response.StatusCode == HttpStatusCode.OK)
            {
                return(JsonConvert.DeserializeObject <ApiAccountModel>(response.Content));
            }
            if (response.StatusCode == HttpStatusCode.Unauthorized)
            {
                throw new ApplicationException("Destination server disallowed your request.");
            }
            if (response.StatusCode == HttpStatusCode.NotFound)
            {
                return(null);
            }

            throw new ApplicationException($"Unexpected response {response.StatusCode} from server.  Content: {response.Content}.");
        }