{- This file is part of Vervis. - - Written in 2016 by fr33domlover . - - ♡ Copying is an act of love. Please copy, reuse and share. - - The author(s) have dedicated all copyright and related and neighboring - rights to this software to the public domain worldwide. This software is - distributed without any warranty. - - You should have received a copy of the CC0 Public Domain Dedication along - with this software. If not, see - . -} module Vervis.Field.Role ( newRoleIdentField , newOpField ) where import Prelude -- import Control.Monad (void) -- import Control.Monad.Trans.Maybe -- import Data.Char (isDigit) -- import Data.Maybe (isNothing, isJust) import Data.Text (Text) import Database.Esqueleto import Yesod.Form.Fields (textField, selectField, optionsEnum) import Yesod.Form.Functions (checkM, convertField) import Yesod.Form.Types (Field) import Yesod.Persist.Core (runDB) -- import qualified Data.Text as T (null, all, find, split) -- import Data.Char.Local (isAsciiLetter) import Vervis.Foundation (Handler, AppDB) import Vervis.Model import Vervis.Model.Ident (RlIdent, rl2text, text2rl) import Vervis.Model.Role checkUniqueCI :: PersonId -> Field Handler RlIdent -> Field Handler RlIdent checkUniqueCI pid = checkM $ \ rl -> do sames <- runDB $ select $ from $ \ role -> do where_ $ role ^. RolePerson ==. val pid &&. lower_ (role ^. RoleIdent) ==. lower_ (val rl) limit 1 return () return $ if null sames then Right rl else Left ("This role name is already in use" :: Text) roleIdentField :: Field Handler RlIdent roleIdentField = convertField text2rl rl2text textField newRoleIdentField :: PersonId -> Field Handler RlIdent newRoleIdentField pid = checkUniqueCI pid roleIdentField opField :: Field Handler Operation opField = selectField optionsEnum checkOpNew :: AppDB RoleId -> Field Handler Operation -> Field Handler Operation checkOpNew getrid = checkM $ \ op -> do ma <- runDB $ do rid <- getrid getBy $ UniqueAccess rid op return $ case ma of Nothing -> Right op Just _ -> Left ("Role already has this operation" :: Text) newOpField :: AppDB RoleId -> Field Handler Operation newOpField getrid = checkOpNew getrid opField