1 {-# LANGUAGE TemplateHaskell #-}
2 {-# LANGUAGE FlexibleInstances #-}
3 {-# LANGUAGE MultiParamTypeClasses #-}
4 {-# LANGUAGE FunctionalDependencies #-}
5 {-# LANGUAGE Arrows #-}
7 module Data.Gargantext.Database.User where
10 import Data.Gargantext.Prelude
11 import Data.Time (UTCTime)
12 import Data.Text (Text)
13 import Data.Maybe (Maybe)
14 import Data.Profunctor.Product.TH (makeAdaptorAndInstance)
15 import Control.Lens.TH (makeLensesWith, abbreviatedFields)
16 import Control.Arrow (returnA)
17 import qualified Database.PostgreSQL.Simple as PGS
19 import qualified Opaleye as O
20 import Opaleye (Column, PGBool, PGInt4, PGText, PGTimestamptz
22 , QueryRunnerColumnDefault, queryRunnerColumnDefault
23 , fieldQueryRunnerColumn
28 import Data.Gargantext.Database.Private (infoGargandb)
29 import Data.Gargantext.Database.Instances
32 import Data.List (find)
35 data UserLight = UserLight { userLight_id :: Int
36 , userLight_username :: Text
37 , userLight_email :: Text
40 toUserLight :: User -> UserLight
41 toUserLight (User id _ _ _ u _ _ e _ _ _ ) = UserLight id u e
43 data UserPoly id pass llogin suser
45 mail staff active djoined = User { user_id :: id
46 , user_password :: pass
47 , user_lastLogin :: llogin
48 , user_isSuperUser :: suser
50 , user_username :: uname
51 , user_firstName :: fname
52 , user_lastName :: lname
55 , user_isStaff :: staff
56 , user_isActive :: active
57 , user_dateJoined :: djoined
60 type UserWrite = UserPoly (Maybe (Column PGInt4)) (Column PGText)
61 (Maybe (Column PGTimestamptz)) (Column PGBool)
62 (Column PGText) (Column PGText)
63 (Column PGText) (Column PGText)
64 (Column PGBool) (Column PGBool)
65 (Column PGTimestamptz)
67 type UserRead = UserPoly (Column PGInt4) (Column PGText)
68 (Column PGTimestamptz) (Column PGBool)
69 (Column PGText) (Column PGText)
70 (Column PGText) (Column PGText)
71 (Column PGBool) (Column PGBool)
72 (Column PGTimestamptz)
74 type User = UserPoly Int Text (Maybe UTCTime) Bool Text Text Text Text Bool Bool UTCTime
76 $(makeAdaptorAndInstance "pUser" ''UserPoly)
77 $(makeLensesWith abbreviatedFields ''UserPoly)
80 userTable :: O.Table UserWrite UserRead
81 userTable = O.Table "auth_user" (pUser User { user_id = optional "id"
82 , user_password = required "password"
83 , user_lastLogin = optional "last_login"
84 , user_isSuperUser = required "is_superuser"
85 , user_username = required "username"
86 , user_firstName = required "first_name"
87 , user_lastName = required "last_name"
88 , user_email = required "email"
89 , user_isStaff = required "is_staff"
90 , user_isActive = required "is_active"
91 , user_dateJoined = required "date_joined"
96 queryUserTable :: Query UserRead
97 queryUserTable = O.queryTable userTable
100 selectUsersLight :: Query UserRead
101 selectUsersLight = proc () -> do
102 row@(User i p ll is un fn ln m iff ive dj) <- queryUserTable -< ()
103 O.restrict -< i .== 1
104 --returnA -< User i p ll is un fn ln m iff ive dj
108 userWith :: (Eq a1, Foldable t) => (a -> a1) -> a1 -> t a -> Maybe a
109 userWith f t xs = find (\x -> f x == t) xs
111 userWithUsername :: Text -> [User] -> Maybe User
112 userWithUsername t xs = userWith user_username t xs
114 userWithId :: Int -> [User] -> Maybe User
115 userWithId t xs = userWith user_id t xs
120 conn <- PGS.connect infoGargandb
121 O.runQuery conn queryUserTable
123 usersLight :: IO [UserLight]
125 conn <- PGS.connect infoGargandb
126 pm toUserLight <$> O.runQuery conn queryUserTable