using System.Collections.Generic; using System.Globalization; using System.Linq; using Filtr.Core.FacebookUsers; using Filtr.Core.FacebookUsers.Data; using Sony.Filtr.DistributedCaching; namespace Sony.Filtr.Core.Facebook { public class FacebookUserManager { private readonly FacebookUserFactory factory; private readonly DistributedCacheHandler cacheHandler; private HashSet cachedCultures = new HashSet(); public FacebookUserManager(FacebookUserFactory factory, DistributedCacheHandler cacheHandler) { this.factory = factory; this.cacheHandler = cacheHandler; } public void SaveFacebookUser(FacebookUser facebookUser) { factory.SaveFacebookUser(facebookUser); ClearCache(); } public List GetFacebookUsers(CultureInfo culture) { var cacheKey = GetCacheKey(culture); var facebookUsers = cacheHandler.GetList(cacheKey) as List; if (facebookUsers == null) { if (culture != null) { facebookUsers = GetFacebookUsers(null); } else { var internalFacebookUsers = factory.GetFacebookUsers(); facebookUsers = internalFacebookUsers.Select(u => u.NativeFacebookUserInfo).ToList(); } if (culture != null) facebookUsers = facebookUsers.Where(u => u.Culture != null && IsSameCountry(u.Culture, culture)).ToList(); facebookUsers = facebookUsers.OrderBy(u => u.FirstName).ThenBy(u => u.LastName).ToList(); cacheHandler.PutList(cacheKey, facebookUsers); } return facebookUsers; } private static bool IsSameCountry(CultureInfo cultureInfo, CultureInfo culture) { //TODO: check neutral culture. var region1 = new RegionInfo(cultureInfo.LCID); var region2 = new RegionInfo(culture.LCID); return region1.TwoLetterISORegionName == region2.TwoLetterISORegionName; } public string GetCacheKey(CultureInfo culture) { if (culture != null) cachedCultures.Add(culture); return "FacebookUsers" + (culture != null ? culture.Name : "null"); } private void ClearCache() { cacheHandler.Remove(GetCacheKey(null)); foreach (var cachedCulture in cachedCultures) { cacheHandler.Remove(GetCacheKey(cachedCulture)); } } } }