Skip to content

Instantly share code, notes, and snippets.

@cschneid
Last active August 29, 2015 14:19
Show Gist options
  • Save cschneid/f9a81c43f274314fc624 to your computer and use it in GitHub Desktop.
Save cschneid/f9a81c43f274314fc624 to your computer and use it in GitHub Desktop.
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
module Grocery.Database.Calendar where
import Grocery.DatabaseSchema
import Grocery.Types.Meal
import Database.Persist
import Database.Persist.Sqlite
import qualified Database.Esqueleto as E
import Database.Esqueleto ((^.))
import Data.Time
import Control.Monad.Trans -- for MonadIO
import Data.List
getMeals :: (MonadIO m) => DbUserId -> SqlPersistT m [Meal]
getMeals user = do
results <- E.select $
E.from $ \(m `E.InnerJoin` u `E.LeftOuterJoin` r) -> do
E.on (m ^. DbMealUserId E.==. u ^. DbUserId)
E.on (r ^. DbRecipeMealId E.==. m ^. DbMealId)
E.where_ (m ^. DbMealUserId E.==. E.val user )
return (m,r)
let r2 = groupBy (\a b -> entityKey (fst a) == entityKey (fst b)) results
let r3 = map (\list -> ( (fst . head) list
, map snd list
)) r2
return (map deserializeDb r3)
class DeserializeDb a r | a -> r where
deserializeDb :: a -> r
instance DeserializeDb (Entity DbMeal, [Entity DbRecipe]) Meal where
deserializeDb ((Entity _ val), recipes) =
let d = dbMealDay val
n = dbMealName val
in Meal Nothing (utctDay d) n []
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment