packages feed

project-m36-1.2.0: src/bin/TutorialD/Interpreter/LoginRolesOperator.hs

module TutorialD.Interpreter.LoginRolesOperator where
import ProjectM36.Client as C
import qualified ProjectM36.LoginRoles as LoginRoles
import ProjectM36.Interpreter as I
import qualified Data.Text as T
import Data.Functor

import TutorialD.Interpreter.Base

alterLoginRolesExprP :: Parser AlterLoginRolesExpr
alterLoginRolesExprP =
  showAllRolesExprP <|>
  alterRoleNameExprP <|>
  alterRoleMayLoginExprP <|>
  showRolesForRoleExprP <|>
  addLoginRoleToRoleExprP <|>  
  addLoginRoleExprP <|>
  removeLoginRoleExprP <|>
  removeLoginRoleFromRoleExprP <|>
  addPermissionToRoleExprP <|>
  removePermissionFromRoleExprP
  where
    mayGrantP = do
      (reserved "maygrant" $> True) <|> (reserved "nogrant" $> False)
    mayLoginP = do
      (reserved "maylogin" $> True) <|> (reserved "maynotlogin" $> False)
    showRolesForRoleExprP = do
      colonOp ":showloginrole" 
      ShowRolesForRoleExpr <$> roleNameP
    addLoginRoleExprP = do
      colonOp ":addloginrole"
      AddLoginRoleExpr <$> roleNameP <*> mayLoginP
    removeLoginRoleExprP = do
      colonOp ":removeloginrole"
      RemoveLoginRoleExpr <$> roleNameP
    showAllRolesExprP = do
      colonOp ":showloginroles"
      pure ShowAllRolesExpr
    addLoginRoleToRoleExprP = do
      colonOp ":addloginroletorole"
      AddRoleToRoleExpr <$> roleNameP <*> roleNameP <*> mayGrantP
    removeLoginRoleFromRoleExprP = do
      colonOp ":removeloginrolefromrole"
      RemoveRoleFromRoleExpr <$> roleNameP <*> roleNameP
    addPermissionToRoleExprP = do
      colonOp ":addpermissiontologinrole"
      AddPermissionToRoleExpr <$> permissionP <*> roleNameP <*> mayGrantP
    removePermissionFromRoleExprP = do
      colonOp ":removepermissionfromloginrole"
      RemovePermissionFromRoleExpr <$> roleNameP <*> permissionP
    alterRoleNameExprP = do
      colonOp ":alterrolename"
      AlterLoginRoleExpr <$> roleNameP <*> (Just <$> roleNameP) <*> pure Nothing
    alterRoleMayLoginExprP = do
      colonOp ":alterrolemaylogin"
      AlterLoginRoleExpr <$> roleNameP <*> pure Nothing <*> (Just <$> mayLoginP)

evalAlterLoginRolesExpr :: SessionId -> Connection -> AlterLoginRolesExpr -> IO ConsoleResult
evalAlterLoginRolesExpr sessionId conn expr = do
  result <- C.executeAlterLoginRolesExpr sessionId conn expr
  case result of
    Left err -> pure (DisplayErrorResult (T.pack (show err)))
    Right LoginRoles.QuietSuccessResult -> pure I.QuietSuccessResult
    Right (LoginRoles.InfoResult info) -> pure (DisplayResult info)