1 {-# LANGUAGE DeriveAnyClass #-}
2 {-# LANGUAGE DuplicateRecordFields #-}
4 module Gargantext.API.GraphQL.UserInfo where
7 import Data.Maybe (fromMaybe)
8 import Data.Morpheus.Types
15 import Data.Text (Text)
16 import qualified Data.Text as T
17 import Gargantext.API.Prelude (GargM, GargError)
18 import Gargantext.Core.Mail.Types (HasMail)
19 import Gargantext.Database.Admin.Types.Hyperdata
24 import Gargantext.Database.Admin.Types.Hyperdata.Contact
41 import Gargantext.Database.Prelude (HasConnectionPool, HasConfig)
42 import Gargantext.Database.Query.Table.Node.UpdateOpaleye (updateHyperdata)
43 import Gargantext.Database.Query.Table.User (getUsersWithHyperdata, getUsersWithNodeHyperdata, updateUserEmail)
44 import Gargantext.Database.Schema.User (UserLight(..))
45 import Gargantext.Database.Schema.Node (node_id, node_hyperdata)
46 import Gargantext.Prelude
47 import GHC.Generics (Generic)
48 import Gargantext.API.GraphQL.Utils (AuthStatus(Invalid, Valid), authUser)
50 data UserInfo = UserInfo
54 , ui_title :: Maybe Text
55 , ui_source :: Maybe Text
56 , ui_cwFirstName :: Maybe Text
57 , ui_cwLastName :: Maybe Text
58 , ui_cwCity :: Maybe Text
59 , ui_cwCountry :: Maybe Text
60 , ui_cwOrganization :: [Text]
61 , ui_cwLabTeamDepts :: [Text]
62 , ui_cwOffice :: Maybe Text
63 , ui_cwRole :: Maybe Text
64 , ui_cwTouchPhone :: Maybe Text
65 , ui_cwTouchMail :: Maybe Text -- TODO: Remove. userLight_email should be used instead
67 deriving (Generic, GQLType, Show)
69 -- | Arguments to the "user info" query.
73 } deriving (Generic, GQLType)
75 -- | Arguments to the "user info" mutation,
80 , ui_username :: Maybe Text
81 , ui_email :: Maybe Text
82 , ui_title :: Maybe Text
83 , ui_source :: Maybe Text
84 , ui_cwFirstName :: Maybe Text
85 , ui_cwLastName :: Maybe Text
86 , ui_cwCity :: Maybe Text
87 , ui_cwCountry :: Maybe Text
88 , ui_cwOrganization :: Maybe [Text]
89 , ui_cwLabTeamDepts :: Maybe [Text]
90 , ui_cwOffice :: Maybe Text
91 , ui_cwRole :: Maybe Text
92 , ui_cwTouchPhone :: Maybe Text
93 , ui_cwTouchMail :: Maybe Text
94 } deriving (Generic, GQLType)
96 type GqlM e env = Resolver QUERY e (GargM env GargError)
98 -- | Function to resolve user from a query.
100 :: (HasConnectionPool env, HasConfig env, HasMail env)
101 => UserInfoArgs -> GqlM e env [UserInfo]
102 resolveUserInfos UserInfoArgs { user_id } = dbUsers user_id
104 -- | Mutation for user info
106 :: (HasConnectionPool env, HasConfig env, HasMail env)
107 -- => UserInfoMArgs -> ResolverM e (GargM env err) Int
108 => UserInfoMArgs -> GqlM e env Int
109 updateUserInfo (UserInfoMArgs { ui_id, .. }) = do
110 -- lift $ printDebug "[updateUserInfo] ui_id" ui_id
111 users <- lift (getUsersWithNodeHyperdata ui_id)
113 [] -> panic $ "[updateUserInfo] User with id " <> (T.pack $ show ui_id) <> " doesn't exist."
114 ((UserLight { .. }, node_u):_) -> do
115 testAuthUser <- authUser ui_id token
117 Invalid -> panic "[updateUserInfo] failed to validate user"
119 let u_hyperdata = node_u ^. node_hyperdata
120 -- lift $ printDebug "[updateUserInfo] u" u
121 let u_hyperdata' = uh ui_titleL ui_title $
122 uh ui_sourceL ui_source $
123 uh ui_cwFirstNameL ui_cwFirstName $
124 uh ui_cwLastNameL ui_cwLastName $
125 uh ui_cwCityL ui_cwCity $
126 uh ui_cwCountryL ui_cwCountry $
127 uh' ui_cwLabTeamDeptsL ui_cwLabTeamDepts $
128 uh' ui_cwOrganizationL ui_cwOrganization $
129 uh ui_cwOfficeL ui_cwOffice $
130 uh ui_cwRoleL ui_cwRole $
131 uh ui_cwTouchMailL ui_cwTouchMail $
132 uh ui_cwTouchPhoneL ui_cwTouchPhone $
134 -- NOTE: We have 1 username and 2 emails: userLight_email and ui_cwTouchMail
135 -- The userLight_email is more important: it is used for login and sending mail.
136 -- Therefore we update ui_cwTouchMail and userLight_email.
137 -- ui_cwTouchMail is to be removed in the future.
138 let u' = UserLight { userLight_id
140 , userLight_email = fromMaybe userLight_email $ view ui_cwTouchMailL u_hyperdata
141 , userLight_password }
142 -- lift $ printDebug "[updateUserInfo] with firstName" u_hyperdata'
143 _ <- lift $ updateHyperdata (node_u ^. node_id) u_hyperdata'
144 _ <- lift $ updateUserEmail u'
145 --let _newUser = toUser (u, u_hyperdata')
148 uh _ Nothing u_hyperdata = u_hyperdata
149 uh lens' (Just val) u_hyperdata = u_hyperdata & lens' .~ Just val
150 uh' _ Nothing u_hyperdata = u_hyperdata
151 uh' lens' (Just val) u_hyperdata = u_hyperdata & lens' .~ val
153 -- | Inner function to fetch the user from DB.
155 :: (HasConnectionPool env, HasConfig env, HasMail env)
156 => Int -> GqlM e env [UserInfo]
158 -- lift $ printDebug "[dbUsers]" user_id
159 -- user <- getUsersWithId user_id
160 -- hyperdata <- getUserHyperdata user_id
161 -- lift (map toUser <$> zip user hyperdata)
162 lift (map toUser <$> (getUsersWithHyperdata user_id))
164 toUser :: (UserLight, HyperdataUser) -> UserInfo
165 toUser (UserLight { .. }, u_hyperdata) =
166 UserInfo { ui_id = userLight_id
167 , ui_username = userLight_username
168 , ui_email = userLight_email
169 , ui_title = u_hyperdata ^. ui_titleL
170 , ui_source = u_hyperdata ^. ui_sourceL
171 , ui_cwFirstName = u_hyperdata ^. ui_cwFirstNameL
172 , ui_cwLastName = u_hyperdata ^. ui_cwLastNameL
173 , ui_cwCity = u_hyperdata ^. ui_cwCityL
174 , ui_cwCountry = u_hyperdata ^. ui_cwCountryL
175 , ui_cwLabTeamDepts = u_hyperdata ^. ui_cwLabTeamDeptsL
176 , ui_cwOrganization = u_hyperdata ^. ui_cwOrganizationL
177 , ui_cwOffice = u_hyperdata ^. ui_cwOfficeL
178 , ui_cwRole = u_hyperdata ^. ui_cwRoleL
179 --, ui_cwTouchMail = u_hyperdata ^. ui_cwTouchMailL
180 , ui_cwTouchMail = Just userLight_email
181 , ui_cwTouchPhone = u_hyperdata ^. ui_cwTouchPhoneL }
183 sharedL :: Traversal' HyperdataUser HyperdataContact
184 sharedL = hu_shared . _Just
185 ui_titleL :: Traversal' HyperdataUser (Maybe Text)
186 ui_titleL = sharedL . hc_title
187 ui_sourceL :: Traversal' HyperdataUser (Maybe Text)
188 ui_sourceL = sharedL . hc_source
189 contactWhoL :: Traversal' HyperdataUser ContactWho
190 contactWhoL = sharedL . hc_who . _Just
191 ui_cwFirstNameL :: Traversal' HyperdataUser (Maybe Text)
192 ui_cwFirstNameL = contactWhoL . cw_firstName
193 ui_cwLastNameL :: Traversal' HyperdataUser (Maybe Text)
194 ui_cwLastNameL = contactWhoL . cw_lastName
195 contactWhereL :: Traversal' HyperdataUser ContactWhere
196 contactWhereL = sharedL . hc_where . (ix 0)
197 ui_cwCityL :: Traversal' HyperdataUser (Maybe Text)
198 ui_cwCityL = contactWhereL . cw_city
199 ui_cwCountryL :: Traversal' HyperdataUser (Maybe Text)
200 ui_cwCountryL = contactWhereL . cw_country
201 ui_cwLabTeamDeptsL :: Traversal' HyperdataUser [Text]
202 ui_cwLabTeamDeptsL = hu_shared . _Just . (hc_where . (ix 0) . cw_labTeamDepts)
203 ui_cwOrganizationL :: Traversal' HyperdataUser [Text]
204 ui_cwOrganizationL = hu_shared . _Just . (hc_where . (ix 0) . cw_organization)
205 ui_cwOfficeL :: Traversal' HyperdataUser (Maybe Text)
206 ui_cwOfficeL = contactWhereL . cw_office
207 ui_cwRoleL :: Traversal' HyperdataUser (Maybe Text)
208 ui_cwRoleL = contactWhereL . cw_role
209 ui_cwTouchMailL :: Traversal' HyperdataUser (Maybe Text)
210 ui_cwTouchMailL = hu_shared . _Just . (hc_where . (ix 0) . cw_touch . _Just . ct_mail)
211 --ui_cwTouchMailL = contactWhereL . cw_touch . _Just . ct_mail
212 ui_cwTouchPhoneL :: Traversal' HyperdataUser (Maybe Text)
213 ui_cwTouchPhoneL = hu_shared . _Just . (hc_where . (ix 0) . cw_touch . _Just . ct_phone)
214 --ui_cwTouchPhoneL = contactWhereL . cw_touch . _Just . ct_phone