Advertisement
Guest User

Untitled

a guest
Aug 11th, 2016
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.85 KB | None | 0 0
  1. {-# LANGUAGE TypeFamilies #-}
  2. {-# LANGUAGE OverloadedStrings #-}
  3. {-# LANGUAGE FlexibleInstances #-}
  4. {-# LANGUAGE MultiParamTypeClasses #-}
  5. module Api.User where
  6.  
  7. import Servant
  8. import Models
  9. import Enums
  10. import Config
  11. import Api.Database
  12. import Data.Aeson
  13. import Database.Esqueleto hiding (limit, offset)
  14. import qualified Database.Esqueleto as E
  15. import qualified Database.Persist as P
  16. import Data.Text (Text)
  17. import Api.User.In as In
  18. import Api.User.Out as Out
  19. import Api.User.Query
  20. import ACL
  21. import Control.Monad (when)
  22.  
  23. instance ServerFor User UserQuery UserIn UserOut where
  24.  
  25. doSelect authId muId mq = do
  26. rows <- runDB $ select $ from $ \(u `InnerJoin` ug) -> do
  27. on (ug ^. UserGroupId ==. u ^. UserActiveUserGroupId)
  28. where_ $ maybe (val True) ((==. (u ^. UserId)) . val) muId
  29. where_ $ (val authId ==. u ^. UserId)
  30. ||. (hasRoleOnUser authId allValues (u ^. UserId))
  31. case mq of
  32. Just q -> do
  33. orderBy [ asc (u ^. UserName) ]
  34. E.limit $ limit q
  35. E.offset $ offset q
  36. when (onlyActive q) $ where_ $ u ^. UserActive ==. val Active
  37. Nothing -> E.limit defaultLimit
  38. return (u, ug)
  39. return [ Out.fromUser u ug | (u, ug) <- rows ]
  40.  
  41. fromIn authId (UserIn n fn ln o e p ugId a) = return $ User {
  42. userName = n,
  43. userFirstName = fn,
  44. userLastName = ln,
  45. userOrganization = o,
  46. userEmail = e,
  47. userPhone = p,
  48. userPassword = "",
  49. userActiveUserGroupId = ugId,
  50. userActive = a
  51. }
  52.  
  53.  
  54. canPost authId u = hasRole' authId [Admin] (In.activeUserGroupId u)
  55. canPut authId uId u
  56. | authId == uId = return True
  57. | otherwise = do
  58. ok1 <- hasRoleOnUser' authId [Admin] uId
  59. ok2 <- hasRole' authId [Admin] (In.activeUserGroupId u)
  60. return $ ok1 && ok2
  61. canDel authId uId
  62. | authId == uId = return False
  63. | otherwise = hasRoleOnUser' authId [Admin] uId
  64.  
  65. doPut _ uId u = do
  66. mu <- P.get uId
  67. case mu of
  68. Just u' -> replace uId $ u' {
  69. userName = userName u,
  70. userFirstName = userFirstName u,
  71. userLastName = userLastName u,
  72. userOrganization = userOrganization u,
  73. userEmail = userEmail u,
  74. userPhone = userPhone u,
  75. userActiveUserGroupId = userActiveUserGroupId u,
  76. userActive = userActive u
  77. }
  78. Nothing -> return ()
  79. doDel _ uId = do
  80. update $ \u -> do
  81. set u [ UserActive =. val Inactive ]
  82. where_ $ u ^. UserId ==. val uId
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement