Пример #1
0
 internal unsafe static extern int AcquireCredentialsHandleW(
     [In] string principal,
     [In] string moduleName,
     [In] int usage,
     [In] void *logonID,
     [In] ref AuthIdentity authdata,
     [In] void *keyCallback,
     [In] void *keyArgument,
     ref SSPIHandle handlePtr,
     [Out] out long timeStamp
     );
Пример #2
0
        public RecipeBrief[] GetRecipeQueue(AuthIdentity identity)
        {
            using (var session = GetSession())
            {
                var dbRecipes = session.QueryOver <QueuedRecipes>()
                                .Fetch(prop => prop.Recipe).Eager
                                .Where(p => p.UserId == identity.UserId)
                                .List();

                return((from r in dbRecipes select r.Recipe.AsRecipeBrief()).ToArray());
            }
        }
Пример #3
0
 void SwitchToFacebookUserInternal()
 {
     _console.LogD(string.Format("Switching to FB user, token: {0}", AccessToken.CurrentAccessToken.TokenString));
     GetSocial.User.SwitchUser(AuthIdentity.CreateFacebookIdentity(AccessToken.CurrentAccessToken.TokenString),
                               () =>
     {
         _console.LogD("Successfully switched to FB user");
         demoController.FetchCurrentUserData();
         SetFacebookUserDetails();
     },
                               error => _console.LogE("Switching to FB user failed, reason: " + error));
 }
Пример #4
0
        public ShoppingList[] GetShoppingLists(AuthIdentity identity, IList <ShoppingList> lists, GetShoppingListOptions options)
        {
            using (var session = GetSession())
            {
                var loadDef = true;
                var query   = session.QueryOver <Models.ShoppingLists>()
                              .Where(p => p.UserId == identity.UserId);

                if (lists != null) // Load individual lists
                {
                    loadDef = lists.Contains(ShoppingList.Default);
                    var ids = lists.Where(l => l.Id.HasValue).Select(l => l.Id.Value).ToArray();
                    query = query.AndRestrictionOn(x => x.ShoppingListId).IsInG(ids);
                }

                var dbLists = query.List();
                var ret     = new List <ShoppingList>();

                if (loadDef)
                {
                    ret.Add(ShoppingList.Default);
                }

                ret.AddRange(dbLists.Select(l => l.AsShoppingList()));

                if (!options.LoadItems) // We're done!
                {
                    return(ret.ToArray());
                }

                // Load items into each list
                ICriterion filter = (loadDef
               ? Expression.Or(Expression.IsNull("ShoppingList"), Expression.InG("ShoppingList", dbLists)) // Menu can be null, or in loaded menu list
               : Expression.InG("ShoppingList", dbLists));                                                 // Menu must be in loaded menu list

                var dbItems = session.QueryOver <ShoppingListItems>()
                              .Fetch(prop => prop.Ingredient).Eager
                              .Fetch(prop => prop.Recipe).Eager
                              .Where(p => p.UserId == identity.UserId)
                              .Where(filter)
                              .List();

                return(ret.Select(m =>
                                  new ShoppingList(
                                      m.Id,
                                      m.Title,
                                      (m.Id.HasValue
                     ? dbItems.Where(f => f.ShoppingList != null && f.ShoppingList.ShoppingListId == m.Id)
                     : dbItems.Where(f => f.ShoppingList == null)).Select(r => r.AsShoppingListItem())
                                      )).ToArray());
            }
        }
Пример #5
0
        public MenuResult CreateMenu(AuthIdentity identity, Menu menu, params Guid[] recipeIds)
        {
            using (var session = GetSession())
            {
                menu.Title = menu.Title.Trim();
                var ret = new MenuResult();

                using (var transaction = session.BeginTransaction())
                {
                    Models.Menus dbMenu;
                    var          dupes = session.QueryOver <Models.Menus>()
                                         .Where(p => p.UserId == identity.UserId)
                                         .Where(p => p.Title == menu.Title)
                                         .ToRowCountQuery()
                                         .RowCount();

                    if (dupes > 0)
                    {
                        throw new MenuAlreadyExistsException();
                    }

                    session.Save(dbMenu = new Models.Menus
                    {
                        UserId      = identity.UserId,
                        Title       = menu.Title,
                        CreatedDate = DateTime.Now,
                    });

                    foreach (var rid in recipeIds.NeverNull())
                    {
                        var fav = new Favorites
                        {
                            UserId = identity.UserId,
                            Recipe = new Models.Recipes()
                            {
                                RecipeId = rid
                            },
                            Menu = dbMenu
                        };

                        session.Save(fav);
                    }

                    transaction.Commit();

                    ret.MenuCreated = true;
                    ret.NewMenuId   = dbMenu.MenuId;
                }

                return(ret);
            }
        }
Пример #6
0
 void AddCustomUserIdentity()
 {
     GetSocial.User.AddAuthIdentity(
         AuthIdentity.CreateCustomIdentity(CustomProviderId, _customUserId, _customProviderToken),
         () =>
     {
         _console.LogD("Successfully added custom identity");
         demoController.FetchCurrentUserData();
     },
         error => _console.LogE(string.Format("Failed to add user identity '{0}', reason: {1}", CustomProviderId,
                                              error)),
         OnAddUserIdentityConflict);
 }
Пример #7
0
 void AddFacebookUserIdentityInternal()
 {
     _console.LogD(string.Format("Adding FB identity, token: {0}", AccessToken.CurrentAccessToken.TokenString));
     GetSocial.User.AddAuthIdentity(AuthIdentity.CreateFacebookIdentity(AccessToken.CurrentAccessToken.TokenString),
                                    () =>
     {
         _console.LogD("Successfully added Facebook Identity");
         demoController.FetchCurrentUserData();
         SetFacebookUserDetails();
     },
                                    error => _console.LogE("Adding Facebook identity failed, reason: " + error),
                                    OnAddUserIdentityConflict);
 }
Пример #8
0
        private void OnGetSocialInitialized()
        {
            var user         = FirebaseAuth.DefaultInstance.CurrentUser;
            var token        = Cyphering.GetHashByKey(Credentials.HASH_SECRET, user.UserId);
            var authIdentity = AuthIdentity.CreateCustomIdentity(user.ProviderId, user.UserId, token);

            GetSocial.User.AddAuthIdentity(authIdentity, SetGetSocialNameAndAvatar,
                                           error => { Utils.ShowMessage("News Feed Login Failed"); },
                                           conflict =>
            {
                GetSocial.User.SwitchUser(authIdentity,
                                          SetGetSocialNameAndAvatar,
                                          error => { Utils.ShowMessage("News Feed Login Failed"); });
            });
        }
Пример #9
0
        public void DeleteMenus(AuthIdentity identity, params Guid[] menuIds)
        {
            using (var session = GetSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var dbMenu = session.QueryOver <Models.Menus>()
                                 .AndRestrictionOn(p => p.MenuId).IsInG(menuIds)
                                 .Where(p => p.UserId == identity.UserId)
                                 .Fetch(prop => prop.Recipes).Eager()
                                 .List();

                    dbMenu.ForEach(session.Delete);
                    transaction.Commit();
                }
            }
        }
Пример #10
0
        public void DeleteShoppingLists(AuthIdentity identity, ShoppingList[] lists)
        {
            if (!lists.Any())
            {
                throw new ArgumentException("DeleteShoppingLists requires at least one list to delete.");
            }

            using (var session = GetSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var dbLists = session.QueryOver <Models.ShoppingLists>()
                                  .AndRestrictionOn(p => p.ShoppingListId).IsInG(lists.Where(l => l.Id.HasValue).Select(l => l.Id.Value))
                                  .Where(p => p.UserId == identity.UserId)
                                  .List();

                    dbLists.ForEach(session.Delete);
                    transaction.Commit();
                }
            }
        }
Пример #11
0
        public void DequeueRecipe(AuthIdentity identity, params Guid[] recipeIds)
        {
            using (var session = GetSession())
            {
                var recipes = (from r in recipeIds select new Models.Recipes {
                    RecipeId = r
                }).ToArray();

                var dbRecipes = session.QueryOver <QueuedRecipes>()
                                .Where(p => p.UserId == identity.UserId);

                if (recipeIds.Any())
                {
                    dbRecipes = dbRecipes.AndRestrictionOn(p => p.Recipe).IsInG(recipes);
                }

                using (var transaction = session.BeginTransaction())
                {
                    dbRecipes.List().ForEach(session.Delete);
                    transaction.Commit();
                }
            }
        }
Пример #12
0
        public void MoveMenuItem(AuthIdentity identity, Guid recipeId, Menu fromMenu, Menu toMenu)
        {
            using (var session = GetSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    if (!fromMenu.Id.HasValue || !toMenu.Id.HasValue)
                    {
                        throw new MenuIdRequiredException();
                    }

                    var dbFavorite = session.QueryOver <Favorites>()
                                     .Where(p => p.Menu.MenuId == fromMenu.Id.Value)
                                     .Where(p => p.Recipe.RecipeId == recipeId)
                                     .SingleOrDefault();

                    if (dbFavorite == null)
                    {
                        throw new RecipeNotFoundException();
                    }

                    var dbToMenu = session.QueryOver <Models.Menus>()
                                   .Where(p => p.MenuId == toMenu.Id.Value)
                                   .SingleOrDefault();

                    if (dbToMenu == null)
                    {
                        throw new MenuNotFoundException();
                    }

                    dbFavorite.Menu = dbToMenu;
                    session.Update(dbFavorite);
                    transaction.Commit();
                }
            }
        }
Пример #13
0
        public void EnqueueRecipes(AuthIdentity identity, params Guid[] recipeIds)
        {
            using (var session = GetSession())
            {
                // Check for dupes
                var recipes = (from r in recipeIds select new Models.Recipes {
                    RecipeId = r
                }).ToArray();

                var dupes = session.QueryOver <QueuedRecipes>()
                            .Where(p => p.UserId == identity.UserId)
                            .AndRestrictionOn(p => p.Recipe).IsInG(recipes)
                            .List <QueuedRecipes>();

                var existing = (from r in dupes select r.Recipe.RecipeId).ToList();

                // Enqueue each recipe
                using (var transaction = session.BeginTransaction())
                {
                    var now = DateTime.Now;
                    foreach (var rid in recipeIds.Where(rid => !existing.Contains(rid)))
                    {
                        session.Save(new QueuedRecipes
                        {
                            Recipe = new Models.Recipes {
                                RecipeId = rid
                            },
                            UserId     = identity.UserId,
                            QueuedDate = now
                        });
                    }

                    transaction.Commit();
                }
            }
        }
Пример #14
0
        public void RateRecipe(AuthIdentity identity, Guid recipeId, Rating rating)
        {
            using (var session = GetSession())
             {
            using (var transaction = session.BeginTransaction())
            {
               var existingRate = session.QueryOver<RecipeRatings>()
                  .Where(p => p.UserId == identity.UserId)
                  .Where(p => p.Recipe.RecipeId == recipeId)
                  .SingleOrDefault();

               if (existingRate != null) // Update existing
               {
                  existingRate.Rating = (byte) rating;
                  session.Update(existingRate);
               }
               else // Create rating
               {
                  session.Save(new RecipeRatings
                  {
                     UserId = identity.UserId,
                     Recipe = new Models.Recipes {RecipeId = recipeId},
                     Rating = (byte) rating
                  });
               }

               transaction.Commit();
            }
             }
        }
Пример #15
0
        public void MoveMenuItem(AuthIdentity identity, Guid recipeId, Menu fromMenu, Menu toMenu)
        {
            using (var session = GetSession())
             {
            using (var transaction = session.BeginTransaction())
            {
               if (!fromMenu.Id.HasValue || !toMenu.Id.HasValue)
                  throw new MenuIdRequiredException();

               var dbFavorite = session.QueryOver<Favorites>()
                  .Where(p => p.Menu.MenuId == fromMenu.Id.Value)
                  .Where(p => p.Recipe.RecipeId == recipeId)
                  .SingleOrDefault();

               if (dbFavorite == null)
                  throw new RecipeNotFoundException();

               var dbToMenu = session.QueryOver<Models.Menus>()
                  .Where(p => p.MenuId == toMenu.Id.Value)
                  .SingleOrDefault();

               if (dbToMenu == null)
                  throw new MenuNotFoundException();

               dbFavorite.Menu = dbToMenu;
               session.Update(dbFavorite);
               transaction.Commit();
            }
             }
        }
Пример #16
0
        public ShoppingList[] GetShoppingLists(AuthIdentity identity, IList<ShoppingList> lists, GetShoppingListOptions options)
        {
            using (var session = GetSession())
             {
            var loadDef = true;
            var query = session.QueryOver<Models.ShoppingLists>()
               .Where(p => p.UserId == identity.UserId);

            if (lists != null) // Load individual lists
            {
               loadDef = lists.Contains(ShoppingList.Default);
               var ids = lists.Where(l => l.Id.HasValue).Select(l => l.Id.Value).ToArray();
               query = query.AndRestrictionOn(x => x.ShoppingListId).IsInG(ids);
            }

            var dbLists = query.List();
            var ret = new List<ShoppingList>();

            if (loadDef)
               ret.Add(ShoppingList.Default);

            ret.AddRange(dbLists.Select(l => l.AsShoppingList()));

            if (!options.LoadItems) // We're done!
               return ret.ToArray();

            // Load items into each list
            ICriterion filter = (loadDef
               ? Expression.Or(Expression.IsNull("ShoppingList"), Expression.InG("ShoppingList", dbLists)) // Menu can be null, or in loaded menu list
               : Expression.InG("ShoppingList", dbLists)); // Menu must be in loaded menu list

            var dbItems = session.QueryOver<ShoppingListItems>()
               .Fetch(prop => prop.Ingredient).Eager
               .Fetch(prop => prop.Recipe).Eager
               .Where(p => p.UserId == identity.UserId)
               .Where(filter)
               .List();

            return ret.Select(m =>
               new ShoppingList(
                  m.Id,
                  m.Title,
                  (m.Id.HasValue
                     ? dbItems.Where(f => f.ShoppingList != null && f.ShoppingList.ShoppingListId == m.Id)
                     : dbItems.Where(f => f.ShoppingList == null)).Select(r => r.AsShoppingListItem())
                  )).ToArray();
             }
        }
Пример #17
0
        public RecipeBrief[] GetRecipeQueue(AuthIdentity identity)
        {
            using (var session = GetSession())
             {
            var dbRecipes = session.QueryOver<QueuedRecipes>()
               .Fetch(prop => prop.Recipe).Eager
               .Where(p => p.UserId == identity.UserId)
               .List();

            return (from r in dbRecipes select r.Recipe.AsRecipeBrief()).ToArray();
             }
        }
Пример #18
0
        public Menu[] GetMenus(AuthIdentity identity, IList<Menu> menus, GetMenuOptions options)
        {
            using (var session = GetSession())
             {
            // menus will be null if all menus should be loaded, or a list of Menu objects to specify individual menus to load
            if (options == null) throw new ArgumentNullException("options");
            if (identity == null) throw new ArgumentNullException("identity");

            var loadFav = true;
            var query = session.QueryOver<Models.Menus>()
               .Where(p => p.UserId == identity.UserId);

            if (menus != null) // Load individual menus
            {
               loadFav = menus.Contains(Menu.Favorites);
               var ids = menus.Where(m => m.Id.HasValue).Select(m => m.Id.Value).ToArray();
               query = query.AndRestrictionOn(p => p.MenuId).IsInG(ids);
            }

            var dbMenus = query.List();
            var ret = new List<Menu>();

            if (loadFav)
               ret.Add(Menu.Favorites);

            ret.AddRange(dbMenus.Select(m => m.AsMenu()));

            if (!options.LoadRecipes) // We're done!
               return ret.ToArray();

            // Load recipes into each menu
            ICriterion filter = (loadFav
               ? Expression.Or(Expression.IsNull("Menu"), Expression.InG("Menu", dbMenus)) // Menu can be null, or in loaded menu list
               : Expression.InG("Menu", dbMenus)); // Menu must be in loaded menu list

            var dbFavorites = session.QueryOver<Favorites>()
               .Fetch(prop => prop.Recipe).Eager
               .Where(p => p.UserId == identity.UserId)
               .Where(filter)
               .List();

            return ret.Select(m =>
               new Menu(m)
               {
                  Recipes = (m.Id.HasValue
                     ? dbFavorites.Where(f => f.Menu != null && f.Menu.MenuId == m.Id)
                     : dbFavorites.Where(f => f.Menu == null)
                     ).Select(r => r.Recipe.AsRecipeBrief()).ToArray()
               }).ToArray();
             }
        }
Пример #19
0
        public ShoppingListResult UpdateShoppingList(AuthIdentity identity, Guid?listId, Guid[] toRemove, ShoppingListModification[] toModify, IShoppingListSource[] toAdd, string newName = null)
        {
            using (var session = GetSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    // Deletes
                    if (toRemove.Any())
                    {
                        var dbDeletes = session.QueryOver <ShoppingListItems>()
                                        .Where(p => p.UserId == identity.UserId)
                                        .Where(listId.HasValue
                        ? Expression.Eq("ShoppingList", listId.Value)
                        : Expression.IsNull("ShoppingList")
                                               ).AndRestrictionOn(p => p.ItemId).IsInG(toRemove)
                                        .List();

                        dbDeletes.ForEach(session.Delete);
                    }

                    // Updates
                    Models.ShoppingLists      dbList  = null;
                    IList <ShoppingListItems> dbItems = null;
                    if (listId.HasValue)
                    {
                        dbList = session.QueryOver <Models.ShoppingLists>()
                                 .Fetch(prop => prop.Items).Eager
                                 .Where(p => p.UserId == identity.UserId)
                                 .Where(p => p.ShoppingListId == listId.Value)
                                 .SingleOrDefault();

                        if (dbList == null)
                        {
                            throw new ShoppingListNotFoundException();
                        }

                        if (!String.IsNullOrWhiteSpace(newName))
                        {
                            dbList.Title = newName;
                        }

                        dbItems = dbList.Items;
                    }
                    else
                    {
                        dbItems = session.QueryOver <ShoppingListItems>()
                                  .Where(p => p.UserId == identity.UserId)
                                  .Where(p => p.ShoppingList == null)
                                  .List();
                    }

                    toModify.ForEach(item =>
                    {
                        var dbItem = dbItems.FirstOrDefault(i => i.ItemId == item.ModifiedItemId);
                        if (dbItem == null)
                        {
                            return;
                        }

                        if (item.CrossOut.HasValue)
                        {
                            dbItem.CrossedOut = item.CrossOut.Value;
                        }
                        if (item.NewAmount != null)
                        {
                            dbItem.Amount = item.NewAmount;
                        }
                    });

                    toAdd.ForEach(item =>
                    {
                        var source = item.GetItem();

                        if (source.Ingredient == null && !String.IsNullOrWhiteSpace(source.Raw))                 // Raw shopping list item
                        {
                            if (!dbItems.Any(i => source.Raw.Equals(i.Raw, StringComparison.OrdinalIgnoreCase))) // Add it
                            {
                                var newItem = new ShoppingListItems
                                {
                                    ShoppingList = dbList,
                                    UserId       = identity.UserId,
                                    Raw          = source.Raw
                                };

                                session.Save(newItem);
                                dbItems.Add(newItem);
                            }

                            return;
                        }

                        if (source.Ingredient != null && source.Amount == null) // Raw ingredient without any amount
                        {
                            var existingItem = dbItems.FirstOrDefault(i => i.Ingredient != null && i.Ingredient.IngredientId == source.Ingredient.Id);

                            if (existingItem == null) // Add it
                            {
                                var newItem = new ShoppingListItems
                                {
                                    ShoppingList = dbList,
                                    UserId       = identity.UserId,
                                    Ingredient   = Models.Ingredients.FromId(source.Ingredient.Id)
                                };

                                session.Save(newItem);
                                dbItems.Add(newItem);
                            }
                            else // Clear out existing amount
                            {
                                existingItem.Amount = null;
                            }
                        }

                        if (source.Ingredient != null && source.Amount != null) // Ingredient with amount, aggregate if necessary
                        {
                            var existingItem = dbItems.FirstOrDefault(i => i.Ingredient != null && i.Ingredient.IngredientId == source.Ingredient.Id);

                            if (existingItem == null) // Add it
                            {
                                var newItem = new ShoppingListItems
                                {
                                    ShoppingList = dbList,
                                    UserId       = identity.UserId,
                                    Ingredient   = Models.Ingredients.FromId(source.Ingredient.Id),
                                    Amount       = source.Amount
                                };

                                session.Save(newItem);
                                dbItems.Add(newItem);
                            }
                            else if (existingItem.Amount != null) // Add to total
                            {
                                existingItem.Amount += source.Amount;
                            }
                        }
                    });

                    transaction.Commit();

                    return(new ShoppingListResult
                    {
                        List = new ShoppingList(
                            dbList != null ? (Guid?)dbList.ShoppingListId : null,
                            dbList != null ? dbList.Title : null,
                            dbItems.Select(i => i.AsShoppingListItem()))
                    });
                }
            }
        }
