{-# LANGUAGE OverloadedStrings #-} module Control.Role where import Servant import Control.Monad (void) import Control.Monad.Reader (asks) -- internal imports import Types import Model import Util roleList :: MateHandler [Role] roleList = do conn <- asks rsConnection selectAllRoles conn roleNew :: Maybe (Int, AuthMethod) -> RoleSubmit -> MateHandler Int roleNew (Just (uid, auth)) (RoleSubmit name c1 c2 c3 c4 c5 c6 c7 c8 c9 c10) = do isRoleManager <- checkCapability uid roleCanManageRoles if auth `elem` [PrimaryPass, ChallengeResponse] && isRoleManager then insertRole name c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 =<< asks rsConnection else throwError $ err401 { errBody = "You are not authorized for this action." } roleNew Nothing _ = throwError $ err401 { errBody = "No Authentication present." } roleUpdate :: Maybe (Int, AuthMethod) -> Int -> RoleSubmit -> MateHandler NoContent roleUpdate (Just (uid, auth)) id_ roleSubmit = do isRoleManager <- checkCapability uid roleCanManageRoles if auth `elem` [PrimaryPass, ChallengeResponse] && isRoleManager then do void $ updateRole id_ roleSubmit =<< asks rsConnection return NoContent else throwError $ err401 { errBody = "You are not authorized for this action." } roleUpdate Nothing _ _ = throwError $ err401 { errBody = "No Authentication present." } roleDelete :: Maybe (Int, AuthMethod) -> Int -> MateHandler NoContent roleDelete (Just (uid, auth)) id_ = do isRoleManager <- checkCapability uid roleCanManageRoles if auth `elem` [PrimaryPass, ChallengeResponse] && isRoleManager then do void $ deleteRole id_ =<< asks rsConnection return NoContent else throwError $ err401 { errBody = "You are not authorized for this action." } roleDelete Nothing _ = throwError $ err401 { errBody = "No Authentication present." } roleAssociationList :: MateHandler [RoleAssociation] roleAssociationList = selectAllRoleAssociations =<< asks rsConnection roleAssociationSubmit :: Maybe (Int, AuthMethod) -> RoleAssociationSubmit -> MateHandler NoContent roleAssociationSubmit (Just (uid, auth)) (RoleAssociationSubmit auid arid) = do isRoleManager <- checkCapability uid roleCanManageRoles if auth `elem` [PrimaryPass, ChallengeResponse] && isRoleManager then do associateUserToRole auid arid =<< asks rsConnection return NoContent else throwError $ err401 { errBody = "You are not authorized for this action." } roleAssociationSubmit Nothing _ = throwError $ err401 { errBody = "No Authentication present." } roleAssociationDelete :: Maybe (Int, AuthMethod) -> RoleAssociation -> MateHandler NoContent roleAssociationDelete (Just (uid, auth)) (RoleAssociation auid arid) = do isRoleManager <- checkCapability uid roleCanManageRoles if auth `elem` [PrimaryPass, ChallengeResponse] && isRoleManager then do void $ deleteAssociation auid arid =<< asks rsConnection return NoContent else throwError $ err401 { errBody = "You are not authorized for this action." } roleAssociationDelete Nothing _ = throwError $ err401 { errBody = "No Authentication present." }