packages feed

sproxy-web-0.3.1: src/Entities.hs

{-# LANGUAGE OverloadedStrings #-}

module Entities where

import Data.Int
import Data.Monoid
import Data.Text.Lazy (Text)
import Database.PostgreSQL.Simple
import Database.PostgreSQL.Simple.Types

-- get the list of groups
getGroups :: Connection -> IO [[Text]]
getGroups conn =
    query_ conn "select * from \"group\" order by \"group\" asc"

-- change a group's name
updateGroup :: Text -> Text -> Connection -> IO Int64
updateGroup old new conn =
    execute conn "UPDATE \"group\" \
                 \ SET \"group\" = ? \
                 \ WHERE \"group\" = ?"
                 (new, old)

-- add a new group
addGroup :: Text -> Connection -> IO Int64
addGroup gname conn =
    execute conn "INSERT INTO \"group\" \
                 \ VALUES (?)"
                 (Only gname)

-- remove a group
removeGroup :: Text -> Connection -> IO Int64
removeGroup gname conn =
    execute conn "DELETE FROM \"group\" \
                 \ WHERE \"group\" = ?"
                 (Only gname)

-- get members of a group
getMembersFor :: Text -> Connection -> IO [[Text]]
getMembersFor gname conn =
    query conn "SELECT email::text FROM group_member \
               \ WHERE \"group\" = ? \
               \ ORDER BY email ASC"
               (Only gname)

-- add a member to a group
addMemberTo :: Text -> Text -> Connection -> IO Int64
addMemberTo new groupName conn =
    execute conn "INSERT INTO group_member (\"group\", email) \
               \ VALUES (?, ?)"
               (groupName, new)

-- remove a user from a group
removeMemberOf :: Text -> Text -> Connection -> IO Int64
removeMemberOf member groupName conn =
    execute conn "DELETE FROM group_member \
                 \ WHERE \"group\" = ? AND email = ?"
                 (groupName, member)

-- update a (meta-)user's email
updateMemberOf :: Text -> Text -> Text -> Connection -> IO Int64
updateMemberOf old new groupName conn =
    execute conn "UPDATE group_member \ 
                 \ SET email = ? \
                 \ WHERE \"group\" = ? AND email = ?"
                 (new, groupName, old)

-- list the different domains
getDomains :: Connection -> IO [[Text]]
getDomains conn = 
    query_ conn "SELECT domain \ 
                \ FROM domain \ 
                \ ORDER BY domain ASC"

-- add a domain
addDomain :: Text -> Connection -> IO Int64
addDomain d conn =
    execute conn "INSERT INTO domain (domain) \
                 \ VALUES (?)"
                 (Only d)

-- update a domain's "name"
updateDomain :: Text -> Text -> Connection -> IO Int64
updateDomain old new conn =
    execute conn "UPDATE domain \ 
                 \ SET domain = ? \
                 \ WHERE domain = ?"
                 (new, old)

-- remove a domain
removeDomain :: Text -> Connection -> IO Int64
removeDomain d conn =
    execute conn "DELETE FROM domain \ 
                 \ WHERE domain = ?"
                 (Only d)

-- get the privileges associated to a domain
getDomainPrivileges :: Text -> Connection -> IO [[Text]]
getDomainPrivileges domain conn =
    query conn "SELECT privilege \ 
               \ FROM privilege \ 
               \ WHERE domain = ? \ 
               \ ORDER BY privilege ASC"
               (Only domain)

-- update the name of a privilege associated to a domain
updatePrivilegeOfDomain :: Text -> Text -> Text -> Connection -> IO Int64
updatePrivilegeOfDomain old new domain conn =
    execute conn "UPDATE privilege \ 
                 \ SET privilege = ? \ 
                 \ WHERE domain = ? AND privilege = ?"
                 (new, domain, old)

-- add a privilege for the given domain
addPrivilegeToDomain :: Text -> Text -> Connection -> IO Int64
addPrivilegeToDomain new domain conn =
    execute conn "INSERT INTO privilege (domain, privilege) \ 
                 \ VALUES (?, ?)"
                 (domain, new)

-- remove a privilege for the given domain
removePrivilegeOfDomain :: Text -> Text -> Connection -> IO Int64                 
removePrivilegeOfDomain old domain conn =
    execute conn "DELETE FROM privilege \ 
                 \ WHERE domain = ? AND privilege = ?"
                 (domain, old)

-- list the path/method rules for a given privilege on a given domain
getRules :: Text -> Text -> Connection -> IO [(Text, Text)]
getRules domain privilege conn =
    query conn "SELECT path, method \ 
               \ FROM privilege_rule \ 
               \ WHERE domain = ? \
               \   AND privilege = ? \ 
               \ ORDER BY path, method ASC"
               (domain, privilege)

-- add a path/method rule for a given privilege on a given domain
addRuleToPrivilege :: Text -> Text -> Text -> Text -> Connection -> IO Int64
addRuleToPrivilege domain privilege path method conn =
    execute conn "INSERT INTO privilege_rule \
                 \   (domain, privilege, path, method) \
                 \ VALUES \
                 \   (?, ?, ?, ?)"
                 (domain, privilege, path, method)

-- delete a privilege rule
deleteRuleFromPrivilege :: Text -> Text -> Text -> Text -> Connection -> IO Int64
deleteRuleFromPrivilege domain privilege path method conn =
    execute conn "DELETE FROM privilege_rule \ 
                 \ WHERE domain = ? \
                 \   AND privilege = ? \
                 \   AND path = ? \
                 \   AND method = ?"
                 (domain, privilege, path, method)

-- update just the path for a given rule
updatePathFor :: Text -> Text -> Text -> Text -> Text -> Connection -> IO Int64
updatePathFor domain privilege newpath oldpath method conn =
    execute conn "UPDATE privilege_rule \ 
                 \ SET path = ? \ 
                 \ WHERE domain = ? \
                 \   AND privilege = ? \ 
                 \   AND path = ? \ 
                 \   AND method = ?"
                 (newpath, domain, privilege, oldpath, method)

-- update just the method for a given rule
updateMethodFor :: Text -> Text -> Text -> Text -> Text -> Connection -> IO Int64
updateMethodFor domain privilege newmethod oldmethod path conn = 
    execute conn "UPDATE privilege_rule \ 
                 \ SET method = ? \ 
                 \ WHERE domain = ? \ 
                 \   AND privilege = ? \ 
                 \   AND path = ? \ 
                 \   AND method = ?"
                 (newmethod, domain, privilege, path, oldmethod)

-- get the list of privileges granted to groups for a given domain
getGroupPrivsFor :: Text -> Connection -> IO [(Text, Text)]
getGroupPrivsFor domain conn =
    query conn "SELECT \"group\", privilege \
               \ FROM group_privilege \
               \ WHERE domain = ? \ 
               \ ORDER BY \"group\", privilege ASC"
               (Only domain)

-- grant a privilege to a group on a domain
addGPFor :: Text -> Text -> Text -> Connection -> IO Int64
addGPFor domain gr priv conn = 
    execute conn "INSERT INTO group_privilege \
                 \  (\"group\", domain, privilege) \
                 \ VALUES (?, ?, ?)"
                 (gr, domain, priv)

-- remove a privilege for a group on a domain
deleteGPOf :: Text -> Text -> Text -> Connection -> IO Int64
deleteGPOf domain gr priv conn =
    execute conn "DELETE FROM group_privilege \ 
                 \ WHERE domain = ? \ 
                 \   AND \"group\" = ? \
                 \   AND privilege = ?"
                 (domain, gr, priv)

-- | completely remove a user from the sproxy db by
--   removing it from any group it belongs to.
removeUser :: Text -> Connection -> IO Int64
removeUser email conn =
    execute conn "DELETE FROM group_member \
                 \ WHERE email = ?"
                 (Only email)

-- | Search an user. Returns a list of matching emails
searchUser :: Text -> Connection -> IO [(Text, [Text])]
searchUser searchQuery conn = fmap postprocess $
    query conn "SELECT email::text, array_agg(\"group\") \
               \ FROM group_member \
               \ WHERE email LIKE ? \
               \ GROUP BY email"
               (Only $ "%" <> searchQuery <> "%")

    where postprocess = map (\(mail, groups) -> (mail, fromPGArray groups))

renameUser :: Text -> Text -> Connection -> IO Int64
renameUser oldemail newemail conn =
  execute conn
              "UPDATE group_member \
              \ SET email = ? \
              \ WHERE email = ?"
              (newemail, oldemail)