Пример #20
0
        public MenuResult UpdateMenu(AuthIdentity identity, Guid? menuId, Guid[] recipesAdd, Guid[] recipesRemove, MenuMove[] recipesMove, bool clear, string newName = null)
        {
            var ret = new MenuResult();
             ret.MenuUpdated = true; // TODO: Verify actual changes were made before setting MenuUpdated to true

             using (var session = GetSession())
             {
            using (var transaction = session.BeginTransaction())
            {
               Models.Menus dbMenu = null;
               IList<Favorites> dbRecipes = null;
               if (menuId.HasValue)
               {
                  dbMenu = session.QueryOver<Models.Menus>()
                     .Fetch(prop => prop.Recipes).Eager
                     .Where(p => p.MenuId == menuId)
                     .SingleOrDefault();

                  if (dbMenu == null)
                     throw new MenuNotFoundException();

                  if (dbMenu.UserId != identity.UserId) // User does not have access to modify this menu
                     throw new UserDoesNotOwnMenuException();

                  if (!String.IsNullOrWhiteSpace(newName) && dbMenu != null) // Rename menu
                     dbMenu.Title = newName.Trim();

                  dbRecipes = dbMenu.Recipes;
               }
               else
               {
                  dbRecipes = session.QueryOver<Favorites>()
                     .Where(p => p.UserId == identity.UserId)
                     .Where(p => p.Menu == null)
                     .List();
               }

               if (recipesAdd.Any()) // Add recipes to menu
               {
                  var existing = (from r in dbRecipes select r.Recipe.RecipeId);
                  recipesAdd = recipesAdd.Except(existing).ToArray(); //Remove dupes

                  foreach (var rid in recipesAdd)
                  {
                     var fav = new Favorites
                     {
                        UserId = identity.UserId,
                        Recipe = new Models.Recipes() {RecipeId = rid},
                        Menu = dbMenu
                     };

                     session.Save(fav);
                  }
               }

               if (recipesRemove.Any()) // Remove recipes from menu
               {
                  var toDelete = (from r in dbRecipes where recipesRemove.Contains(r.Recipe.RecipeId) select r);
                  toDelete.ForEach(session.Delete);
               }

               if (clear) // Remove every recipe from menu
               {
                  dbRecipes.ForEach(session.Delete);
               }

               if (recipesMove.Any()) // Move items to another menu
               {
                  foreach (var moveAction in recipesMove)
                  {
                     Models.Menus dbTarget = null;
                     if (moveAction.TargetMenu.HasValue)
                     {
                        dbTarget = session.QueryOver<Models.Menus>()
                           .Where(p => p.MenuId == moveAction.TargetMenu.Value)
                           .Where(p => p.UserId == identity.UserId)
                           .SingleOrDefault();

                        if (dbTarget == null)
                           throw new MenuNotFoundException(moveAction.TargetMenu.Value);
                     }

                     var rToMove = (moveAction.MoveAll
                        ? dbRecipes
                        : dbRecipes.Where(r => moveAction.RecipesToMove.Contains(r.Recipe.RecipeId)));

                     rToMove.ForEach(a => a.Menu = dbTarget);
                  }
               }

               transaction.Commit();
            }
             }

             return ret;
        }
Пример #21
0
        public SearchResults Search(AuthIdentity identity, RecipeQuery query)
        {
            var index = this.store.GetSearchIndex();

            var q = index.Where(p => !p.Recipe.Hidden);

            if (!string.IsNullOrWhiteSpace(query.Keywords))
            {
                q = q.Where(p =>
                   (p.Recipe.Title ?? string.Empty).IndexOf(query.Keywords, StringComparison.OrdinalIgnoreCase) >= 0 ||
                   (p.Recipe.Description ?? string.Empty).IndexOf(query.Keywords, StringComparison.OrdinalIgnoreCase) >= 0);
            }

            if (query.Time.MaxPrep.HasValue)
            {
                q = q.Where(p => p.Recipe.PreparationTime <= query.Time.MaxPrep.Value);
            }

            if (query.Time.MaxCook.HasValue)
            {
                q = q.Where(p => p.Recipe.CookTime <= query.Time.MaxCook.Value);
            }

            if (query.Rating > 0)
            {
                q = q.Where(p => p.Recipe.Rating >= (int)query.Rating.Value);
            }

            if (query.Include != null && query.Include.Length > 0)
            {
                // Add ingredients to include
                q = q.Where(p => p.Ingredients.Any(i => query.Include.Contains(i.IngredientId)));
            }

            if (query.Exclude != null && query.Exclude.Length > 0)
            {
                // Add ingredients to exclude
                q = q.Where(p => !p.Ingredients.Any(i => query.Exclude.Contains(i.IngredientId)));
            }

            if (query.Photos == PhotoFilter.Photo || query.Photos == PhotoFilter.HighRes)
            {
                q = q.Where(p => p.Recipe.ImageUrl != null);
            }

            // Need to search in metadata
            if (query.Diet ||
                query.Nutrition ||
                query.Skill ||
                query.Taste ||
                query.Meal != MealFilter.All ||
                query.Photos == PhotoFilter.HighRes)
            {
                // Meal
                if (query.Meal != MealFilter.All)
                {
                    switch (query.Meal)
                    {
                        case MealFilter.Breakfast:
                            q = q.Where(p => p.Metadata.MealBreakfast);
                            break;
                        case MealFilter.Lunch:
                            q = q.Where(p => p.Metadata.MealLunch);
                            break;
                        case MealFilter.Dinner:
                            q = q.Where(p => p.Metadata.MealDinner);
                            break;
                        case MealFilter.Dessert:
                            q = q.Where(p => p.Metadata.MealDessert);
                            break;
                        default:
                            break;
                    }
                }

                // High-resolution photos
                if (query.Photos == PhotoFilter.HighRes)
                {
                    q = q.Where(p => p.Metadata.PhotoResolution >= 1024 * 768);
                }

                // Diet
                if (query.Diet.GlutenFree)
                {
                    q = q.Where(p => p.Metadata.DietGlutenFree);
                }

                if (query.Diet.NoAnimals)
                {
                    q = q.Where(p => p.Metadata.DietNoAnimals);
                }

                if (query.Diet.NoMeat)
                {
                    q = q.Where(p => p.Metadata.DietNomeat);
                }

                if (query.Diet.NoPork)
                {
                    q = q.Where(p => p.Metadata.DietNoPork);
                }

                if (query.Diet.NoRedMeat)
                {
                    q = q.Where(p => p.Metadata.DietNoRedMeat);
                }

                // Nutrition
                if (query.Nutrition.LowCalorie)
                {
                    q = q.Where(p => p.Metadata.NutritionLowCalorie);
                }

                if (query.Nutrition.LowCarb)
                {
                    q = q.Where(p => p.Metadata.NutritionLowCarb);
                }

                if (query.Nutrition.LowFat)
                {
                    q = q.Where(p => p.Metadata.NutritionLowFat);
                }

                if (query.Nutrition.LowSodium)
                {
                    q = q.Where(p => p.Metadata.NutritionLowSodium);
                }

                if (query.Nutrition.LowSugar)
                {
                    q = q.Where(p => p.Metadata.NutritionLowSugar);
                }

                // Skill
                if (query.Skill.Common)
                {
                    q = q.Where(p => p.Metadata.SkillCommonIngredients).OrderByDescending(p => p.Metadata.Commonality);
                }

                if (query.Skill.Easy)
                {
                    q = q.Where(p => p.Metadata.SkillEasyToMake);
                }

                if (query.Skill.Quick)
                {
                    q = q.Where(p => p.Metadata.SkillQuick);
                }

                // Taste
                if (query.Taste.MildToSpicy != SpicinessLevel.Medium)
                {
                    q = query.Taste.MildToSpicy < SpicinessLevel.Medium
                       ? q.Where(p => p.Metadata.TasteMildToSpicy <= query.Taste.Spiciness).OrderBy(p => p.Metadata.TasteMildToSpicy)
                       : q.Where(p => p.Metadata.TasteMildToSpicy >= query.Taste.Spiciness).OrderByDescending(p => p.Metadata.TasteMildToSpicy);
                }

                if (query.Taste.SavoryToSweet != SweetnessLevel.Medium)
                {
                    q = query.Taste.SavoryToSweet < SweetnessLevel.Medium
                       ? q.Where(p => p.Metadata.TasteSavoryToSweet <= query.Taste.Sweetness).OrderBy(p => p.Metadata.TasteSavoryToSweet)
                       : q.Where(p => p.Metadata.TasteSavoryToSweet >= query.Taste.Sweetness).OrderByDescending(p => p.Metadata.TasteSavoryToSweet);
                }
            }

            switch (query.Sort)
            {
                case SortOrder.Title:
                    q = (query.Direction == SortDirection.Ascending) ? q.OrderBy(p => p.Recipe.Title) : q.OrderByDescending(p => p.Recipe.Title);
                    break;
                case SortOrder.PrepTime:
                    q = (query.Direction == SortDirection.Ascending) ? q.OrderBy(p => p.Recipe.PreparationTime) : q.OrderByDescending(p => p.Recipe.PreparationTime);
                    break;
                case SortOrder.CookTime:
                    q = (query.Direction == SortDirection.Ascending) ? q.OrderBy(p => p.Recipe.CookTime) : q.OrderByDescending(p => p.Recipe.CookTime);
                    break;
                case SortOrder.Image:
                    q = (query.Direction == SortDirection.Ascending) ? q.OrderBy(p => p.Recipe.ImageUrl) : q.OrderByDescending(p => p.Recipe.ImageUrl);
                    break;
                default:
                    q = (query.Direction == SortDirection.Ascending) ? q.OrderBy(p => p.Recipe.Rating) : q.OrderByDescending(p => p.Recipe.Rating);
                    break;
            }

            return new SearchResults
            {
                Briefs = q.Select(r => Data.DTO.Recipes.ToRecipeBrief(r.Recipe)).ToArray(),
                TotalCount = q.Count()
            };
        }
Пример #22
0
        public ShoppingListResult CreateShoppingList(AuthIdentity identity, ShoppingList list)
        {
            using (var session = GetSession())
             {
            var ret = new ShoppingListResult();

            using (var transaction = session.BeginTransaction())
            {
               var dbList = new Models.ShoppingLists();
               dbList.Title = list.Title.Trim();
               dbList.UserId = identity.UserId;
               session.Save(dbList);

               if (list.Any()) // Create ShoppingListItems
               {
                  list.ToList().ForEach(i =>
                  {
                     var dbItem = ShoppingListItems.FromShoppingListItem(i);
                     dbItem.ShoppingList = dbList;
                     dbItem.UserId = dbList.UserId;
                     session.Save(dbItem);
                  });
               }

               transaction.Commit();

               ret.NewShoppingListId = dbList.ShoppingListId;
            }

            ret.List = list;
            return ret;
             }
        }
Пример #23
0
        public RecipeResult CreateRecipe(AuthIdentity identity, Recipe recipe)
        {
            using (var session = GetSession())
             {
            using (var transaction = session.BeginTransaction())
            {
               // Create Recipe
               var dbRecipe = new Models.Recipes
               {
                  Title = recipe.Title,
                  Description = recipe.Description,
                  CookTime = recipe.CookTime,
                  PrepTime = recipe.PrepTime,
                  Credit = recipe.Credit,
                  CreditUrl = recipe.CreditUrl,
                  DateEntered = recipe.DateEntered,
                  ImageUrl = recipe.ImageUrl,
                  Rating = recipe.AvgRating,
                  ServingSize = recipe.ServingSize,
                  Steps = recipe.Method
               };

               session.Save(dbRecipe);

               // Create Ingredients
               short displayOrder = 0;
               recipe.Ingredients.ForEach(i =>
               {
                  var dbIngredient = new RecipeIngredients
                  {
                     Recipe = dbRecipe,
                     Ingredient = Models.Ingredients.FromId(i.Ingredient.Id),
                     IngredientForm = (i.Form != null ? IngredientForms.FromId(i.Form.FormId) : null),
                     Qty = (i.Amount != null ? (float?) i.Amount.SizeHigh : null),
                     QtyLow = (i.Amount != null ? (float?) i.Amount.SizeLow : null),
                     Unit = (i.Amount != null ? i.Amount.Unit : Units.Unit),
                     Section = i.Section,
                     DisplayOrder = ++displayOrder
                  };

                  session.Save(dbIngredient);
               });

               // Create RecipeMetadata
               var dbMetadata = new RecipeMetadata
               {
                  Recipe = dbRecipe,
                  DietGlutenFree = recipe.Tags.HasTag(RecipeTag.GlutenFree),
                  DietNoAnimals = recipe.Tags.HasTag(RecipeTag.NoAnimals),
                  DietNomeat = recipe.Tags.HasTag(RecipeTag.NoMeat),
                  DietNoPork = recipe.Tags.HasTag(RecipeTag.NoPork),
                  DietNoRedMeat = recipe.Tags.HasTag(RecipeTag.NoRedMeat),
                  MealBreakfast = recipe.Tags.HasTag(RecipeTag.Breakfast),
                  MealDessert = recipe.Tags.HasTag(RecipeTag.Dessert),
                  MealDinner = recipe.Tags.HasTag(RecipeTag.Dinner),
                  MealLunch = recipe.Tags.HasTag(RecipeTag.Lunch),
                  NutritionLowCalorie = recipe.Tags.HasTag(RecipeTag.LowCalorie),
                  NutritionLowCarb = recipe.Tags.HasTag(RecipeTag.LowCarb),
                  NutritionLowFat = recipe.Tags.HasTag(RecipeTag.LowFat),
                  NutritionLowSodium = recipe.Tags.HasTag(RecipeTag.LowSodium),
                  NutritionLowSugar = recipe.Tags.HasTag(RecipeTag.LowSugar),
                  SkillCommon = recipe.Tags.HasTag(RecipeTag.Common),
                  SkillEasy = recipe.Tags.HasTag(RecipeTag.Easy),
                  SkillQuick = recipe.Tags.HasTag(RecipeTag.Quick)
               };

               session.Save(dbMetadata);
               transaction.Commit();

               return new RecipeResult
               {
                  RecipeCreated = true,
                  NewRecipeId = dbRecipe.RecipeId
               };
            }
             }
        }
Пример #24
0
        public MenuResult CreateMenu(AuthIdentity identity, Menu menu, params Guid[] recipeIds)
        {
            using (var session = GetSession())
             {
            menu.Title = menu.Title.Trim();
            var ret = new MenuResult();

            using (var transaction = session.BeginTransaction())
            {
               Models.Menus dbMenu;
               var dupes = session.QueryOver<Models.Menus>()
                  .Where(p => p.UserId == identity.UserId)
                  .Where(p => p.Title == menu.Title)
                  .ToRowCountQuery()
                  .RowCount();

               if (dupes > 0)
               {
                  throw new MenuAlreadyExistsException();
               }

               session.Save(dbMenu = new Models.Menus
               {
                  UserId = identity.UserId,
                  Title = menu.Title,
                  CreatedDate = DateTime.Now,
               });

               foreach (var rid in recipeIds.NeverNull())
               {
                  var fav = new Favorites
                  {
                     UserId = identity.UserId,
                     Recipe = new Models.Recipes() {RecipeId = rid},
                     Menu = dbMenu
                  };

                  session.Save(fav);
               }

               transaction.Commit();

               ret.MenuCreated = true;
               ret.NewMenuId = dbMenu.MenuId;
            }

            return ret;
             }
        }
Пример #25
0
        public ShoppingListResult UpdateShoppingList(AuthIdentity identity, Guid? listId, Guid[] toRemove, ShoppingListModification[] toModify, IShoppingListSource[] toAdd, string newName = null)
        {
            using (var session = GetSession())
             {
            using (var transaction = session.BeginTransaction())
            {
               // Deletes
               if (toRemove.Any())
               {
                  var dbDeletes = session.QueryOver<ShoppingListItems>()
                     .Where(p => p.UserId == identity.UserId)
                     .Where(listId.HasValue
                        ? Expression.Eq("ShoppingList", listId.Value)
                        : Expression.IsNull("ShoppingList")
                     ).AndRestrictionOn(p => p.ItemId).IsInG(toRemove)
                     .List();

                  dbDeletes.ForEach(session.Delete);
               }

               // Updates
               Models.ShoppingLists dbList = null;
               IList<ShoppingListItems> dbItems = null;
               if (listId.HasValue)
               {
                  dbList = session.QueryOver<Models.ShoppingLists>()
                     .Fetch(prop => prop.Items).Eager
                     .Where(p => p.UserId == identity.UserId)
                     .Where(p => p.ShoppingListId == listId.Value)
                     .SingleOrDefault();

                  if (dbList == null)
                     throw new ShoppingListNotFoundException();

                  if (!String.IsNullOrWhiteSpace(newName))
                     dbList.Title = newName;

                  dbItems = dbList.Items;
               }
               else
               {
                  dbItems = session.QueryOver<ShoppingListItems>()
                     .Where(p => p.UserId == identity.UserId)
                     .Where(p => p.ShoppingList == null)
                     .List();
               }

               toModify.ForEach(item =>
               {
                  var dbItem = dbItems.FirstOrDefault(i => i.ItemId == item.ModifiedItemId);
                  if (dbItem == null) return;

                  if (item.CrossOut.HasValue) dbItem.CrossedOut = item.CrossOut.Value;
                  if (item.NewAmount != null) dbItem.Amount = item.NewAmount;
               });

               toAdd.ForEach(item =>
               {
                  var source = item.GetItem();

                  if (source.Ingredient == null && !String.IsNullOrWhiteSpace(source.Raw)) // Raw shopping list item
                  {
                     if (!dbItems.Any(i => source.Raw.Equals(i.Raw, StringComparison.OrdinalIgnoreCase))) // Add it
                     {
                        var newItem = new ShoppingListItems
                        {
                           ShoppingList = dbList,
                           UserId = identity.UserId,
                           Raw = source.Raw
                        };

                        session.Save(newItem);
                        dbItems.Add(newItem);
                     }

                     return;
                  }

                  if (source.Ingredient != null && source.Amount == null) // Raw ingredient without any amount
                  {
                     var existingItem = dbItems.FirstOrDefault(i => i.Ingredient != null && i.Ingredient.IngredientId == source.Ingredient.Id);

                     if (existingItem == null) // Add it
                     {
                        var newItem = new ShoppingListItems
                        {
                           ShoppingList = dbList,
                           UserId = identity.UserId,
                           Ingredient = Models.Ingredients.FromId(source.Ingredient.Id)
                        };

                        session.Save(newItem);
                        dbItems.Add(newItem);
                     }
                     else // Clear out existing amount
                     {
                        existingItem.Amount = null;
                     }
                  }

                  if (source.Ingredient != null && source.Amount != null) // Ingredient with amount, aggregate if necessary
                  {
                     var existingItem = dbItems.FirstOrDefault(i => i.Ingredient != null && i.Ingredient.IngredientId == source.Ingredient.Id);

                     if (existingItem == null) // Add it
                     {
                        var newItem = new ShoppingListItems
                        {
                           ShoppingList = dbList,
                           UserId = identity.UserId,
                           Ingredient = Models.Ingredients.FromId(source.Ingredient.Id),
                           Amount = source.Amount
                        };

                        session.Save(newItem);
                        dbItems.Add(newItem);
                     }
                     else if (existingItem.Amount != null) // Add to total
                     {
                        existingItem.Amount += source.Amount;
                     }
                  }
               });

               transaction.Commit();

               return new ShoppingListResult
               {
                  List = new ShoppingList(
                     dbList != null ? (Guid?) dbList.ShoppingListId : null,
                     dbList != null ? dbList.Title : null,
                     dbItems.Select(i => i.AsShoppingListItem()))
               };
            }
             }
        }
Пример #26
0
        public void MoveMenuItem(AuthIdentity identity, Guid recipeId, Menu fromMenu, Menu toMenu)
        {
            using (var session = this.GetSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    if (!fromMenu.Id.HasValue || !toMenu.Id.HasValue)
                    {
                        throw new MenuIdRequiredException();
                    }

                    var favorites = session.QueryOver<Favorites>()
                       .Where(p => p.Menu.MenuId == fromMenu.Id.Value)
                       .Where(p => p.Recipe.RecipeId == recipeId)
                       .SingleOrDefault();

                    if (favorites == null)
                    {
                        throw new RecipeNotFoundException();
                    }

                    var menus = session.QueryOver<Menus>()
                       .Where(p => p.MenuId == toMenu.Id.Value)
                       .SingleOrDefault();

                    if (menus == null)
                    {
                        throw new MenuNotFoundException();
                    }

                    favorites.Menu = menus;
                    session.Update(favorites);
                    transaction.Commit();
                }
            }
        }
Пример #27
0
        public Recipe[] ReadRecipes(AuthIdentity identity, Guid[] recipeIds, ReadRecipeOptions options)
        {
            using (var session = GetSession())
             {
            var dbRecipes = session.QueryOver<Models.Recipes>()
               .Fetch(prop => prop.RecipeMetadata).Eager
               .Fetch(prop => prop.Ingredients).Eager
               .Fetch(prop => prop.Ingredients[0].Ingredient).Eager
               .Fetch(prop => prop.Ingredients[0].IngredientForm).Eager
               .AndRestrictionOn(p => p.RecipeId).IsInG(recipeIds)
               .TransformUsing(Transformers.DistinctRootEntity)
               .List();

            if (!dbRecipes.Any())
               throw new RecipeNotFoundException();

            var ret = new List<Recipe>();
            foreach (var dbRecipe in dbRecipes)
            {
               var recipe = new Recipe
               {
                  Id = dbRecipe.RecipeId,
                  Title = dbRecipe.Title,
                  Description = dbRecipe.Description,
                  DateEntered = dbRecipe.DateEntered,
                  ImageUrl = dbRecipe.ImageUrl,
                  ServingSize = dbRecipe.ServingSize,
                  PrepTime = dbRecipe.PrepTime,
                  CookTime = dbRecipe.CookTime,
                  Credit = dbRecipe.Credit,
                  CreditUrl = dbRecipe.CreditUrl,
                  AvgRating = dbRecipe.Rating
               };

               if (options.ReturnMethod)
                  recipe.Method = dbRecipe.Steps;

               if (options.ReturnUserRating) // TODO: We should JOIN this on the dbRecipes for faster loading
               {
                  var id = dbRecipe.RecipeId;
                  var rating = session.QueryOver<RecipeRatings>()
                     .Where(p => p.Recipe.RecipeId == id)
                     .Where(p => p.UserId == identity.UserId)
                     .SingleOrDefault();

                  recipe.UserRating = (rating == null ? Rating.None : (Rating) rating.Rating);
               }

               recipe.Ingredients = dbRecipe.Ingredients.Select(i => new IngredientUsage
               {
                  Amount = i.Qty.HasValue ? new Amount(i.Qty.Value, i.Unit) : null,
                  PrepNote = i.PrepNote,
                  Section = i.Section,
                  Form = i.IngredientForm != null ? i.IngredientForm.AsIngredientForm() : null, // Note: Form will be null when usage has no amount
                  Ingredient = i.Ingredient.AsIngredient()
               }).ToArray();

               recipe.Tags = dbRecipe.RecipeMetadata.Tags;
               ret.Add(recipe);
            }

            return ret.ToArray();
             }
        }
Пример #28
0
        public SearchResults RecipeSearch(AuthIdentity identity, RecipeQuery query)
        {
            if (SearchProvider == null)
            throw new NoConfiguredSearchProvidersException();

             return SearchProvider.Search(identity, query);
        }
Пример #29
0
        public SearchResults Search(AuthIdentity identity, RecipeQuery query)
        {
            var index = store.GetSearchIndex();

            var q = index.Where(p => !p.Recipe.Hidden);

            if (!String.IsNullOrWhiteSpace(query.Keywords))
            {
                q = q.Where(p =>
                            (p.Recipe.Title ?? "").IndexOf(query.Keywords, StringComparison.OrdinalIgnoreCase) >= 0 ||
                            (p.Recipe.Description ?? "").IndexOf(query.Keywords, StringComparison.OrdinalIgnoreCase) >= 0
                            );
            }

            if (query.Time.MaxPrep.HasValue)
            {
                q = q.Where(p => p.Recipe.PrepTime <= query.Time.MaxPrep.Value);
            }

            if (query.Time.MaxCook.HasValue)
            {
                q = q.Where(p => p.Recipe.CookTime <= query.Time.MaxCook.Value);
            }

            if (query.Rating > 0)
            {
                q = q.Where(p => p.Recipe.Rating >= (int)query.Rating);
            }

            if (query.Include != null && query.Include.Length > 0) // Add ingredients to include
            {
                q = q.Where(p => p.Ingredients.Any(i => query.Include.Contains(i.IngredientId)));
            }

            if (query.Exclude != null && query.Exclude.Length > 0) // Add ingredients to exclude
            {
                q = q.Where(p => !p.Ingredients.Any(i => query.Exclude.Contains(i.IngredientId)));
            }

            if (query.Photos == PhotoFilter.Photo || query.Photos == PhotoFilter.HighRes)
            {
                q = q.Where(p => p.Recipe.ImageUrl != null);
            }

            if (query.Diet || query.Nutrition || query.Skill || query.Taste || (query.Meal != MealFilter.All) || (query.Photos == PhotoFilter.HighRes)) //Need to search in metadata
            {
                //Meal
                if (query.Meal != MealFilter.All)
                {
                    if (query.Meal == MealFilter.Breakfast)
                    {
                        q = q.Where(p => p.Metadata.MealBreakfast);
                    }
                    if (query.Meal == MealFilter.Dessert)
                    {
                        q = q.Where(p => p.Metadata.MealDessert);
                    }
                    if (query.Meal == MealFilter.Dinner)
                    {
                        q = q.Where(p => p.Metadata.MealDinner);
                    }
                    if (query.Meal == MealFilter.Lunch)
                    {
                        q = q.Where(p => p.Metadata.MealLunch);
                    }
                }

                //High-res photos
                if (query.Photos == PhotoFilter.HighRes)
                {
                    q = q.Where(p => p.Metadata.PhotoRes >= 1024 * 768);
                }

                //Diet
                if (query.Diet.GlutenFree)
                {
                    q = q.Where(p => p.Metadata.DietGlutenFree);
                }
                if (query.Diet.NoAnimals)
                {
                    q = q.Where(p => p.Metadata.DietNoAnimals);
                }
                if (query.Diet.NoMeat)
                {
                    q = q.Where(p => p.Metadata.DietNomeat);
                }
                if (query.Diet.NoPork)
                {
                    q = q.Where(p => p.Metadata.DietNoPork);
                }
                if (query.Diet.NoRedMeat)
                {
                    q = q.Where(p => p.Metadata.DietNoRedMeat);
                }

                //Nutrition
                if (query.Nutrition.LowCalorie)
                {
                    q = q.Where(p => p.Metadata.NutritionLowCalorie);
                }
                if (query.Nutrition.LowCarb)
                {
                    q = q.Where(p => p.Metadata.NutritionLowCarb);
                }
                if (query.Nutrition.LowFat)
                {
                    q = q.Where(p => p.Metadata.NutritionLowFat);
                }
                if (query.Nutrition.LowSodium)
                {
                    q = q.Where(p => p.Metadata.NutritionLowSodium);
                }
                if (query.Nutrition.LowSugar)
                {
                    q = q.Where(p => p.Metadata.NutritionLowSugar);
                }

                //Skill
                if (query.Skill.Common)
                {
                    q = q.Where(p => p.Metadata.SkillCommon).OrderByDescending(p => p.Metadata.Commonality);
                }
                if (query.Skill.Easy)
                {
                    q = q.Where(p => p.Metadata.SkillEasy);
                }
                if (query.Skill.Quick)
                {
                    q = q.Where(p => p.Metadata.SkillQuick);
                }

                //Taste
                if (query.Taste.MildToSpicy != SpicinessLevel.Medium)
                {
                    q = query.Taste.MildToSpicy < SpicinessLevel.Medium
                  ? q.Where(p => p.Metadata.TasteMildToSpicy <= query.Taste.Spiciness).OrderBy(p => p.Metadata.TasteMildToSpicy)
                  : q.Where(p => p.Metadata.TasteMildToSpicy >= query.Taste.Spiciness).OrderByDescending(p => p.Metadata.TasteMildToSpicy);
                }

                if (query.Taste.SavoryToSweet != SweetnessLevel.Medium)
                {
                    q = query.Taste.SavoryToSweet < SweetnessLevel.Medium
                  ? q.Where(p => p.Metadata.TasteSavoryToSweet <= query.Taste.Sweetness).OrderBy(p => p.Metadata.TasteSavoryToSweet)
                  : q.Where(p => p.Metadata.TasteSavoryToSweet >= query.Taste.Sweetness).OrderByDescending(p => p.Metadata.TasteSavoryToSweet);
                }
            }

            switch (query.Sort)
            {
            case SortOrder.Title:
                q = (query.Direction == SortDirection.Ascending) ? q.OrderBy(p => p.Recipe.Title) : q.OrderByDescending(p => p.Recipe.Title);
                break;

            case SortOrder.PrepTime:
                q = (query.Direction == SortDirection.Ascending) ? q.OrderBy(p => p.Recipe.PrepTime) : q.OrderByDescending(p => p.Recipe.PrepTime);
                break;

            case SortOrder.CookTime:
                q = (query.Direction == SortDirection.Ascending) ? q.OrderBy(p => p.Recipe.CookTime) : q.OrderByDescending(p => p.Recipe.CookTime);
                break;

            case SortOrder.Image:
                q = (query.Direction == SortDirection.Ascending) ? q.OrderBy(p => p.Recipe.ImageUrl) : q.OrderByDescending(p => p.Recipe.ImageUrl);
                break;

            default:
                q = (query.Direction == SortDirection.Ascending) ? q.OrderBy(p => p.Recipe.Rating) : q.OrderByDescending(p => p.Recipe.Rating);
                break;
            }

            return(new SearchResults
            {
                Briefs = q.Select(r => Data.DTO.Recipes.ToRecipeBrief(r.Recipe)).ToArray(),
                TotalCount = q.Count()
            });
        }
