Commit d07faa3e authored by Alp Mestanogullari's avatar Alp Mestanogullari

support nested resolving for user hyperdata

parent b19e86ef
...@@ -77,12 +77,12 @@ import Servant ...@@ -77,12 +77,12 @@ import Servant
-- | Represents possible GraphQL queries. -- | Represents possible GraphQL queries.
data Query m data Query m
= Query = Query
{ users :: UserArgs -> m [User] { users :: UserArgs -> m [User m]
} deriving (Generic, GQLType) } deriving (Generic, GQLType)
-- | Possible GraphQL Events, i.e. here we describe how we will -- | Possible GraphQL Events, i.e. here we describe how we will
-- manipulate the data. -- manipulate the data.
type EVENT = Event Channel Contet type EVENT m = Event Channel (Contet m)
-- | Channels are possible actions to call when manipulating the data. -- | Channels are possible actions to call when manipulating the data.
data Channel data Channel
...@@ -91,15 +91,14 @@ data Channel ...@@ -91,15 +91,14 @@ data Channel
deriving (Eq, Show, Generic, Hashable) deriving (Eq, Show, Generic, Hashable)
-- | This type describes what data we will operate on. -- | This type describes what data we will operate on.
data Contet data Contet m
= UserContet [User] = UserContet [User m]
-- | The main GraphQL resolver: how queries, mutations and -- | The main GraphQL resolver: how queries, mutations and
-- subscriptions are handled. -- subscriptions are handled.
rootResolver rootResolver
:: (HasConnectionPool env, HasConfig env) :: (HasConnectionPool env, HasConfig env)
=> RootResolver (GargM env GargError) EVENT Query Undefined Undefined => RootResolver (GargM env GargError) e Query Undefined Undefined
rootResolver = rootResolver =
RootResolver RootResolver
{ queryResolver = Query { users = resolveUsers } { queryResolver = Query { users = resolveUsers }
...@@ -109,7 +108,7 @@ rootResolver = ...@@ -109,7 +108,7 @@ rootResolver =
-- | Main GraphQL "app". -- | Main GraphQL "app".
app app
:: (Typeable env, HasConnectionPool env, HasConfig env) :: (Typeable env, HasConnectionPool env, HasConfig env)
=> App EVENT (GargM env GargError) => App (EVENT (GargM env GargError)) (GargM env GargError)
app = deriveApp rootResolver app = deriveApp rootResolver
---------------------------------------------- ----------------------------------------------
......
...@@ -2,28 +2,27 @@ ...@@ -2,28 +2,27 @@
module Gargantext.API.GraphQL.User where module Gargantext.API.GraphQL.User where
import Data.Either (Either(..)) import Data.Maybe (listToMaybe)
import Data.Morpheus.Types import Data.Morpheus.Types
( GQLType ( GQLType
, ResolverQ , Resolver, QUERY
, liftEither , lift
) )
import Data.Text (Text) import Data.Text (Text)
import Gargantext.API.Prelude (GargM, GargError) import Gargantext.API.Prelude (GargM, GargError)
import Gargantext.Database.Admin.Types.Hyperdata (HyperdataUser(..)) import Gargantext.Database.Admin.Types.Hyperdata (HyperdataUser(..))
import Gargantext.Database.Prelude (Cmd, HasConnectionPool, HasConfig) import Gargantext.Database.Prelude (HasConnectionPool, HasConfig)
import Gargantext.Database.Query.Table.User (getUsersWithId, getUserHyperdata) import Gargantext.Database.Query.Table.User (getUsersWithId, getUserHyperdata)
import Gargantext.Database.Schema.User (UserLight(..)) import Gargantext.Database.Schema.User (UserLight(..))
import Gargantext.Prelude import Gargantext.Prelude
import GHC.Generics (Generic) import GHC.Generics (Generic)
import qualified Prelude as Prelude
data User = User data User m = User
{ u_email :: Text { u_email :: Text
, u_hyperdata :: Maybe HyperdataUser , u_hyperdata :: m (Maybe HyperdataUser)
, u_id :: Int , u_id :: Int
, u_username :: Text } , u_username :: Text }
deriving (Show, Generic, GQLType) deriving (Generic, GQLType)
-- | Arguments to the "user" query. -- | Arguments to the "user" query.
data UserArgs data UserArgs
...@@ -31,38 +30,29 @@ data UserArgs ...@@ -31,38 +30,29 @@ data UserArgs
{ user_id :: Int { user_id :: Int
} deriving (Generic, GQLType) } deriving (Generic, GQLType)
type GqlM e env = Resolver QUERY e (GargM env GargError)
-- | Function to resolve user from a query. -- | Function to resolve user from a query.
resolveUsers resolveUsers
:: (HasConnectionPool env, HasConfig env) :: (HasConnectionPool env, HasConfig env)
=> UserArgs -> ResolverQ e (GargM env GargError) [User] => UserArgs -> GqlM e env [User (GqlM e env)]
resolveUsers UserArgs { user_id } = do resolveUsers UserArgs { user_id } = dbUsers user_id
liftEither $ dbUsers user_id
-- user <- lift $ dbUser user_id
-- case user of
-- --Left err -> failure $ msg err
-- Left err -> error "fail"
-- Right u -> pure u
-- | Inner function to fetch the user from DB. -- | Inner function to fetch the user from DB.
dbUsers :: Int -> Cmd err (Either Prelude.String [User]) dbUsers
dbUsers user_id = do :: (HasConnectionPool env, HasConfig env)
users <- getUsersWithId user_id => Int -> GqlM e env ([User (GqlM e env)])
-- users' <- if includeHyperdata dbUsers user_id = lift (map toUser <$> getUsersWithId user_id)
-- then mapM injectHyperdata (toUser <$> users)
-- else (pure $ toUser <$> users)
users' <- mapM injectHyperdata $ toUser <$> users
pure $ Right users'
toUser :: UserLight -> User toUser
:: (HasConnectionPool env, HasConfig env)
=> UserLight -> User (GqlM e env)
toUser (UserLight { .. }) = User { u_email = userLight_email toUser (UserLight { .. }) = User { u_email = userLight_email
, u_hyperdata = Nothing , u_hyperdata = resolveHyperdata userLight_id
, u_id = userLight_id , u_id = userLight_id
, u_username = userLight_username } , u_username = userLight_username }
injectHyperdata :: User -> Cmd err User resolveHyperdata
injectHyperdata user@(User { .. }) = do :: (HasConnectionPool env, HasConfig env)
hyperdata <- getUserHyperdata u_id => Int -> GqlM e env (Maybe HyperdataUser)
case hyperdata of resolveHyperdata userid = lift (listToMaybe <$> getUserHyperdata userid)
[] -> pure $ user
(h:_) -> pure $ User { u_hyperdata = Just h, .. }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment