2 Module : Gargantext.Database.user
3 Description : User Database management tools
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
10 Functions to deal with users, database side.
14 {-# OPTIONS_GHC -fno-warn-orphans #-}
16 {-# LANGUAGE FunctionalDependencies #-}
17 {-# LANGUAGE Arrows #-}
18 {-# LANGUAGE TemplateHaskell #-}
20 module Gargantext.Database.Schema.User where
22 import Data.Text (Text)
23 import Data.Time (UTCTime)
24 import Gargantext.Prelude
25 import GHC.Generics (Generic)
26 import Database.PostgreSQL.Simple.FromField (FromField, fromField)
27 import Data.Aeson.TH (deriveJSON)
28 import Gargantext.Database.Prelude (fromField')
29 import Gargantext.Core.Utils.Prefix (unPrefix)
31 -- FIXME PLZ : the import below leads to an error, why ?
32 -- import Gargantext.Database.Schema.Prelude hiding (makeLensesWith, abbreviatedFields, makeAdaptorAndInstance)
34 -- When FIXED : Imports to remove:
35 import Control.Lens.TH (makeLensesWith, abbreviatedFields)
36 import Data.Profunctor.Product.TH (makeAdaptorAndInstance)
37 import Opaleye hiding (FromField)
39 ------------------------------------------------------------------------
40 data UserLight = UserLight { userLight_id :: !Int
41 , userLight_username :: !Text
42 , userLight_email :: !Text
43 , userLight_password :: !Text
44 } deriving (Show, Generic)
46 toUserLight :: UserDB -> UserLight
47 toUserLight (UserDB id p _ _ u _ _ e _ _ _ ) = UserLight id u e p
50 data UserPoly id pass llogin suser
52 mail staff active djoined =
53 UserDB { user_id :: !id
54 , user_password :: !pass
55 , user_lastLogin :: !llogin
56 , user_isSuperUser :: !suser
58 , user_username :: !uname
59 , user_firstName :: !fname
60 , user_lastName :: !lname
63 , user_isStaff :: !staff
64 , user_isActive :: !active
65 , user_dateJoined :: !djoined
66 } deriving (Show, Generic)
69 type UserWrite = UserPoly (Maybe (Column PGInt4)) (Column PGText)
70 (Maybe (Column PGTimestamptz)) (Column PGBool)
71 (Column PGText) (Column PGText)
72 (Column PGText) (Column PGText)
73 (Column PGBool) (Column PGBool)
74 (Maybe (Column PGTimestamptz))
76 type UserRead = UserPoly (Column PGInt4) (Column PGText)
77 (Column PGTimestamptz) (Column PGBool)
78 (Column PGText) (Column PGText)
79 (Column PGText) (Column PGText)
80 (Column PGBool) (Column PGBool)
81 (Column PGTimestamptz)
83 type UserReadNull = UserPoly (Column (Nullable PGInt4)) (Column (Nullable PGText))
84 (Column (Nullable PGTimestamptz)) (Column (Nullable PGBool))
85 (Column (Nullable PGText)) (Column (Nullable PGText))
86 (Column (Nullable PGText)) (Column (Nullable PGText))
87 (Column (Nullable PGBool)) (Column (Nullable PGBool))
88 (Column (Nullable PGTimestamptz))
90 type UserDB = UserPoly Int Text (Maybe UTCTime) Bool Text Text Text Text Bool Bool UTCTime
92 $(makeAdaptorAndInstance "pUserDB" ''UserPoly)
93 $(makeLensesWith abbreviatedFields ''UserPoly)
95 userTable :: Table UserWrite UserRead
96 userTable = Table "auth_user"
97 (pUserDB UserDB { user_id = optional "id"
98 , user_password = required "password"
99 , user_lastLogin = optional "last_login"
100 , user_isSuperUser = required "is_superuser"
101 , user_username = required "username"
102 , user_firstName = required "first_name"
103 , user_lastName = required "last_name"
104 , user_email = required "email"
105 , user_isStaff = required "is_staff"
106 , user_isActive = required "is_active"
107 , user_dateJoined = optional "date_joined"
111 instance FromField UserLight where
112 fromField = fromField'
114 instance FromField UserDB where
115 fromField = fromField'
117 $(deriveJSON (unPrefix "userLight_") ''UserLight)
118 $(deriveJSON (unPrefix "user_") ''UserPoly)