Пример #30
0
        public SearchResults Search(AuthIdentity identity, RecipeQuery query)
        {
            using (var session = this.adapter.GetSession())
            {
                Recipes recipe = null;

                var q = session.QueryOver<Recipes>(() => recipe)
                   .Where(p => !p.Hidden);

                // Add keyword search
                if (!string.IsNullOrWhiteSpace(query.Keywords))
                {
                    q = q.Where(
                       Restrictions.Or(
                          Restrictions.InsensitiveLike("Title", string.Format("%{0}%", query.Keywords.Trim())),
                           Restrictions.InsensitiveLike("Description", string.Format("%{0}%", query.Keywords.Trim()))));
                }

                if (query.Time.MaxPrep.HasValue)
                {
                    q = q.Where(p => p.PrepTime <= query.Time.MaxPrep.Value);
                }

                if (query.Time.MaxCook.HasValue)
                {
                    q = q.Where(p => p.CookTime <= query.Time.MaxCook.Value);
                }

                if (query.Rating > 0)
                {
                    q = q.Where(p => p.Rating >= (int)query.Rating);
                }

                // Add ingredients to include
                if (query.Include != null && query.Include.Length > 0)
                {
                    // Create a sub-query for ingredients to include
                    q = q.WithSubquery
                       .WhereExists(QueryOver.Of<RecipeIngredients>()
                          .Where(item => item.Recipe.RecipeId == recipe.RecipeId)
                          .Where(Restrictions.InG("Ingredient", query.Include.Select(Models.Ingredients.FromId).ToArray()))
                          .Select(i => i.RecipeIngredientId).Take(1));
                }

                // Add ingredients to exclude
                if (query.Exclude != null && query.Exclude.Length > 0)
                {
                    // Create a sub-query for ingredients to exclude
                    q = q.WithSubquery
                       .WhereNotExists(QueryOver.Of<RecipeIngredients>()
                          .Where(item => item.Recipe.RecipeId == recipe.RecipeId)
                          .Where(Restrictions.InG("Ingredient", query.Exclude.Select(Models.Ingredients.FromId).ToArray()))
                          .Select(i => i.RecipeIngredientId).Take(1));
                }

                if (query.Photos == PhotoFilter.Photo || query.Photos == PhotoFilter.HighRes)
                {
                    q = q.Where(Restrictions.IsNotNull("ImageUrl"));
                }

                // Need to search in metadata
                if (query.Diet || query.Nutrition || query.Skill || query.Taste || (query.Meal != MealFilter.All) || (query.Photos == PhotoFilter.HighRes))
                {
                    RecipeMetadata metadata = null;
                    q = q.JoinAlias(r => r.RecipeMetadata, () => metadata);

                    // Meal
                    if (query.Meal != MealFilter.All)
                    {
                        if (query.Meal == MealFilter.Breakfast)
                        {
                            q = q.Where(() => metadata.MealBreakfast);
                        }

                        if (query.Meal == MealFilter.Dessert)
                        {
                            q = q.Where(() => metadata.MealDessert);
                        }

                        if (query.Meal == MealFilter.Dinner)
                        {
                            q = q.Where(() => metadata.MealDinner);
                        }

                        if (query.Meal == MealFilter.Lunch)
                        {
                            q = q.Where(() => metadata.MealLunch);
                        }
                    }

                    // High-res photos
                    if (query.Photos == PhotoFilter.HighRes)
                    {
                        q = q.Where(() => metadata.PhotoRes >= 1024 * 768);
                    }

                    // Diet
                    if (query.Diet.GlutenFree)
                    {
                        q = q.Where(() => metadata.DietGlutenFree);
                    }

                    if (query.Diet.NoAnimals)
                    {
                        q = q.Where(() => metadata.DietNoAnimals);
                    }

                    if (query.Diet.NoMeat)
                    {
                        q = q.Where(() => metadata.DietNomeat);
                    }

                    if (query.Diet.NoPork)
                    {
                        q = q.Where(() => metadata.DietNoPork);
                    }

                    if (query.Diet.NoRedMeat)
                    {
                        q = q.Where(() => metadata.DietNoRedMeat);
                    }

                    // Nutrition
                    if (query.Nutrition.LowCalorie)
                    {
                        q = q.Where(() => metadata.NutritionLowCalorie);
                    }

                    if (query.Nutrition.LowCarb)
                    {
                        q = q.Where(() => metadata.NutritionLowCarb);
                    }

                    if (query.Nutrition.LowFat)
                    {
                        q = q.Where(() => metadata.NutritionLowFat);
                    }

                    if (query.Nutrition.LowSodium)
                    {
                        q = q.Where(() => metadata.NutritionLowSodium);
                    }

                    if (query.Nutrition.LowSugar)
                    {
                        q = q.Where(() => metadata.NutritionLowSugar);
                    }

                    // Skill
                    if (query.Skill.Common)
                    {
                        q = q.Where(() => metadata.SkillCommon).OrderBy(() => metadata.Commonality).Desc();
                    }

                    if (query.Skill.Easy)
                    {
                        q = q.Where(() => metadata.SkillEasy);
                    }

                    if (query.Skill.Quick)
                    {
                        q = q.Where(() => metadata.SkillQuick);
                    }

                    // Taste
                    if (query.Taste.MildToSpicy != SpicinessLevel.Medium)
                    {
                        q = query.Taste.MildToSpicy < SpicinessLevel.Medium
                           ? q.Where(() => metadata.TasteMildToSpicy <= query.Taste.Spiciness).OrderBy(() => metadata.TasteMildToSpicy).Asc()
                           : q.Where(() => metadata.TasteMildToSpicy >= query.Taste.Spiciness).OrderBy(() => metadata.TasteMildToSpicy).Desc();
                    }

                    if (query.Taste.SavoryToSweet != SweetnessLevel.Medium)
                    {
                        q = query.Taste.SavoryToSweet < SweetnessLevel.Medium
                           ? q.Where(() => metadata.TasteSavoryToSweet <= query.Taste.Sweetness).OrderBy(() => metadata.TasteSavoryToSweet).Asc()
                           : q.Where(() => metadata.TasteSavoryToSweet >= query.Taste.Sweetness).OrderBy(() => metadata.TasteSavoryToSweet).Desc();
                    }
                }

                IQueryOverOrderBuilder<Recipes, Recipes> orderBy;
                switch (query.Sort)
                {
                    case SortOrder.Title:
                        orderBy = q.OrderBy(p => p.Title);
                        break;
                    case SortOrder.PrepTime:
                        orderBy = q.OrderBy(p => p.PrepTime);
                        break;
                    case SortOrder.CookTime:
                        orderBy = q.OrderBy(p => p.CookTime);
                        break;
                    case SortOrder.Image:
                        orderBy = q.OrderBy(p => p.ImageUrl);
                        break;
                    default:
                        orderBy = q.OrderBy(p => p.Rating);
                        break;
                }

                var results = (query.Direction == SortDirection.Descending ? orderBy.Desc() : orderBy.Asc())
                   .Skip(query.Offset)
                   .List();

                return new SearchResults
                {
                    Briefs = results.Select(r => r.AsRecipeBrief()).ToArray(),
                    TotalCount = results.Count
                };
            }
        }
Пример #31
0
        public MenuResult UpdateMenu(AuthIdentity identity, Guid?menuId, Guid[] recipesAdd, Guid[] recipesRemove, MenuMove[] recipesMove, bool clear, string newName = null)
        {
            var ret = new MenuResult();

            ret.MenuUpdated = true; // TODO: Verify actual changes were made before setting MenuUpdated to true

            using (var session = GetSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    Models.Menus      dbMenu    = null;
                    IList <Favorites> dbRecipes = null;
                    if (menuId.HasValue)
                    {
                        dbMenu = session.QueryOver <Models.Menus>()
                                 .Fetch(prop => prop.Recipes).Eager
                                 .Where(p => p.MenuId == menuId)
                                 .SingleOrDefault();

                        if (dbMenu == null)
                        {
                            throw new MenuNotFoundException();
                        }

                        if (dbMenu.UserId != identity.UserId) // User does not have access to modify this menu
                        {
                            throw new UserDoesNotOwnMenuException();
                        }

                        if (!String.IsNullOrWhiteSpace(newName) && dbMenu != null) // Rename menu
                        {
                            dbMenu.Title = newName.Trim();
                        }

                        dbRecipes = dbMenu.Recipes;
                    }
                    else
                    {
                        dbRecipes = session.QueryOver <Favorites>()
                                    .Where(p => p.UserId == identity.UserId)
                                    .Where(p => p.Menu == null)
                                    .List();
                    }

                    if (recipesAdd.Any()) // Add recipes to menu
                    {
                        var existing = (from r in dbRecipes select r.Recipe.RecipeId);
                        recipesAdd = recipesAdd.Except(existing).ToArray(); //Remove dupes

                        foreach (var rid in recipesAdd)
                        {
                            var fav = new Favorites
                            {
                                UserId = identity.UserId,
                                Recipe = new Models.Recipes()
                                {
                                    RecipeId = rid
                                },
                                Menu = dbMenu
                            };

                            session.Save(fav);
                        }
                    }

                    if (recipesRemove.Any()) // Remove recipes from menu
                    {
                        var toDelete = (from r in dbRecipes where recipesRemove.Contains(r.Recipe.RecipeId) select r);
                        toDelete.ForEach(session.Delete);
                    }

                    if (clear) // Remove every recipe from menu
                    {
                        dbRecipes.ForEach(session.Delete);
                    }

                    if (recipesMove.Any()) // Move items to another menu
                    {
                        foreach (var moveAction in recipesMove)
                        {
                            Models.Menus dbTarget = null;
                            if (moveAction.TargetMenu.HasValue)
                            {
                                dbTarget = session.QueryOver <Models.Menus>()
                                           .Where(p => p.MenuId == moveAction.TargetMenu.Value)
                                           .Where(p => p.UserId == identity.UserId)
                                           .SingleOrDefault();

                                if (dbTarget == null)
                                {
                                    throw new MenuNotFoundException(moveAction.TargetMenu.Value);
                                }
                            }

                            var rToMove = (moveAction.MoveAll
                        ? dbRecipes
                        : dbRecipes.Where(r => moveAction.RecipesToMove.Contains(r.Recipe.RecipeId)));

                            rToMove.ForEach(a => a.Menu = dbTarget);
                        }
                    }

                    transaction.Commit();
                }
            }

            return(ret);
        }
Пример #32
0
        public SearchResults Search(AuthIdentity identity, RecipeQuery query)
        {
            using (var session = this.adapter.GetSession())
            {
                Recipes recipe = null;

                var q = session.QueryOver <Recipes>(() => recipe)
                        .Where(p => !p.Hidden);

                // Add keyword search
                if (!string.IsNullOrWhiteSpace(query.Keywords))
                {
                    q = q.Where(
                        Restrictions.Or(
                            Restrictions.InsensitiveLike("Title", string.Format("%{0}%", query.Keywords.Trim())),
                            Restrictions.InsensitiveLike("Description", string.Format("%{0}%", query.Keywords.Trim()))));
                }

                if (query.Time.MaxPrep.HasValue)
                {
                    q = q.Where(p => p.PrepTime <= query.Time.MaxPrep.Value);
                }

                if (query.Time.MaxCook.HasValue)
                {
                    q = q.Where(p => p.CookTime <= query.Time.MaxCook.Value);
                }

                if (query.Rating > 0)
                {
                    q = q.Where(p => p.Rating >= (int)query.Rating);
                }

                // Add ingredients to include
                if (query.Include != null && query.Include.Length > 0)
                {
                    // Create a sub-query for ingredients to include
                    q = q.WithSubquery
                        .WhereExists(QueryOver.Of <RecipeIngredients>()
                                     .Where(item => item.Recipe.RecipeId == recipe.RecipeId)
                                     .Where(Restrictions.InG("Ingredient", query.Include.Select(Models.Ingredients.FromId).ToArray()))
                                     .Select(i => i.RecipeIngredientId).Take(1));
                }

                // Add ingredients to exclude
                if (query.Exclude != null && query.Exclude.Length > 0)
                {
                    // Create a sub-query for ingredients to exclude
                    q = q.WithSubquery
                        .WhereNotExists(QueryOver.Of <RecipeIngredients>()
                                        .Where(item => item.Recipe.RecipeId == recipe.RecipeId)
                                        .Where(Restrictions.InG("Ingredient", query.Exclude.Select(Models.Ingredients.FromId).ToArray()))
                                        .Select(i => i.RecipeIngredientId).Take(1));
                }

                if (query.Photos == PhotoFilter.Photo || query.Photos == PhotoFilter.HighRes)
                {
                    q = q.Where(Restrictions.IsNotNull("ImageUrl"));
                }

                // Need to search in metadata
                if (query.Diet || query.Nutrition || query.Skill || query.Taste || (query.Meal != MealFilter.All) || (query.Photos == PhotoFilter.HighRes))
                {
                    RecipeMetadata metadata = null;
                    q = q.JoinAlias(r => r.RecipeMetadata, () => metadata);

                    // Meal
                    if (query.Meal != MealFilter.All)
                    {
                        if (query.Meal == MealFilter.Breakfast)
                        {
                            q = q.Where(() => metadata.MealBreakfast);
                        }

                        if (query.Meal == MealFilter.Dessert)
                        {
                            q = q.Where(() => metadata.MealDessert);
                        }

                        if (query.Meal == MealFilter.Dinner)
                        {
                            q = q.Where(() => metadata.MealDinner);
                        }

                        if (query.Meal == MealFilter.Lunch)
                        {
                            q = q.Where(() => metadata.MealLunch);
                        }
                    }

                    // High-res photos
                    if (query.Photos == PhotoFilter.HighRes)
                    {
                        q = q.Where(() => metadata.PhotoRes >= 1024 * 768);
                    }

                    // Diet
                    if (query.Diet.GlutenFree)
                    {
                        q = q.Where(() => metadata.DietGlutenFree);
                    }

                    if (query.Diet.NoAnimals)
                    {
                        q = q.Where(() => metadata.DietNoAnimals);
                    }

                    if (query.Diet.NoMeat)
                    {
                        q = q.Where(() => metadata.DietNomeat);
                    }

                    if (query.Diet.NoPork)
                    {
                        q = q.Where(() => metadata.DietNoPork);
                    }

                    if (query.Diet.NoRedMeat)
                    {
                        q = q.Where(() => metadata.DietNoRedMeat);
                    }

                    // Nutrition
                    if (query.Nutrition.LowCalorie)
                    {
                        q = q.Where(() => metadata.NutritionLowCalorie);
                    }

                    if (query.Nutrition.LowCarb)
                    {
                        q = q.Where(() => metadata.NutritionLowCarb);
                    }

                    if (query.Nutrition.LowFat)
                    {
                        q = q.Where(() => metadata.NutritionLowFat);
                    }

                    if (query.Nutrition.LowSodium)
                    {
                        q = q.Where(() => metadata.NutritionLowSodium);
                    }

                    if (query.Nutrition.LowSugar)
                    {
                        q = q.Where(() => metadata.NutritionLowSugar);
                    }

                    // Skill
                    if (query.Skill.Common)
                    {
                        q = q.Where(() => metadata.SkillCommon).OrderBy(() => metadata.Commonality).Desc();
                    }

                    if (query.Skill.Easy)
                    {
                        q = q.Where(() => metadata.SkillEasy);
                    }

                    if (query.Skill.Quick)
                    {
                        q = q.Where(() => metadata.SkillQuick);
                    }

                    // Taste
                    if (query.Taste.MildToSpicy != SpicinessLevel.Medium)
                    {
                        q = query.Taste.MildToSpicy < SpicinessLevel.Medium
                           ? q.Where(() => metadata.TasteMildToSpicy <= query.Taste.Spiciness).OrderBy(() => metadata.TasteMildToSpicy).Asc()
                           : q.Where(() => metadata.TasteMildToSpicy >= query.Taste.Spiciness).OrderBy(() => metadata.TasteMildToSpicy).Desc();
                    }

                    if (query.Taste.SavoryToSweet != SweetnessLevel.Medium)
                    {
                        q = query.Taste.SavoryToSweet < SweetnessLevel.Medium
                           ? q.Where(() => metadata.TasteSavoryToSweet <= query.Taste.Sweetness).OrderBy(() => metadata.TasteSavoryToSweet).Asc()
                           : q.Where(() => metadata.TasteSavoryToSweet >= query.Taste.Sweetness).OrderBy(() => metadata.TasteSavoryToSweet).Desc();
                    }
                }

                IQueryOverOrderBuilder <Recipes, Recipes> orderBy;
                switch (query.Sort)
                {
                case SortOrder.Title:
                    orderBy = q.OrderBy(p => p.Title);
                    break;

                case SortOrder.PrepTime:
                    orderBy = q.OrderBy(p => p.PrepTime);
                    break;

                case SortOrder.CookTime:
                    orderBy = q.OrderBy(p => p.CookTime);
                    break;

                case SortOrder.Image:
                    orderBy = q.OrderBy(p => p.ImageUrl);
                    break;

                default:
                    orderBy = q.OrderBy(p => p.Rating);
                    break;
                }

                var results = (query.Direction == SortDirection.Descending ? orderBy.Desc() : orderBy.Asc())
                              .Skip(query.Offset)
                              .List();

                return(new SearchResults
                {
                    Briefs = results.Select(r => r.AsRecipeBrief()).ToArray(),
                    TotalCount = results.Count
                });
            }
        }
