module BDCS.GroupKeyValue(getGroupsByKeyVal,
getKeyValuesForGroup,
getValueForGroup,
insertGroupKeyValue)
where
import Control.Monad.IO.Class(MonadIO)
import Data.Maybe(listToMaybe, mapMaybe)
import Data.Bifunctor(bimap)
import qualified Data.Text as T
import Database.Esqueleto
import BDCS.DB
import BDCS.KeyType
import BDCS.KeyValue(findKeyValue, insertKeyValue)
insertGroupKeyValue :: MonadIO m => KeyType -> T.Text -> Maybe T.Text -> Key Groups -> SqlPersistT m (Key GroupKeyValues)
insertGroupKeyValue k v e groupId =
maybeKey (insertKeyValue k (Just v) e >>= \kvId -> insert $ GroupKeyValues groupId kvId)
(insert . GroupKeyValues groupId)
(findKeyValue k (Just v) e)
getKeyValuesForGroup :: MonadIO m => Key Groups -> Maybe KeyType -> SqlPersistT m [KeyVal]
getKeyValuesForGroup groupId key = do
vals <- select $ from $ \(keyval `InnerJoin` group_keyval) -> do
on $ keyval ^. KeyValId ==. group_keyval ^. GroupKeyValuesKey_val_id
where_ $ group_keyval ^. GroupKeyValuesGroup_id ==. val groupId &&.
(isNothing (val key) ||. just (keyval ^. KeyValKey_value) ==. val key)
return keyval
return $ map entityVal vals
getValueForGroup :: MonadIO m => Key Groups -> KeyType -> SqlPersistT m (Maybe T.Text)
getValueForGroup groupId key = listToMaybe <$> mapMaybe keyValVal_value <$> getKeyValuesForGroup groupId (Just key)
getGroupsByKeyVal :: MonadIO m => T.Text -> KeyType -> Maybe T.Text -> SqlPersistT m [(Key Groups, KeyVal)]
getGroupsByKeyVal groupType key value = do
vals <- select $ distinct $ from $ \(keyval `InnerJoin` group_keyval `InnerJoin` groups) -> do
on $ groups ^. GroupsId ==. group_keyval ^. GroupKeyValuesGroup_id
on $ keyval ^. KeyValId ==. group_keyval ^. GroupKeyValuesKey_val_id
where_ $ keyval ^. KeyValKey_value ==. val key &&.
keyval ^. KeyValVal_value ==? value &&.
groups ^. GroupsGroup_type ==. val groupType
return (group_keyval ^. GroupKeyValuesGroup_id, keyval)
return $ map (bimap unValue entityVal) vals