2 Module : Gargantext.Database.Action.User.New
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
11 {-# OPTIONS_GHC -fno-warn-orphans #-}
13 module Gargantext.Database.Action.User.New
16 import Control.Lens (view)
17 import Control.Monad.Random
18 import Data.Text (Text, splitOn)
19 import Gargantext.Core.Mail
20 import Gargantext.Core.Mail.Types (HasMail, mailSettings)
21 import Gargantext.Core.Types.Individu
22 import Gargantext.Database.Action.Flow (getOrMkRoot)
23 import Gargantext.Database.Prelude
24 import Gargantext.Database.Query.Table.Node.Error (HasNodeError(..), nodeError, NodeError(..))
25 import Gargantext.Database.Query.Table.User
26 import Gargantext.Prelude
27 import Gargantext.Prelude.Crypto.Pass.User (gargPass)
28 import Gargantext.Prelude.Mail.Types (MailConfig)
29 import qualified Data.Text as Text
31 ------------------------------------------------------------------------
32 newUsers :: (CmdM env err m, MonadRandom m, HasNodeError err, HasMail env)
33 => [EmailAddress] -> m Int64
35 us' <- mapM newUserQuick us
36 config <- view $ mailSettings
39 ------------------------------------------------------------------------
41 updateUsersPassword :: (CmdM env err m, MonadRandom m, HasNodeError err, HasMail env)
42 => [EmailAddress] -> m Int64
43 updateUsersPassword us = do
44 us' <- mapM newUserQuick us
45 config <- view $ mailSettings
46 _ <- mapM (\u -> updateUser (SendEmail True) config u) us'
49 ------------------------------------------------------------------------
50 ------------------------------------------------------------------------
51 newUserQuick :: (MonadRandom m)
52 => Text -> m (NewUser GargPassword)
55 let n' = Text.toLower n
56 let u = case guessUserName n of
58 Nothing -> panic "[G.D.A.U.N.newUserQuick]: Email invalid"
59 pure (NewUser u n' (GargPassword pass))
60 ------------------------------------------------------------------------
62 ------------------------------------------------------------------------
64 -- guess username and normalize it (Text.toLower)
65 guessUserName :: Text -> Maybe (Text,Text)
66 guessUserName n = case splitOn "@" n of
67 [u',m'] -> if m' /= "" then Just (Text.toLower u',m')
70 ------------------------------------------------------------------------
71 newUser' :: HasNodeError err
72 => MailConfig -> NewUser GargPassword -> Cmd err Int64
73 newUser' cfg u = newUsers' cfg [u]
75 newUsers' :: HasNodeError err
76 => MailConfig -> [NewUser GargPassword] -> Cmd err Int64
78 us' <- liftBase $ mapM toUserHash us
79 r <- insertUsers $ map toUserWrite us'
80 _ <- mapM getOrMkRoot $ map (\u -> UserName (_nu_username u)) us
81 _ <- mapM (\u -> mail cfg (Invitation u)) us
82 printDebug "newUsers'" us
84 ------------------------------------------------------------------------
85 updateUser :: HasNodeError err
86 => SendEmail -> MailConfig -> NewUser GargPassword -> Cmd err Int64
87 updateUser (SendEmail send) cfg u = do
88 u' <- liftBase $ toUserHash u
89 n <- updateUserDB $ toUserWrite u'
91 True -> mail cfg (PassUpdate u)
95 ------------------------------------------------------------------------
96 rmUser :: HasNodeError err => User -> Cmd err Int64
97 rmUser (UserName un) = deleteUsers [un]
98 rmUser _ = nodeError NotImplYet
101 rmUsers :: HasNodeError err => [User] -> Cmd err Int64
103 rmUsers _ = undefined