Пример #33
0
        public RecipeResult CreateRecipe(AuthIdentity identity, Recipe recipe)
        {
            using (var session = GetSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    // Create Recipe
                    var dbRecipe = new Models.Recipes
                    {
                        Title       = recipe.Title,
                        Description = recipe.Description,
                        CookTime    = recipe.CookTime,
                        PrepTime    = recipe.PrepTime,
                        Credit      = recipe.Credit,
                        CreditUrl   = recipe.CreditUrl,
                        DateEntered = recipe.DateEntered,
                        ImageUrl    = recipe.ImageUrl,
                        Rating      = recipe.AvgRating,
                        ServingSize = recipe.ServingSize,
                        Steps       = recipe.Method
                    };

                    session.Save(dbRecipe);

                    // Create Ingredients
                    short displayOrder = 0;
                    recipe.Ingredients.ForEach(i =>
                    {
                        var dbIngredient = new RecipeIngredients
                        {
                            Recipe         = dbRecipe,
                            Ingredient     = Models.Ingredients.FromId(i.Ingredient.Id),
                            IngredientForm = (i.Form != null ? IngredientForms.FromId(i.Form.FormId) : null),
                            Qty            = (i.Amount != null ? (float?)i.Amount.SizeHigh : null),
                            QtyLow         = (i.Amount != null ? (float?)i.Amount.SizeLow : null),
                            Unit           = (i.Amount != null ? i.Amount.Unit : Units.Unit),
                            Section        = i.Section,
                            DisplayOrder   = ++displayOrder
                        };

                        session.Save(dbIngredient);
                    });

                    // Create RecipeMetadata
                    var dbMetadata = new RecipeMetadata
                    {
                        Recipe              = dbRecipe,
                        DietGlutenFree      = recipe.Tags.HasTag(RecipeTag.GlutenFree),
                        DietNoAnimals       = recipe.Tags.HasTag(RecipeTag.NoAnimals),
                        DietNomeat          = recipe.Tags.HasTag(RecipeTag.NoMeat),
                        DietNoPork          = recipe.Tags.HasTag(RecipeTag.NoPork),
                        DietNoRedMeat       = recipe.Tags.HasTag(RecipeTag.NoRedMeat),
                        MealBreakfast       = recipe.Tags.HasTag(RecipeTag.Breakfast),
                        MealDessert         = recipe.Tags.HasTag(RecipeTag.Dessert),
                        MealDinner          = recipe.Tags.HasTag(RecipeTag.Dinner),
                        MealLunch           = recipe.Tags.HasTag(RecipeTag.Lunch),
                        NutritionLowCalorie = recipe.Tags.HasTag(RecipeTag.LowCalorie),
                        NutritionLowCarb    = recipe.Tags.HasTag(RecipeTag.LowCarb),
                        NutritionLowFat     = recipe.Tags.HasTag(RecipeTag.LowFat),
                        NutritionLowSodium  = recipe.Tags.HasTag(RecipeTag.LowSodium),
                        NutritionLowSugar   = recipe.Tags.HasTag(RecipeTag.LowSugar),
                        SkillCommon         = recipe.Tags.HasTag(RecipeTag.Common),
                        SkillEasy           = recipe.Tags.HasTag(RecipeTag.Easy),
                        SkillQuick          = recipe.Tags.HasTag(RecipeTag.Quick)
                    };

                    session.Save(dbMetadata);
                    transaction.Commit();

                    return(new RecipeResult
                    {
                        RecipeCreated = true,
                        NewRecipeId = dbRecipe.RecipeId
                    });
                }
            }
        }
Пример #34
0
        public void DequeueRecipe(AuthIdentity identity, params Guid[] recipeIds)
        {
            using (var session = GetSession())
             {
            var recipes = (from r in recipeIds select new Models.Recipes {RecipeId = r}).ToArray();

            var dbRecipes = session.QueryOver<QueuedRecipes>()
               .Where(p => p.UserId == identity.UserId);

            if (recipeIds.Any())
            {
               dbRecipes = dbRecipes.AndRestrictionOn(p => p.Recipe).IsInG(recipes);
            }

            using (var transaction = session.BeginTransaction())
            {
               dbRecipes.List().ForEach(session.Delete);
               transaction.Commit();
            }
             }
        }
Пример #35
0
        public void EnqueueRecipes(AuthIdentity identity, params Guid[] recipeIds)
        {
            using (var session = GetSession())
             {
            // Check for dupes
            var recipes = (from r in recipeIds select new Models.Recipes {RecipeId = r}).ToArray();

            var dupes = session.QueryOver<QueuedRecipes>()
               .Where(p => p.UserId == identity.UserId)
               .AndRestrictionOn(p => p.Recipe).IsInG(recipes)
               .List<QueuedRecipes>();

            var existing = (from r in dupes select r.Recipe.RecipeId).ToList();

            // Enqueue each recipe
            using (var transaction = session.BeginTransaction())
            {
               var now = DateTime.Now;
               foreach (var rid in recipeIds.Where(rid => !existing.Contains(rid)))
               {
                  session.Save(new QueuedRecipes
                  {
                     Recipe = new Models.Recipes {RecipeId = rid},
                     UserId = identity.UserId,
                     QueuedDate = now
                  });
               }

               transaction.Commit();
            }
             }
        }
Пример #36
0
        public void DeleteMenus(AuthIdentity identity, params Guid[] menuIds)
        {
            using (var session = GetSession())
             {
            using (var transaction = session.BeginTransaction())
            {
               var dbMenu = session.QueryOver<Models.Menus>()
                  .AndRestrictionOn(p => p.MenuId).IsInG(menuIds)
                  .Where(p => p.UserId == identity.UserId)
                  .Fetch(prop => prop.Recipes).Eager()
                  .List();

               dbMenu.ForEach(session.Delete);
               transaction.Commit();
            }
             }
        }
Пример #37
0
        public Menu[] GetMenus(AuthIdentity identity, IList <Menu> menus, GetMenuOptions options)
        {
            using (var session = GetSession())
            {
                // menus will be null if all menus should be loaded, or a list of Menu objects to specify individual menus to load
                if (options == null)
                {
                    throw new ArgumentNullException("options");
                }
                if (identity == null)
                {
                    throw new ArgumentNullException("identity");
                }

                var loadFav = true;
                var query   = session.QueryOver <Models.Menus>()
                              .Where(p => p.UserId == identity.UserId);

                if (menus != null) // Load individual menus
                {
                    loadFav = menus.Contains(Menu.Favorites);
                    var ids = menus.Where(m => m.Id.HasValue).Select(m => m.Id.Value).ToArray();
                    query = query.AndRestrictionOn(p => p.MenuId).IsInG(ids);
                }

                var dbMenus = query.List();
                var ret     = new List <Menu>();

                if (loadFav)
                {
                    ret.Add(Menu.Favorites);
                }

                ret.AddRange(dbMenus.Select(m => m.AsMenu()));

                if (!options.LoadRecipes) // We're done!
                {
                    return(ret.ToArray());
                }

                // Load recipes into each menu
                ICriterion filter = (loadFav
               ? Expression.Or(Expression.IsNull("Menu"), Expression.InG("Menu", dbMenus)) // Menu can be null, or in loaded menu list
               : Expression.InG("Menu", dbMenus));                                         // Menu must be in loaded menu list

                var dbFavorites = session.QueryOver <Favorites>()
                                  .Fetch(prop => prop.Recipe).Eager
                                  .Where(p => p.UserId == identity.UserId)
                                  .Where(filter)
                                  .List();

                return(ret.Select(m =>
                                  new Menu(m)
                {
                    Recipes = (m.Id.HasValue
                     ? dbFavorites.Where(f => f.Menu != null && f.Menu.MenuId == m.Id)
                     : dbFavorites.Where(f => f.Menu == null)
                               ).Select(r => r.Recipe.AsRecipeBrief()).ToArray()
                }).ToArray());
            }
        }
Пример #38
0
        public void DeleteShoppingLists(AuthIdentity identity, ShoppingList[] lists)
        {
            if (!lists.Any())
            throw new ArgumentException("DeleteShoppingLists requires at least one list to delete.");

             using (var session = GetSession())
             {
            using (var transaction = session.BeginTransaction())
            {
               var dbLists = session.QueryOver<Models.ShoppingLists>()
                  .AndRestrictionOn(p => p.ShoppingListId).IsInG(lists.Where(l => l.Id.HasValue).Select(l => l.Id.Value))
                  .Where(p => p.UserId == identity.UserId)
                  .List();

               dbLists.ForEach(session.Delete);
               transaction.Commit();
            }
             }
        }
Пример #39
0
        public Recipe[] ReadRecipes(AuthIdentity identity, Guid[] recipeIds, ReadRecipeOptions options)
        {
            using (var session = GetSession())
            {
                var dbRecipes = session.QueryOver <Models.Recipes>()
                                .Fetch(prop => prop.RecipeMetadata).Eager
                                .Fetch(prop => prop.Ingredients).Eager
                                .Fetch(prop => prop.Ingredients[0].Ingredient).Eager
                                .Fetch(prop => prop.Ingredients[0].IngredientForm).Eager
                                .AndRestrictionOn(p => p.RecipeId).IsInG(recipeIds)
                                .TransformUsing(Transformers.DistinctRootEntity)
                                .List();

                if (!dbRecipes.Any())
                {
                    throw new RecipeNotFoundException();
                }

                var ret = new List <Recipe>();
                foreach (var dbRecipe in dbRecipes)
                {
                    var recipe = new Recipe
                    {
                        Id          = dbRecipe.RecipeId,
                        Title       = dbRecipe.Title,
                        Description = dbRecipe.Description,
                        DateEntered = dbRecipe.DateEntered,
                        ImageUrl    = dbRecipe.ImageUrl,
                        ServingSize = dbRecipe.ServingSize,
                        PrepTime    = dbRecipe.PrepTime,
                        CookTime    = dbRecipe.CookTime,
                        Credit      = dbRecipe.Credit,
                        CreditUrl   = dbRecipe.CreditUrl,
                        AvgRating   = dbRecipe.Rating
                    };

                    if (options.ReturnMethod)
                    {
                        recipe.Method = dbRecipe.Steps;
                    }

                    if (options.ReturnUserRating) // TODO: We should JOIN this on the dbRecipes for faster loading
                    {
                        var id     = dbRecipe.RecipeId;
                        var rating = session.QueryOver <RecipeRatings>()
                                     .Where(p => p.Recipe.RecipeId == id)
                                     .Where(p => p.UserId == identity.UserId)
                                     .SingleOrDefault();

                        recipe.UserRating = (rating == null ? Rating.None : (Rating)rating.Rating);
                    }

                    recipe.Ingredients = dbRecipe.Ingredients.Select(i => new IngredientUsage
                    {
                        Amount     = i.Qty.HasValue ? new Amount(i.Qty.Value, i.Unit) : null,
                        PrepNote   = i.PrepNote,
                        Section    = i.Section,
                        Form       = i.IngredientForm != null ? i.IngredientForm.AsIngredientForm() : null, // Note: Form will be null when usage has no amount
                        Ingredient = i.Ingredient.AsIngredient()
                    }).ToArray();

                    recipe.Tags = dbRecipe.RecipeMetadata.Tags;
                    ret.Add(recipe);
                }

                return(ret.ToArray());
            }
        }