diff --git a/cabal.project.freeze b/cabal.project.freeze index 121d46f4216c76fa8bb9e34702b659e7530d04b6..2403bf0b3957fcedc47368ac846454eee8eb31d9 100644 --- a/cabal.project.freeze +++ b/cabal.project.freeze @@ -1704,15 +1704,15 @@ constraints: any.AC-Angle ==1.0, any.monoid-transformer ==0.0.4, any.monoidal-containers ==0.6.4.0, any.more-containers ==0.2.2.2, - any.morpheus-graphql ==0.27.3, - any.morpheus-graphql-app ==0.27.3, - any.morpheus-graphql-client ==0.27.3, - any.morpheus-graphql-code-gen ==0.27.3, - any.morpheus-graphql-code-gen-utils ==0.27.3, - any.morpheus-graphql-core ==0.27.3, - any.morpheus-graphql-server ==0.27.3, - any.morpheus-graphql-subscriptions ==0.27.3, - any.morpheus-graphql-tests ==0.27.3, + any.morpheus-graphql ==0.24.3, + any.morpheus-graphql-app ==0.24.3, + any.morpheus-graphql-client ==0.24.3, + any.morpheus-graphql-code-gen ==0.24.3, + any.morpheus-graphql-code-gen-utils ==0.24.3, + any.morpheus-graphql-core ==0.24.3, + any.morpheus-graphql-server ==0.24.3, + any.morpheus-graphql-subscriptions ==0.24.3, + any.morpheus-graphql-tests ==0.24.3, any.moss ==0.2.0.1, any.mountpoints ==1.0.2, any.mpi-hs ==0.7.2.0, diff --git a/gargantext.cabal b/gargantext.cabal index e3131b6c8d8add466436433689c0bb870c2855a1..8060c48a3b0a200b6e4f4cc9fc31ad72d3ebb105 100644 --- a/gargantext.cabal +++ b/gargantext.cabal @@ -45,6 +45,10 @@ flag test-crypto default: False manual: True +flag disable-db-obfuscation-executable + default: False + manual: True + library exposed-modules: Gargantext @@ -165,6 +169,7 @@ library Gargantext.Utils.Jobs.Settings Gargantext.Utils.Jobs.State Gargantext.Utils.SpacyNLP + Gargantext.Utils.SpacyNLP.Types Gargantext.Utils.Tuple Gargantext.Utils.Zip other-modules: @@ -491,10 +496,11 @@ library , matrix ^>= 0.3.6.1 , monad-control ^>= 1.0.3.1 , monad-logger ^>= 0.3.36 - , morpheus-graphql ^>= 0.17.0 - , morpheus-graphql-app ^>= 0.17.0 - , morpheus-graphql-core ^>= 0.17.0 - , morpheus-graphql-subscriptions ^>= 0.17.0 + , morpheus-graphql >= 0.17.0 && < 0.25 + , morpheus-graphql-app >= 0.17.0 && < 0.25 + , morpheus-graphql-core >= 0.17.0 && < 0.25 + , morpheus-graphql-server >= 0.17.0 && < 0.25 + , morpheus-graphql-subscriptions >= 0.17.0 && < 0.25 , mtl ^>= 2.2.2 , natural-transformation ^>= 0.4 , network-uri ^>= 2.6.4.1 @@ -547,6 +553,7 @@ library , servant-xml-conduit >= 0.1.0.4 , simple-reflect ^>= 0.3.3 , singletons ^>= 2.7 + , singletons-th >= 3.1 , split ^>= 0.2.3.4 , stemmer ^>= 0.5.2 , stm ^>= 2.5.0.1 @@ -714,15 +721,18 @@ executable gargantext-db-obfuscation RecordWildCards StrictData ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N -O2 -Wmissing-signatures - build-depends: - base - , extra - , gargantext - , gargantext-prelude - , optparse-simple - , postgresql-simple ^>= 0.6.4 - , text - default-language: Haskell2010 + if flag(disable-db-obfuscation-executable) + buildable: False + else + build-depends: + base + , extra + , gargantext + , gargantext-prelude + , optparse-simple + , postgresql-simple ^>= 0.6.4 + , text + default-language: Haskell2010 executable gargantext-import main-is: Main.hs diff --git a/src/Gargantext/API/Admin/Auth/Types.hs b/src/Gargantext/API/Admin/Auth/Types.hs index 9350aa0e6effd011b90e313c425d4b9d667283c2..e4a98a6a5655657513fe6337c7de8327241df982 100644 --- a/src/Gargantext/API/Admin/Auth/Types.hs +++ b/src/Gargantext/API/Admin/Auth/Types.hs @@ -52,16 +52,11 @@ data AuthenticatedUser = AuthenticatedUser , _auth_user_id :: UserId } deriving (Generic) -$(deriveJSON (JSON.defaultOptions { JSON.fieldLabelModifier = tail . dropWhile ((/=) '_') . tail }) ''AuthenticatedUser) - makeLenses ''AuthenticatedUser instance ToSchema AuthenticatedUser where declareNamedSchema = genericDeclareNamedSchema (unPrefixSwagger "_authUser_") -instance ToJWT AuthenticatedUser -instance FromJWT AuthenticatedUser - data AuthenticationError = LoginFailed NodeId UserId Jose.Error | InvalidUsernameOrPassword @@ -71,7 +66,6 @@ data AuthenticationError type AuthContext = '[JWTSettings, CookieSettings] -- , BasicAuthCfg -- | Instances -$(deriveJSON (unPrefix "_authReq_") ''AuthRequest) instance ToSchema AuthRequest where declareNamedSchema = genericDeclareNamedSchema (unPrefixSwagger "_authReq_") @@ -81,7 +75,6 @@ instance Arbitrary AuthRequest where , p <- arbitraryPassword ] -$(deriveJSON (unPrefix "_authRes_") ''AuthResponse) instance ToSchema AuthResponse where declareNamedSchema = genericDeclareNamedSchema (unPrefixSwagger "_authRes_") instance Arbitrary AuthResponse where @@ -101,20 +94,43 @@ type Password = Text data ForgotPasswordRequest = ForgotPasswordRequest { _fpReq_email :: Email } deriving (Generic ) -$(deriveJSON (unPrefix "_fpReq_") ''ForgotPasswordRequest) instance ToSchema ForgotPasswordRequest where declareNamedSchema = genericDeclareNamedSchema (unPrefixSwagger "_fpReq_") data ForgotPasswordResponse = ForgotPasswordResponse { _fpRes_status :: Text } deriving (Generic ) -$(deriveJSON (unPrefix "_fpRes_") ''ForgotPasswordResponse) instance ToSchema ForgotPasswordResponse where declareNamedSchema = genericDeclareNamedSchema (unPrefixSwagger "_fpRes_") data ForgotPasswordGet = ForgotPasswordGet {_fpGet_password :: Password} deriving (Generic ) -$(deriveJSON (unPrefix "_fpGet_") ''ForgotPasswordGet) instance ToSchema ForgotPasswordGet where declareNamedSchema = genericDeclareNamedSchema (unPrefixSwagger "_fpGet_") +-- +-- Lenses +-- + +makeLenses ''AuthValid +>>>>>>> b7657056 (Fix compilation errors due to switch to GHC 9.4.7) makeLenses ''AuthResponse + +-- +-- JSON instances +-- + +$(deriveJSON (JSON.defaultOptions { JSON.fieldLabelModifier = tail . dropWhile ((/=) '_') . tail }) ''AuthenticatedUser) +$(deriveJSON (unPrefix "_authReq_") ''AuthRequest) +$(deriveJSON (unPrefix "_authInv_") ''AuthInvalid) +$(deriveJSON (unPrefix "_authVal_") ''AuthValid) +$(deriveJSON (unPrefix "_authRes_") ''AuthResponse) +$(deriveJSON (unPrefix "_fpReq_") ''ForgotPasswordRequest) +$(deriveJSON (unPrefix "_fpRes_") ''ForgotPasswordResponse) +$(deriveJSON (unPrefix "_fpGet_") ''ForgotPasswordGet) + +-- +-- JWT instances +-- + +instance ToJWT AuthenticatedUser +instance FromJWT AuthenticatedUser diff --git a/src/Gargantext/API/Admin/Settings.hs b/src/Gargantext/API/Admin/Settings.hs index ef319f52b669de870a9dba9e8516c54f1ab13dc1..c78976154e8a2b8d1defdc4e867e3a87d8c06c4d 100644 --- a/src/Gargantext/API/Admin/Settings.hs +++ b/src/Gargantext/API/Admin/Settings.hs @@ -24,7 +24,8 @@ import Control.Lens import Control.Monad.Logger (LogLevel(..)) import Control.Monad.Reader import Data.ByteString.Lazy qualified as L -import Data.Pool (Pool, createPool) +import Data.Pool (Pool) +import qualified Data.Pool as Pool import Database.PostgreSQL.Simple (Connection, connect, close, ConnectInfo) import Gargantext.API.Admin.EnvTypes import Gargantext.API.Admin.Types @@ -217,7 +218,7 @@ newEnv logger port file = do } newPool :: ConnectInfo -> IO (Pool Connection) -newPool param = createPool (connect param) close 1 (60*60) 8 +newPool param = Pool.newPool $ Pool.setNumStripes (Just 1) $ Pool.defaultPoolConfig (connect param) close (60*60) 8 {- cleanEnv :: (HasConfig env, HasRepo env) => env -> IO () diff --git a/src/Gargantext/API/Count.hs b/src/Gargantext/API/Count.hs index 7562c350c0cc69f5dab5646880907eb3d958e807..593ccc1f9a4fa305d7461e38ca8157d45400670f 100644 --- a/src/Gargantext/API/Count.hs +++ b/src/Gargantext/API/Count.hs @@ -104,18 +104,12 @@ messages = toMessage $ [ (400, ["Ill formed query "]) instance Arbitrary Message where arbitrary = elements messages -instance FromJSON Message -instance ToJSON Message - instance ToSchema Message ----------------------------------------------------------------------- data Counts = Counts { results :: [Either Message Count] } deriving (Eq, Show, Generic) -instance FromJSON Counts -instance ToJSON Counts - instance Arbitrary Counts where arbitrary = elements [Counts [ Right (Count Pubmed (Just 20 )) , Right (Count IsTex (Just 150)) @@ -131,8 +125,6 @@ data Count = Count { count_name :: Scraper } deriving (Eq, Show, Generic) -$(deriveJSON (unPrefix "count_") ''Count) - instance ToSchema Count where declareNamedSchema = genericDeclareNamedSchema (unPrefixSwagger "count_") --instance Arbitrary Count where @@ -141,3 +133,16 @@ instance ToSchema Count where ----------------------------------------------------------------------- count :: Monad m => Query -> m Counts count _ = undefined + +-- +-- JSON instances +-- + +instance FromJSON Message +instance ToJSON Message + +$(deriveJSON (unPrefix "count_") ''Count) + +instance FromJSON Counts +instance ToJSON Counts + diff --git a/src/Gargantext/API/Errors/Types.hs b/src/Gargantext/API/Errors/Types.hs index 1334985dba97bb58ec0fa600084e46966dc01b14..afb99acc93ea288e752ab32f94f88f9c3ca9cb97 100644 --- a/src/Gargantext/API/Errors/Types.hs +++ b/src/Gargantext/API/Errors/Types.hs @@ -671,8 +671,8 @@ genFrontendErr be = do EC_404__tree_empty_root -> pure $ mkFrontendErr' txt $ FE_tree_empty_root EC_500__tree_too_many_roots - -> do nodes <- arbitrary - pure $ mkFrontendErr' txt $ FE_tree_too_many_roots nodes + -> do nodes <- getNonEmpty <$> arbitrary + pure $ mkFrontendErr' txt $ FE_tree_too_many_roots (NE.fromList nodes) -- job errors EC_500__job_invalid_id_type diff --git a/src/Gargantext/API/GraphQL.hs b/src/Gargantext/API/GraphQL.hs index b423ccb99d16e017c844a63ecdcec839b4ab87c5..72645008383299a79753e182a3bec24e9c1b45de 100644 --- a/src/Gargantext/API/GraphQL.hs +++ b/src/Gargantext/API/GraphQL.hs @@ -22,7 +22,7 @@ import Data.ByteString.Lazy.Char8 ( ByteString ) import Data.Morpheus ( App, deriveApp ) import Data.Morpheus.Server ( httpPlayground ) import Data.Morpheus.Subscriptions ( Event (..), httpPubApp ) -import Data.Morpheus.Types ( GQLRequest, GQLResponse, GQLType, RootResolver(..), Undefined(..) ) +import Data.Morpheus.Types ( GQLRequest, GQLResponse, GQLType, RootResolver(..), Undefined, defaultRootResolver) import Data.Proxy import Gargantext.API.Admin.Auth.Types (AuthenticatedUser) import Gargantext.API.Admin.Orchestrator.Types (JobLog) @@ -111,7 +111,7 @@ rootResolver -> AccessPolicyManager -> RootResolver (GargM env BackendInternalError) e Query Mutation Undefined rootResolver authenticatedUser policyManager = - RootResolver + defaultRootResolver { queryResolver = Query { annuaire_contacts = GQLA.resolveAnnuaireContacts , context_ngrams = GQLCTX.resolveContextNgrams , contexts = GQLCTX.resolveNodeContext @@ -133,7 +133,7 @@ rootResolver authenticatedUser policyManager = , update_user_epo_api_token = GQLUser.updateUserEPOAPIToken , delete_team_membership = GQLTeam.deleteTeamMembership , update_node_context_category = GQLCTX.updateNodeContextCategory } - , subscriptionResolver = Undefined } + } -- | Main GraphQL "app". app diff --git a/src/Gargantext/API/GraphQL/Node.hs b/src/Gargantext/API/GraphQL/Node.hs index af1892dbd18f118ce03a3ccf487024b859cae1da..6ac3a4c4a5d815b2cfefe293014986d980290872 100644 --- a/src/Gargantext/API/GraphQL/Node.hs +++ b/src/Gargantext/API/GraphQL/Node.hs @@ -15,7 +15,7 @@ Portability : POSIX module Gargantext.API.GraphQL.Node where import Data.Aeson -import Data.HashMap.Strict qualified as HashMap +import Data.Aeson.KeyMap qualified as KM import Data.Morpheus.Types ( GQLType ) import Data.Text qualified as T import Gargantext.API.Admin.Auth.Types @@ -126,7 +126,7 @@ toCorpus N.Node { .. } = Corpus { id = NN.unNodeId _node_id pubmedAPIKeyFromValue :: Value -> Maybe PUBMED.APIKey pubmedAPIKeyFromValue (Object kv) = - case HashMap.lookup "pubmed_api_key" kv of + case KM.lookup "pubmed_api_key" kv of Nothing -> Nothing Just v -> case fromJSON v of Error _ -> Nothing diff --git a/src/Gargantext/API/GraphQL/Utils.hs b/src/Gargantext/API/GraphQL/Utils.hs index dee31a397a6fd0d87945e92d4c4ee440a89db12e..f7d4b7fea2f65ac5b1a03cbf6c28bba8ee530378 100644 --- a/src/Gargantext/API/GraphQL/Utils.hs +++ b/src/Gargantext/API/GraphQL/Utils.hs @@ -8,6 +8,8 @@ Stability : experimental Portability : POSIX -} +{-# OPTIONS_GHC -Wno-deprecations #-} -- FIXME(adn) GraphQL will need updating. + module Gargantext.API.GraphQL.Utils where import Control.Lens.Getter (view) diff --git a/src/Gargantext/API/Ngrams.hs b/src/Gargantext/API/Ngrams.hs index a61429c6946bb3cc32bd26ad6f6163a807baf555..7d8a3a1dabbfc9cf8b3c5290f318a2a8f82ab5a5 100644 --- a/src/Gargantext/API/Ngrams.hs +++ b/src/Gargantext/API/Ngrams.hs @@ -120,7 +120,7 @@ import Gargantext.Database.Query.Table.Node (getNode) import Gargantext.Database.Query.Table.Node.Error (HasNodeError) import Gargantext.Database.Query.Table.Node.Select import Gargantext.Database.Schema.Node (node_id, node_parent_id, node_user_id) -import Gargantext.Prelude hiding (log, to, toLower, (%)) +import Gargantext.Prelude hiding (log, to, toLower, (%), isInfixOf) import Gargantext.Prelude.Clock (hasTime, getTime) import Gargantext.Utils.Jobs (serveJobsAPI, MonadJobStatus(..)) import GHC.Conc (readTVar, writeTVar) diff --git a/src/Gargantext/API/Ngrams/Tools.hs b/src/Gargantext/API/Ngrams/Tools.hs index 44f8a186750ba2f6b84a54585f5741c5d61c8f7d..495a6a793e584c81fd03f7b9d0cac5b45e8c2d0d 100644 --- a/src/Gargantext/API/Ngrams/Tools.hs +++ b/src/Gargantext/API/Ngrams/Tools.hs @@ -9,7 +9,8 @@ Portability : POSIX -} -{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE TypeOperators #-} module Gargantext.API.Ngrams.Tools where diff --git a/src/Gargantext/API/Ngrams/Types.hs b/src/Gargantext/API/Ngrams/Types.hs index fe7982aa36531ab55d46d2581f10fa348bd4271e..87cc9b77bead909dc4f4bc43ce1397fc025e6303 100644 --- a/src/Gargantext/API/Ngrams/Types.hs +++ b/src/Gargantext/API/Ngrams/Types.hs @@ -84,8 +84,6 @@ instance ToParamSchema TabType instance ToJSON TabType instance FromJSON TabType instance ToSchema TabType -instance Arbitrary TabType where - arbitrary = elements [minBound .. maxBound] instance FromJSONKey TabType where fromJSONKey = genericFromJSONKey defaultJSONKeyOptions instance ToJSONKey TabType where @@ -161,14 +159,11 @@ deriveJSON (unPrefix "_nre_") ''NgramsRepoElement makeLenses ''NgramsRepoElement instance ToSchema NgramsRepoElement where declareNamedSchema = genericDeclareNamedSchema (unPrefixSwagger "_nre_") -instance Serialise NgramsRepoElement instance FromField NgramsRepoElement where fromField = fromJSONField instance ToField NgramsRepoElement where toField = toJSONField -instance Serialise (MSet NgramsTerm) - data NgramsElement = NgramsElement { _ne_ngrams :: NgramsTerm , _ne_size :: Int @@ -197,9 +192,6 @@ newNgramsElement mayList ngrams = instance ToSchema NgramsElement where declareNamedSchema = genericDeclareNamedSchema (unPrefixSwagger "_ne_") -instance Arbitrary NgramsElement where - arbitrary = elements [newNgramsElement Nothing "sport"] - ------------------------------------------------------------------------ newtype NgramsTable = NgramsTable [NgramsElement] @@ -257,9 +249,6 @@ mockTable = NgramsTable where rp n = Just $ RootParent n n -instance Arbitrary NgramsTable where - arbitrary = pure mockTable - instance ToSchema NgramsTable ------------------------------------------------------------------------ @@ -283,10 +272,6 @@ instance ToParamSchema OrderBy instance FromJSON OrderBy instance ToJSON OrderBy instance ToSchema OrderBy -instance Arbitrary OrderBy - where - arbitrary = elements [minBound..maxBound] - -- | A query on a 'NgramsTable'. data NgramsSearchQuery = NgramsSearchQuery @@ -367,8 +352,6 @@ instance ToSchema a => ToSchema (PatchSet a) type AddRem = Replace (Maybe ()) -instance Serialise AddRem - remPatch, addPatch :: AddRem remPatch = replace (Just ()) Nothing addPatch = replace Nothing (Just ()) @@ -388,9 +371,6 @@ unPatchMSet (PatchMSet a) = a type ConflictResolutionPatchMSet a = a -> ConflictResolutionReplace (Maybe ()) type instance ConflictResolution (PatchMSet a) = ConflictResolutionPatchMSet a -instance (Serialise a, Ord a) => Serialise (PatchMap a AddRem) -instance (Serialise a, Ord a) => Serialise (PatchMSet a) - -- TODO this breaks module abstraction makePrisms ''PM.PatchMap @@ -419,19 +399,12 @@ instance (Ord a, ToJSON a) => ToJSON (PatchMSet a) where instance (Ord a, FromJSON a) => FromJSON (PatchMSet a) where parseJSON = fmap (_PatchMSetIso #) . parseJSON -instance (Ord a, Arbitrary a) => Arbitrary (PatchMSet a) where - arbitrary = (PatchMSet . PM.fromMap) <$> arbitrary - instance ToSchema a => ToSchema (PatchMSet a) where -- TODO declareNamedSchema _ = wellNamedSchema "" (Proxy :: Proxy TODO) type instance Patched (PatchMSet a) = MSet a -instance (Eq a, Arbitrary a) => Arbitrary (Replace a) where - arbitrary = uncurry replace <$> arbitrary - -- If they happen to be equal then the patch is Keep. - instance ToSchema a => ToSchema (Replace a) where declareNamedSchema (_ :: Proxy (Replace a)) = do -- TODO Keep constructor is not supported here. @@ -475,19 +448,11 @@ instance ToSchema NgramsPatch where , ("old", nreSch) , ("new", nreSch) ] -instance Arbitrary NgramsPatch where - arbitrary = frequency [ (9, NgramsPatch <$> arbitrary <*> (replace <$> arbitrary <*> arbitrary)) - , (1, NgramsReplace <$> arbitrary <*> arbitrary) - ] -instance Serialise NgramsPatch instance FromField NgramsPatch where fromField = fromJSONField instance ToField NgramsPatch where toField = toJSONField -instance Serialise (Replace ListType) - -instance Serialise ListType type NgramsPatchIso = MaybePatch NgramsRepoElement (PairPatch (PatchMSet NgramsTerm) (Replace ListType)) @@ -555,9 +520,6 @@ newtype NgramsTablePatch = NgramsTablePatch (PatchMap NgramsTerm NgramsPatch) mkNgramsTablePatch :: Map NgramsTerm NgramsPatch -> NgramsTablePatch mkNgramsTablePatch = NgramsTablePatch . PM.fromMap -instance Serialise NgramsTablePatch -instance Serialise (PatchMap NgramsTerm NgramsPatch) - instance FromField NgramsTablePatch where fromField = fromJSONField @@ -690,9 +652,6 @@ instance Action NgramsTablePatch (Maybe NgramsTableMap) where fmap (execState (reParentNgramsTablePatch p)) . act (p ^. _NgramsTablePatch) -instance Arbitrary NgramsTablePatch where - arbitrary = NgramsTablePatch <$> PM.fromMap <$> arbitrary - -- Should it be less than an Lens' to preserve PatchMap's abstraction. -- ntp_ngrams_patches :: Lens' NgramsTablePatch (Map NgramsTerm NgramsPatch) -- ntp_ngrams_patches = _NgramsTablePatch . undefined @@ -709,8 +668,6 @@ deriveJSON (unPrefix "_v_") ''Versioned makeLenses ''Versioned instance (Typeable a, ToSchema a) => ToSchema (Versioned a) where declareNamedSchema = wellNamedSchema "_v_" -instance Arbitrary a => Arbitrary (Versioned a) where - arbitrary = Versioned 1 <$> arbitrary -- TODO 1 is constant so far ------------------------------------------------------------------------ type Count = Int @@ -724,8 +681,6 @@ deriveJSON (unPrefix "_vc_") ''VersionedWithCount makeLenses ''VersionedWithCount instance (Typeable a, ToSchema a) => ToSchema (VersionedWithCount a) where declareNamedSchema = wellNamedSchema "_vc_" -instance Arbitrary a => Arbitrary (VersionedWithCount a) where - arbitrary = VersionedWithCount 1 1 <$> arbitrary -- TODO 1 is constant so far toVersionedWithCount :: Count -> Versioned a -> VersionedWithCount a toVersionedWithCount count (Versioned version data_) = VersionedWithCount version count data_ @@ -749,8 +704,6 @@ instance (ToJSON s, ToJSON p) => ToJSON (Repo s p) where toJSON = genericToJSON $ unPrefix "_r_" toEncoding = genericToEncoding $ unPrefix "_r_" -instance (Serialise s, Serialise p) => Serialise (Repo s p) - makeLenses ''Repo initRepo :: Monoid s => Repo s p @@ -771,11 +724,6 @@ type RepoCmdM env err m = -- Instances -instance Arbitrary NgramsRepoElement where - arbitrary = elements $ map ngramsElementToRepo ns - where - NgramsTable ns = mockTable - instance FromHttpApiData (Map TableNgrams.NgramsType (Versioned NgramsTableMap)) where parseUrlPiece x = maybeToEither x (decode $ cs x) @@ -814,3 +762,51 @@ instance ToSchema UpdateTableNgramsCharts where ------------------------------------------------------------------------ type NgramsList = (Map TableNgrams.NgramsType (Versioned NgramsTableMap)) + +-- +-- Serialise instances +-- + +instance Serialise ListType +instance Serialise NgramsRepoElement +instance Serialise NgramsTablePatch +instance Serialise (PatchMap NgramsTerm NgramsPatch) +instance Serialise (MSet NgramsTerm) +instance Serialise AddRem +instance Serialise NgramsPatch +instance Serialise (Replace ListType) +instance (Serialise a, Ord a) => Serialise (PatchMap a AddRem) +instance (Serialise a, Ord a) => Serialise (PatchMSet a) +instance (Serialise s, Serialise p) => Serialise (Repo s p) + +-- +-- Arbitrary instances +-- +instance Arbitrary TabType where + arbitrary = elements [minBound .. maxBound] +instance Arbitrary NgramsElement where + arbitrary = elements [newNgramsElement Nothing "sport"] +instance Arbitrary NgramsTable where + arbitrary = pure mockTable +instance Arbitrary OrderBy + where + arbitrary = elements [minBound..maxBound] +instance (Ord a, Arbitrary a) => Arbitrary (PatchMSet a) where + arbitrary = (PatchMSet . PM.fromMap) <$> arbitrary +instance (Eq a, Arbitrary a) => Arbitrary (Replace a) where + arbitrary = uncurry replace <$> arbitrary + -- If they happen to be equal then the patch is Keep. +instance Arbitrary NgramsPatch where + arbitrary = frequency [ (9, NgramsPatch <$> arbitrary <*> (replace <$> arbitrary <*> arbitrary)) + , (1, NgramsReplace <$> arbitrary <*> arbitrary) + ] +instance Arbitrary NgramsTablePatch where + arbitrary = NgramsTablePatch <$> PM.fromMap <$> arbitrary +instance Arbitrary a => Arbitrary (Versioned a) where + arbitrary = Versioned 1 <$> arbitrary -- TODO 1 is constant so far +instance Arbitrary a => Arbitrary (VersionedWithCount a) where + arbitrary = VersionedWithCount 1 1 <$> arbitrary -- TODO 1 is constant so far +instance Arbitrary NgramsRepoElement where + arbitrary = elements $ map ngramsElementToRepo ns + where + NgramsTable ns = mockTable diff --git a/src/Gargantext/API/Node.hs b/src/Gargantext/API/Node.hs index 4a8f7a39517609e124eda25b1e1f155be9b208e4..91ddee157344e9ec7a48f0623f400afa2f875ede 100644 --- a/src/Gargantext/API/Node.hs +++ b/src/Gargantext/API/Node.hs @@ -189,62 +189,6 @@ nodeNodeAPI p uId cId nId = withAccess (Proxy :: Proxy (NodeNodeAPI a)) Proxy uI nodeNodeAPI' :: GargServer (NodeNodeAPI a) nodeNodeAPI' = getNodeWith nId p ------------------------------------------------------------------------- --- TODO: make the NodeId type indexed by `a`, then we no longer need the proxy. -nodeAPI :: forall proxy a. - ( HyperdataC a, Show a - ) => proxy a - -> AuthenticatedUser - -> NodeId - -> ServerT (NodeAPI a) (GargM Env BackendInternalError) -nodeAPI p authenticatedUser targetNode = - withAccess (Proxy :: Proxy (NodeAPI a)) Proxy authenticatedUser (PathNode targetNode) nodeAPI' - where - - userRootId = RootId $ authenticatedUser ^. auth_node_id - - nodeAPI' :: ServerT (NodeAPI a) (GargM Env BackendInternalError) - nodeAPI' = withPolicy authenticatedUser (nodeChecks targetNode) (getNodeWith targetNode p) - :<|> rename targetNode - :<|> postNode authenticatedUser targetNode - :<|> postNodeAsyncAPI authenticatedUser targetNode - :<|> FrameCalcUpload.api authenticatedUser targetNode - :<|> putNode targetNode - :<|> Update.api targetNode - :<|> Action.deleteNode userRootId targetNode - :<|> getChildren targetNode p - - -- TODO gather it - :<|> tableApi targetNode - :<|> apiNgramsTableCorpus targetNode - - :<|> catApi targetNode - :<|> scoreApi targetNode - :<|> Search.api targetNode - :<|> Share.api userRootId targetNode - -- Pairing Tools - :<|> pairWith targetNode - :<|> pairs targetNode - :<|> getPair targetNode - - -- VIZ - :<|> scatterApi targetNode - :<|> chartApi targetNode - :<|> pieApi targetNode - :<|> treeApi targetNode - :<|> phyloAPI targetNode - :<|> moveNode userRootId targetNode - -- :<|> nodeAddAPI id' - -- :<|> postUpload id' - :<|> Share.unPublish targetNode - - :<|> fileApi targetNode - :<|> fileAsyncApi authenticatedUser targetNode - - :<|> DFWN.api authenticatedUser targetNode - :<|> DocumentUpload.api targetNode - - ------------------------------------------------------------------------ data RenameNode = RenameNode { r_name :: Text } deriving (Generic) @@ -374,5 +318,59 @@ instance ToSchema RenameNode instance Arbitrary RenameNode where arbitrary = elements [RenameNode "test"] +------------------------------------------------------------------------ +-- TODO: make the NodeId type indexed by `a`, then we no longer need the proxy. +nodeAPI :: forall proxy a. + ( HyperdataC a, Show a, MimeUnrender JSON a + ) => proxy a + -> AuthenticatedUser + -> NodeId + -> ServerT (NodeAPI a) (GargM Env BackendInternalError) +nodeAPI p authenticatedUser targetNode = + withAccess (Proxy :: Proxy (NodeAPI a)) Proxy authenticatedUser (PathNode targetNode) nodeAPI' + where + + userRootId = RootId $ authenticatedUser ^. auth_node_id + + nodeAPI' :: ServerT (NodeAPI a) (GargM Env BackendInternalError) + nodeAPI' = withPolicy authenticatedUser (nodeChecks targetNode) (getNodeWith targetNode p) + :<|> rename targetNode + :<|> postNode authenticatedUser targetNode + :<|> postNodeAsyncAPI authenticatedUser targetNode + :<|> FrameCalcUpload.api authenticatedUser targetNode + :<|> putNode targetNode + :<|> Update.api targetNode + :<|> Action.deleteNode userRootId targetNode + :<|> getChildren targetNode p + + -- TODO gather it + :<|> tableApi targetNode + :<|> apiNgramsTableCorpus targetNode + + :<|> catApi targetNode + :<|> scoreApi targetNode + :<|> Search.api targetNode + :<|> Share.api userRootId targetNode + -- Pairing Tools + :<|> pairWith targetNode + :<|> pairs targetNode + :<|> getPair targetNode + + -- VIZ + :<|> scatterApi targetNode + :<|> chartApi targetNode + :<|> pieApi targetNode + :<|> treeApi targetNode + :<|> phyloAPI targetNode + :<|> moveNode userRootId targetNode + -- :<|> nodeAddAPI id' + -- :<|> postUpload id' + :<|> Share.unPublish targetNode + + :<|> fileApi targetNode + :<|> fileAsyncApi authenticatedUser targetNode + + :<|> DFWN.api authenticatedUser targetNode + :<|> DocumentUpload.api targetNode + -------------------------------------------------------------- diff --git a/src/Gargantext/API/Node/Document/Export/Types.hs b/src/Gargantext/API/Node/Document/Export/Types.hs index e475845efb06fe71a8974c3376bef0a9323dccaa..cf0dda3c0271ce309641d7c992a3cf849f1544fb 100644 --- a/src/Gargantext/API/Node/Document/Export/Types.hs +++ b/src/Gargantext/API/Node/Document/Export/Types.hs @@ -94,6 +94,6 @@ type API = Summary "Document Export" :<|> "csv" :> Get '[PlainText] (Headers '[Servant.Header "Content-Disposition" Text] Text)) -- [Document]) -$(deriveJSON (unPrefix "_de_") ''DocumentExport) -$(deriveJSON (unPrefix "_d_") ''Document) $(deriveJSON (unPrefix "_ng_") ''Ngrams) +$(deriveJSON (unPrefix "_d_") ''Document) +$(deriveJSON (unPrefix "_de_") ''DocumentExport) diff --git a/src/Gargantext/Core/NodeStory.hs b/src/Gargantext/Core/NodeStory.hs index 2cff67bdecdc227920861b8df8653a8a6fc96910..4b5628a0f387df15b2bfd1fa4d1319e995a28e8f 100644 --- a/src/Gargantext/Core/NodeStory.hs +++ b/src/Gargantext/Core/NodeStory.hs @@ -701,7 +701,7 @@ clearHistory (NodeStory ns) = NodeStory $ ns & (traverse . a_history) .~ emptyHi currentVersion :: (HasNodeStory env err m) => ListId -> m Version currentVersion listId = do pool <- view connPool - nls <- withResource pool $ \c -> liftBase $ getNodeStory c listId + nls <- liftBase $ withResource pool $ \c -> liftBase $ getNodeStory c listId pure $ nls ^. unNodeStory . at listId . _Just . a_version @@ -711,7 +711,7 @@ currentVersion listId = do fixNodeStoryVersions :: (HasNodeStory env err m) => m () fixNodeStoryVersions = do pool <- view connPool - _ <- withResource pool $ \c -> liftBase $ PGS.withTransaction c $ do + _ <- liftBase $ withResource pool $ \c -> liftBase $ PGS.withTransaction c $ do nIds <- runPGSQuery c [sql| SELECT id FROM nodes WHERE ? |] (PGS.Only True) :: IO [PGS.Only Int64] -- printDebug "[fixNodeStoryVersions] nIds" nIds mapM_ (\(PGS.Only nId) -> do diff --git a/src/Gargantext/Core/Text/Corpus/Parsers/Date.hs b/src/Gargantext/Core/Text/Corpus/Parsers/Date.hs index c804a5e046e2c37a8357cb6a68d3567ebb25be9d..f99aa69123f657aa3104fd6864383492cf8510ad 100644 --- a/src/Gargantext/Core/Text/Corpus/Parsers/Date.hs +++ b/src/Gargantext/Core/Text/Corpus/Parsers/Date.hs @@ -24,7 +24,7 @@ module Gargantext.Core.Text.Corpus.Parsers.Date import Data.Aeson (toJSON, Value) import Data.Aeson qualified as Json -import Data.HashMap.Strict as HM hiding (map) +import Data.Aeson.KeyMap as KM hiding (map) import Data.HashSet qualified as HashSet import Data.List qualified as List import Data.Text (unpack, splitOn, replace) @@ -184,7 +184,7 @@ getTimeValue rt = case head rt of extractValue :: Maybe Value -> Maybe Text extractValue (Just (Json.Object object)) = - case HM.lookup "value" object of + case KM.lookup "value" object of Just (Json.String date) -> Just date _ -> Nothing extractValue _ = Nothing diff --git a/src/Gargantext/Core/Text/Terms/Eleve.hs b/src/Gargantext/Core/Text/Terms/Eleve.hs index 0ed11598f3a4e5744c28e36140129fc71c2e170c..c7dc3f39f0f1f1bc17db14b832567f98129fc477 100644 --- a/src/Gargantext/Core/Text/Terms/Eleve.hs +++ b/src/Gargantext/Core/Text/Terms/Eleve.hs @@ -34,10 +34,11 @@ Notes for current implementation: {-# OPTIONS_GHC -fno-warn-deprecations #-} -{-# LANGUAGE ConstraintKinds #-} -{-# LANGUAGE StandaloneDeriving #-} -{-# LANGUAGE TemplateHaskell #-} -{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE ConstraintKinds #-} +{-# LANGUAGE StandaloneDeriving #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE TypeOperators #-} module Gargantext.Core.Text.Terms.Eleve where diff --git a/src/Gargantext/Core/Text/Terms/Mono/Token/En.hs b/src/Gargantext/Core/Text/Terms/Mono/Token/En.hs index 4b9deb28480f6d69b076f611b0c5a631f3ec86fc..78faecad4876caa84494538966eee7933b0a7be6 100644 --- a/src/Gargantext/Core/Text/Terms/Mono/Token/En.hs +++ b/src/Gargantext/Core/Text/Terms/Mono/Token/En.hs @@ -143,11 +143,11 @@ whitespace :: Tokenizer whitespace xs = E [Right w | w <- T.words xs ] instance Monad (EitherList a) where - return x = E [Right x] + return = pure E xs >>= f = E $ concatMap (either (return . Left) (unE . f)) xs instance Applicative (EitherList a) where - pure = pure + pure x = E [Right x] f <*> x = f `ap` x instance Functor (EitherList a) where diff --git a/src/Gargantext/Core/Types/Phylo.hs b/src/Gargantext/Core/Types/Phylo.hs index a349fd26b8498515196434ffd2034c5cb87fb8f4..daaaeeda86ca10f40889249e2095925ba32050ad 100644 --- a/src/Gargantext/Core/Types/Phylo.hs +++ b/src/Gargantext/Core/Types/Phylo.hs @@ -216,43 +216,6 @@ data ObjectData = | Layer !GvId !GraphDataData !LayerData deriving (Show, Eq, Generic) -instance ToJSON ObjectData where - toJSON = \case - GroupToNode gvid commonData nodeTypeData - -> mkObject gvid (Left commonData) nodeTypeData - BranchToNode gvid commonData nodeTypeData - -> mkObject gvid (Left commonData) nodeTypeData - PeriodToNode gvid commonData nodeTypeData - -> mkObject gvid (Left commonData) nodeTypeData - Layer gvid graphData nodeTypeData - -> mkObject gvid (Right graphData) nodeTypeData - -instance FromJSON ObjectData where - parseJSON = withObject "ObjectData" $ \o -> do - _gvid <- o .: "_gvid" - -- try to parse the graph data first. If we succeed, then we are dealing with - -- the 'Layer', otherwise we the rest, but for the rest we can avoid re-parsing - -- the 'NodeCommonData' every time. - case parseMaybe @_ @GraphDataData parseJSON (Object o) of - Nothing - -> do commonData <- parseJSON (Object o) - ((GroupToNode <$> pure _gvid <*> pure commonData <*> parseJSON (Object o)) <|> - (BranchToNode <$> pure _gvid <*> pure commonData <*> parseJSON (Object o)) <|> - (PeriodToNode <$> pure _gvid <*> pure commonData <*> parseJSON (Object o))) - Just gd - -> Layer <$> pure _gvid <*> pure gd <*> parseJSON (Object o) - - -mkObject :: ToJSON a => GvId -> Either NodeCommonData GraphDataData -> a -> Value -mkObject gvid commonData objectTypeData = - let commonDataJSON = either toJSON toJSON commonData - objectTypeDataJSON = toJSON objectTypeData - header = object $ [ "_gvid" .= toJSON gvid ] - in case (commonDataJSON, objectTypeDataJSON, header) of - (Object hdr, Object cdJSON, Object etDataJSON) - -> Object $ hdr <> cdJSON <> etDataJSON - _ -> panicTrace "[Gargantext.Core.Types.Phylo.mkObject] impossible: commonData, header or objectTypeDataJSON didn't convert back to JSON Object." - data GroupToNodeData = GroupToNodeData { _gtn_bId :: Text @@ -474,17 +437,23 @@ data BranchToGroupData , _btg_style :: Maybe Text } deriving (Show, Eq, Generic) --- | Lenses -makeLenses ''Phylo -makeLenses ''PhyloPeriod -makeLenses ''PhyloLevel -makeLenses ''PhyloGroup - -- | JSON instances -$(deriveJSON (unPrefix "_phylo_" ) ''Phylo ) -$(deriveJSON (unPrefix "_phylo_Period" ) ''PhyloPeriod ) -$(deriveJSON (unPrefix "_phylo_Level" ) ''PhyloLevel ) -$(deriveJSON (unPrefix "_phylo_Group" ) ''PhyloGroup ) +instance ToJSON GvId where + toJSON GvId{..} = toJSON _GvId +instance FromJSON GvId where + parseJSON v = GvId <$> parseJSON v + +-- /NOTE/ We need to define /after/ the JSON istance for 'GvId' due to GHC stage limitation. +mkObject :: ToJSON a => GvId -> Either NodeCommonData GraphDataData -> a -> Value +mkObject gvid commonData objectTypeData = + let commonDataJSON = either toJSON toJSON commonData + objectTypeDataJSON = toJSON objectTypeData + header = object $ [ "_gvid" .= toJSON gvid ] + in case (commonDataJSON, objectTypeDataJSON, header) of + (Object hdr, Object cdJSON, Object etDataJSON) + -> Object $ hdr <> cdJSON <> etDataJSON + _ -> panicTrace "[Gargantext.Core.Types.Phylo.mkObject] impossible: commonData, header or objectTypeDataJSON didn't convert back to JSON Object." + instance ToJSON GraphData where toJSON = mkGraphData @@ -512,11 +481,6 @@ instance FromJSON GraphData where _gd_data <- parseJSON (Object o) pure GraphData{..} -instance ToJSON GvId where - toJSON GvId{..} = toJSON _GvId -instance FromJSON GvId where - parseJSON v = GvId <$> parseJSON v - instance ToJSON EdgeData where toJSON = \case GroupToAncestor gvid commonData edgeTypeData @@ -608,6 +572,38 @@ instance FromJSON BranchToGroupData where _btg_style <- o .:? "style" pure BranchToGroupData{..} +instance ToJSON ObjectData where + toJSON = \case + GroupToNode gvid commonData nodeTypeData + -> mkObject gvid (Left commonData) nodeTypeData + BranchToNode gvid commonData nodeTypeData + -> mkObject gvid (Left commonData) nodeTypeData + PeriodToNode gvid commonData nodeTypeData + -> mkObject gvid (Left commonData) nodeTypeData + Layer gvid graphData nodeTypeData + -> mkObject gvid (Right graphData) nodeTypeData + +instance FromJSON ObjectData where + parseJSON = withObject "ObjectData" $ \o -> do + _gvid <- o .: "_gvid" + -- try to parse the graph data first. If we succeed, then we are dealing with + -- the 'Layer', otherwise we the rest, but for the rest we can avoid re-parsing + -- the 'NodeCommonData' every time. + case parseMaybe @_ @GraphDataData parseJSON (Object o) of + Nothing + -> do commonData <- parseJSON (Object o) + ((GroupToNode <$> pure _gvid <*> pure commonData <*> parseJSON (Object o)) <|> + (BranchToNode <$> pure _gvid <*> pure commonData <*> parseJSON (Object o)) <|> + (PeriodToNode <$> pure _gvid <*> pure commonData <*> parseJSON (Object o))) + Just gd + -> Layer <$> pure _gvid <*> pure gd <*> parseJSON (Object o) + + + +$(deriveJSON (unPrefix "_phylo_Group" ) ''PhyloGroup ) +$(deriveJSON (unPrefix "_phylo_Level" ) ''PhyloLevel ) +$(deriveJSON (unPrefix "_phylo_Period" ) ''PhyloPeriod ) +$(deriveJSON (unPrefix "_phylo_" ) ''Phylo ) -- | ToSchema instances instance ToSchema Phylo where @@ -637,7 +633,9 @@ instance ToSchema GraphDataData where instance ToSchema GraphData where declareNamedSchema = genericDeclareNamedSchema (unPrefixSwagger "_gd_") --- | Arbitrary instances +-- +-- Arbitrary instances +-- instance Arbitrary LayerData where arbitrary = LayerData <$> arbitrary instance Arbitrary NodeCommonData where @@ -723,3 +721,13 @@ instance Arbitrary GraphDataData where <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary + +-- +-- Lenses +-- + +makeLenses ''Phylo +makeLenses ''PhyloPeriod +makeLenses ''PhyloLevel +makeLenses ''PhyloGroup + diff --git a/src/Gargantext/Core/Viz/LegacyPhylo.hs b/src/Gargantext/Core/Viz/LegacyPhylo.hs index f6eab991d99685b426c27f9f0c73e9f1d2b33e74..a4ff22e20638e94cc43dce0498bb03e510297d42 100644 --- a/src/Gargantext/Core/Viz/LegacyPhylo.hs +++ b/src/Gargantext/Core/Viz/LegacyPhylo.hs @@ -475,38 +475,38 @@ makeLenses ''PhyloEdge ------------------------ -$(deriveJSON (unPrefix "_phylo_" ) ''Phylo ) +$(deriveJSON (unPrefix "_phylo_group" ) ''PhyloGroup ) +$(deriveJSON (unPrefix "_phylo_level" ) ''PhyloLevel ) $(deriveJSON (unPrefix "_phylo_foundations" ) ''PhyloFoundations ) $(deriveJSON (unPrefix "_phylo_period" ) ''PhyloPeriod ) -$(deriveJSON (unPrefix "_phylo_level" ) ''PhyloLevel ) -$(deriveJSON (unPrefix "_phylo_group" ) ''PhyloGroup ) $(deriveJSON (unPrefix "_phyloFis_" ) ''PhyloFis ) -- -$(deriveJSON (unPrefix "_software_" ) ''Software ) -$(deriveJSON (unPrefix "_phyloParam_" ) ''PhyloParam ) +$(deriveJSON (unPrefix "_lb_" ) ''LBParams ) +$(deriveJSON (unPrefix "_sb_" ) ''SBParams ) +-- +$(deriveJSON (unPrefix "_fis_" ) ''FisParams ) +$(deriveJSON (unPrefix "_hamming_" ) ''HammingParams ) +$(deriveJSON (unPrefix "_wlj_" ) ''WLJParams ) -- $(deriveJSON defaultOptions ''Filter ) $(deriveJSON defaultOptions ''Metric ) -$(deriveJSON defaultOptions ''Cluster ) $(deriveJSON defaultOptions ''Proximity ) --- -$(deriveJSON (unPrefix "_fis_" ) ''FisParams ) -$(deriveJSON (unPrefix "_hamming_" ) ''HammingParams ) $(deriveJSON (unPrefix "_louvain_" ) ''LouvainParams ) $(deriveJSON (unPrefix "_rc_" ) ''RCParams ) -$(deriveJSON (unPrefix "_wlj_" ) ''WLJParams ) +$(deriveJSON defaultOptions ''Cluster ) +$(deriveJSON (unPrefix "_q_" ) ''PhyloQueryBuild ) -- -$(deriveJSON (unPrefix "_lb_" ) ''LBParams ) -$(deriveJSON (unPrefix "_sb_" ) ''SBParams ) +$(deriveJSON (unPrefix "_software_" ) ''Software ) +$(deriveJSON (unPrefix "_phyloParam_" ) ''PhyloParam ) +$(deriveJSON (unPrefix "_phylo_" ) ''Phylo ) -- -$(deriveJSON (unPrefix "_q_" ) ''PhyloQueryBuild ) -$(deriveJSON (unPrefix "_pv_" ) ''PhyloView ) $(deriveJSON (unPrefix "_pb_" ) ''PhyloBranch ) -$(deriveJSON (unPrefix "_pe_" ) ''PhyloEdge ) -$(deriveJSON (unPrefix "_pn_" ) ''PhyloNode ) - $(deriveJSON defaultOptions ''Filiation ) +$(deriveJSON (unPrefix "_pn_" ) ''PhyloNode ) $(deriveJSON defaultOptions ''EdgeType ) +$(deriveJSON (unPrefix "_pe_" ) ''PhyloEdge ) +$(deriveJSON (unPrefix "_pv_" ) ''PhyloView ) + --------------------------- -- | Swagger instances | -- diff --git a/src/Gargantext/Core/Viz/Phylo.hs b/src/Gargantext/Core/Viz/Phylo.hs index a20838dc81e2271be29d7b0ddec99610bb101a01..501243e64ad2b0416c744e894fac979973c4721c 100644 --- a/src/Gargantext/Core/Viz/Phylo.hs +++ b/src/Gargantext/Core/Viz/Phylo.hs @@ -625,9 +625,6 @@ makeLenses ''PhyloBranch -- | JSON instances | -- ------------------------ -instance FromJSON Phylo -instance ToJSON Phylo - instance FromJSON PhyloSources instance ToJSON PhyloSources @@ -651,6 +648,9 @@ instance ToJSON PhyloGroup $(deriveJSON (unPrefix "_foundations_" ) ''PhyloFoundations) +instance FromJSON Phylo +instance ToJSON Phylo + -- NFData instances instance NFData CorpusParser @@ -677,3 +677,4 @@ instance NFData Order instance NFData Sort instance NFData Tagger instance NFData PhyloLabel + diff --git a/src/Gargantext/Core/Viz/Phylo/API/Tools.hs b/src/Gargantext/Core/Viz/Phylo/API/Tools.hs index dd6c5e38f082918e962e3c19fd1042350467c1c5..e8e36aa4e8b3edbf999c260acf5029987fccf140 100644 --- a/src/Gargantext/Core/Viz/Phylo/API/Tools.hs +++ b/src/Gargantext/Core/Viz/Phylo/API/Tools.hs @@ -114,7 +114,7 @@ corpusIdtoDocuments timeUnit corpusId = do docs <- selectDocNodes corpusId lId <- defaultList corpusId termList <- getTermList lId MapTerm NgramsTerms - corpus_node <- getNodeWith corpusId (Proxy @ HyperdataCorpus) + corpus_node <- getNodeWith corpusId (Proxy @HyperdataCorpus) let corpusLang = view (node_hyperdata . to _hc_lang) corpus_node let patterns = case termList of diff --git a/src/Gargantext/Core/Viz/Phylo/Legacy/LegacyMain.hs b/src/Gargantext/Core/Viz/Phylo/Legacy/LegacyMain.hs index 8beb075dec1921e4d21a8864ffd9cf47a0da55ea..1644a853dea8b114c0f954091da514a0dd4363d9 100644 --- a/src/Gargantext/Core/Viz/Phylo/Legacy/LegacyMain.hs +++ b/src/Gargantext/Core/Viz/Phylo/Legacy/LegacyMain.hs @@ -46,7 +46,7 @@ flowPhylo :: (HasNodeStory env err m, HasDBid NodeType) -> m Phylo flowPhylo cId = do - corpus_node <- getNodeWith cId (Proxy @ HyperdataCorpus) + corpus_node <- getNodeWith cId (Proxy @HyperdataCorpus) let lang = withDefaultLanguage $ view (node_hyperdata . to _hc_lang) corpus_node list' <- defaultList cId termList <- HashMap.toList <$> getTermsWith (Text.words . unNgramsTerm) [list'] NgramsTerms (Set.singleton MapTerm) diff --git a/src/Gargantext/Database/Action/Flow.hs b/src/Gargantext/Database/Action/Flow.hs index 52c5d37ceefd1319fd78bdb17e21fe0abb3b0e75..ac61a1655227f68982646444cbd374e999a7571c 100644 --- a/src/Gargantext/Database/Action/Flow.hs +++ b/src/Gargantext/Database/Action/Flow.hs @@ -659,7 +659,7 @@ reIndexWith :: ( HasNodeStory env err m ) -> m () reIndexWith cId lId nt lts = do -- printDebug "(cId,lId,nt,lts)" (cId, lId, nt, lts) - corpus_node <- getNodeWith cId (Proxy @ HyperdataCorpus) + corpus_node <- getNodeWith cId (Proxy @HyperdataCorpus) let corpusLang = withDefaultLanguage $ view (node_hyperdata . to _hc_lang) corpus_node -- Getting [NgramsTerm] diff --git a/src/Gargantext/Database/Admin/Types/Hyperdata/Contact.hs b/src/Gargantext/Database/Admin/Types/Hyperdata/Contact.hs index 941b1251c097c4e52ddf96a2ec01e50a59647c0b..89155ba88613a558d8c7f9fb879125a6eedc5612 100644 --- a/src/Gargantext/Database/Admin/Types/Hyperdata/Contact.hs +++ b/src/Gargantext/Database/Admin/Types/Hyperdata/Contact.hs @@ -193,6 +193,20 @@ instance Arbitrary HyperdataContact where -- | Specific Gargantext instance instance Hyperdata HyperdataContact +-- | All lenses +makeLenses ''ContactWho +makeLenses ''ContactWhere +makeLenses ''ContactTouch +makeLenses ''ContactMetaData +makeLenses ''HyperdataContact + +-- | All Json instances +$(deriveJSON (unPrefix "_ct_") ''ContactTouch) +$(deriveJSON (unPrefix "_cw_") ''ContactWho) +$(deriveJSON (unPrefix "_cw_") ''ContactWhere) +$(deriveJSON (unPrefix "_cm_") ''ContactMetaData) +$(deriveJSON (unPrefix "_hc_") ''HyperdataContact) + -- | Database (Posgresql-simple instance) instance FromField HyperdataContact where fromField = fromField' @@ -207,16 +221,3 @@ instance DefaultFromField (Nullable SqlJsonb) HyperdataContact where --- | All lenses -makeLenses ''ContactWho -makeLenses ''ContactWhere -makeLenses ''ContactTouch -makeLenses ''ContactMetaData -makeLenses ''HyperdataContact - --- | All Json instances -$(deriveJSON (unPrefix "_cw_") ''ContactWho) -$(deriveJSON (unPrefix "_cw_") ''ContactWhere) -$(deriveJSON (unPrefix "_ct_") ''ContactTouch) -$(deriveJSON (unPrefix "_cm_") ''ContactMetaData) -$(deriveJSON (unPrefix "_hc_") ''HyperdataContact) diff --git a/src/Gargantext/Database/Admin/Types/Hyperdata/Document.hs b/src/Gargantext/Database/Admin/Types/Hyperdata/Document.hs index f955e8f9186854a8f6bfcbfd95ff1d6ade5958f2..52d21120993a75f8de849fadb7a99747db6be5a3 100644 --- a/src/Gargantext/Database/Admin/Types/Hyperdata/Document.hs +++ b/src/Gargantext/Database/Admin/Types/Hyperdata/Document.hs @@ -73,8 +73,6 @@ defaultHyperdataDocument = case decode docExample of data StatusV3 = StatusV3 { statusV3_error :: !(Maybe Text) , statusV3_action :: !(Maybe Text) } deriving (Show, Generic) -$(deriveJSON (unPrefix "statusV3_") ''StatusV3) - ------------------------------------------------------------------------ data HyperdataDocumentV3 = HyperdataDocumentV3 { _hdv3_publication_day :: !(Maybe Int) @@ -140,12 +138,25 @@ arbitraryHyperdataDocuments = instance Hyperdata HyperdataDocument instance Hyperdata HyperdataDocumentV3 ------------------------------------------------------------------------ -$(makeLenses ''HyperdataDocument) -makePrisms ''HyperdataDocument +-- $(deriveJSON (unPrefix "_hd_") ''HyperdataDocument) +instance ToSchema HyperdataDocument where + declareNamedSchema proxy = + genericDeclareNamedSchema (unPrefixSwagger "_hd_") proxy + & mapped.schema.description ?~ "Document Hyperdata" + & mapped.schema.example ?~ toJSON defaultHyperdataDocument -$(makeLenses ''HyperdataDocumentV3) +{- +-- | For now HyperdataDocumentV3 is not exposed with the API +instance ToSchema HyperdataDocumentV3 where + declareNamedSchema proxy = + genericDeclareNamedSchema (unPrefixSwagger "hyperdataDocumentV3_") proxy + & mapped.schema.description ?~ "Document Hyperdata for Garg V3" + & mapped.schema.example ?~ toJSON defaultHyperdataDocumentV3 +-} --- $(deriveJSON (unPrefix "_hd_") ''HyperdataDocument) +-- +-- JSON instances +-- instance FromJSON HyperdataDocument where @@ -167,24 +178,13 @@ instance ToJSON HyperdataDocument +$(deriveJSON (unPrefix "statusV3_") ''StatusV3) $(deriveJSON (unPrefix "_hdv3_") ''HyperdataDocumentV3) -instance ToSchema HyperdataDocument where - declareNamedSchema proxy = - genericDeclareNamedSchema (unPrefixSwagger "_hd_") proxy - & mapped.schema.description ?~ "Document Hyperdata" - & mapped.schema.example ?~ toJSON defaultHyperdataDocument +-- +-- FromField/ToField instances +-- -{- --- | For now HyperdataDocumentV3 is not exposed with the API -instance ToSchema HyperdataDocumentV3 where - declareNamedSchema proxy = - genericDeclareNamedSchema (unPrefixSwagger "hyperdataDocumentV3_") proxy - & mapped.schema.description ?~ "Document Hyperdata for Garg V3" - & mapped.schema.example ?~ toJSON defaultHyperdataDocumentV3 --} - ------------------------------------------------------------------------- instance FromField HyperdataDocument where fromField = fromField' @@ -193,14 +193,12 @@ instance FromField HyperdataDocumentV3 where fromField = fromField' -------- instance ToField HyperdataDocument where toField = toJSONField instance ToField HyperdataDocumentV3 where toField = toJSONField ------------------------------------------------------------------------- instance DefaultFromField SqlJsonb HyperdataDocument where defaultFromField = fromPGSFromField @@ -208,4 +206,10 @@ instance DefaultFromField SqlJsonb HyperdataDocument instance DefaultFromField SqlJsonb HyperdataDocumentV3 where defaultFromField = fromPGSFromField ------------------------------------------------------------------------- + +-- +-- Lenses +-- +$(makeLenses ''HyperdataDocument) +makePrisms ''HyperdataDocument +$(makeLenses ''HyperdataDocumentV3) diff --git a/src/Gargantext/Database/Admin/Types/Hyperdata/User.hs b/src/Gargantext/Database/Admin/Types/Hyperdata/User.hs index b034a8db59c286377089cd75a2697f2554e73aa8..75ea3d8bd54ba95f4a1dfc3863f87addf3c5c662 100644 --- a/src/Gargantext/Database/Admin/Types/Hyperdata/User.hs +++ b/src/Gargantext/Database/Admin/Types/Hyperdata/User.hs @@ -98,9 +98,9 @@ makeLenses ''HyperdataPrivate makeLenses ''HyperdataPublic -- | All Json instances -$(deriveJSON (unPrefix "_hu_") ''HyperdataUser) $(deriveJSON (unPrefix "_hpr_") ''HyperdataPrivate) $(deriveJSON (unPrefix "_hpu_") ''HyperdataPublic) +$(deriveJSON (unPrefix "_hu_") ''HyperdataUser) -- | Arbitrary instances instance Arbitrary HyperdataUser where diff --git a/src/Gargantext/Database/Admin/Types/Metrics.hs b/src/Gargantext/Database/Admin/Types/Metrics.hs index d89a950ade2956f686061beed61345244084a736..3888a6573a10a5fc69b1ba9ac8ff9ce456fa55a2 100644 --- a/src/Gargantext/Database/Admin/Types/Metrics.hs +++ b/src/Gargantext/Database/Admin/Types/Metrics.hs @@ -41,8 +41,8 @@ instance Arbitrary Metric <*> arbitrary <*> arbitrary -deriveJSON (unPrefix "metrics_") ''Metrics deriveJSON (unPrefix "m_") ''Metric +deriveJSON (unPrefix "metrics_") ''Metrics newtype ChartMetrics a = ChartMetrics { chartMetrics_data :: a } diff --git a/src/Gargantext/Database/Prelude.hs b/src/Gargantext/Database/Prelude.hs index b5a751774c7f2a2e886f984157974a1f25ccb879..5a1cf7b85526d8cf2925c9c890fcc7f32b06a5c1 100644 --- a/src/Gargantext/Database/Prelude.hs +++ b/src/Gargantext/Database/Prelude.hs @@ -119,7 +119,7 @@ fromInt64ToInt = fromIntegral mkCmd :: (Connection -> IO a) -> DBCmd err a mkCmd k = do pool <- view connPool - withResource pool (liftBase . k) + liftBase $ withResource pool (liftBase . k) runCmd :: (HasConnectionPool env) => env diff --git a/src/Gargantext/Database/Query/Facet.hs b/src/Gargantext/Database/Query/Facet.hs index 4c1f656bb78dd60d097cc451b2773aa41724856d..a6dc8716a56a2ec3864c5c8f0d3a3cfb87d34fe0 100644 --- a/src/Gargantext/Database/Query/Facet.hs +++ b/src/Gargantext/Database/Query/Facet.hs @@ -15,6 +15,7 @@ Portability : POSIX {-# LANGUAGE NoMonomorphismRestriction #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE TypeOperators #-} ------------------------------------------------------------------------ module Gargantext.Database.Query.Facet ( runViewAuthorsDoc diff --git a/src/Gargantext/Database/Schema/User.hs b/src/Gargantext/Database/Schema/User.hs index 8d971e235e583b936d57b8f3037933b7efd7b3d7..c653b639fb0b4238030644966e00c37dbdbb8929 100644 --- a/src/Gargantext/Database/Schema/User.hs +++ b/src/Gargantext/Database/Schema/User.hs @@ -121,11 +121,11 @@ userTable = Table "auth_user" } ) +$(deriveJSON (unPrefix "userLight_") ''UserLight) +$(deriveJSON (unPrefix "user_") ''UserPoly) + instance FromField UserLight where fromField = fromField' instance FromField UserDB where fromField = fromField' - -$(deriveJSON (unPrefix "userLight_") ''UserLight) -$(deriveJSON (unPrefix "user_") ''UserPoly) diff --git a/src/Gargantext/Utils/Jobs.hs b/src/Gargantext/Utils/Jobs.hs index f3e2c97ec1acf9f1222abee460604e2b9231f53a..06167e8c94a51c3243227ecb5262421255e0aec9 100644 --- a/src/Gargantext/Utils/Jobs.hs +++ b/src/Gargantext/Utils/Jobs.hs @@ -10,6 +10,7 @@ Portability : POSIX {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE TypeOperators #-} module Gargantext.Utils.Jobs ( -- * Serving the JOBS API serveJobsAPI diff --git a/src/Gargantext/Utils/SpacyNLP.hs b/src/Gargantext/Utils/SpacyNLP.hs index df3a197b6e56c16969ad2d4506efb18a2b41ba46..2696a9da27afe8e577bd213a12caaedd7d78c303 100644 --- a/src/Gargantext/Utils/SpacyNLP.hs +++ b/src/Gargantext/Utils/SpacyNLP.hs @@ -15,71 +15,24 @@ Server to be used: https://gitlab.iscpif.fr/gargantext/spacy-server {-# LANGUAGE TemplateHaskell #-} -module Gargantext.Utils.SpacyNLP where +module Gargantext.Utils.SpacyNLP ( + module Gargantext.Utils.SpacyNLP.Types + , spacyRequest + , spacyTagsToToken + , spacyDataToPosSentences + , nlp + ) where -import Control.Lens import Data.Aeson (encode) -import Data.Aeson.TH (deriveJSON) import Data.Text hiding (map, group, filter, concat, zip) import Gargantext.Core (Lang(..)) import Gargantext.Core.Text.Terms.Multi.PosTagging.Types -import Gargantext.Core.Types (POS(..), NER(..)) -import Gargantext.Core.Utils.Prefix (unPrefix) import Gargantext.Prelude import Network.HTTP.Simple (parseRequest, httpJSON, setRequestBodyLBS, getResponseBody, Response) import Network.URI (URI(..)) +import Gargantext.Utils.SpacyNLP.Types -data SpacyData = SpacyData { _spacy_data :: ![SpacyText]} - deriving (Show) - -data SpacyText = SpacyText { _spacy_text :: !Text - , _spacy_tags :: ![SpacyTags] - } deriving (Show) -data SpacyTags = - SpacyTags { _spacyTags_text :: !Text - , _spacyTags_text_with_ws :: !Text - , _spacyTags_whitespace :: !Text - , _spacyTags_head :: !Text - , _spacyTags_head_index :: !Int - , _spacyTags_left_edge :: !Text - , _spacyTags_right_edge :: !Text - , _spacyTags_index :: Int - , _spacyTags_ent_type :: !NER - , _spacyTags_ent_iob :: !Text - , _spacyTags_lemma :: !Text - , _spacyTags_normalized :: !Text - , _spacyTags_shape :: !Text - , _spacyTags_prefix :: !Text - , _spacyTags_suffix :: !Text - , _spacyTags_is_alpha :: Bool - , _spacyTags_is_ascii :: Bool - , _spacyTags_is_digit :: Bool - , _spacyTags_is_title :: Bool - , _spacyTags_is_punct :: Bool - , _spacyTags_is_left_punct :: Bool - , _spacyTags_is_right_punct :: Bool - , _spacyTags_is_space :: Bool - , _spacyTags_is_bracket :: Bool - , _spacyTags_is_quote :: Bool - , _spacyTags_is_currency :: Bool - , _spacyTags_like_url :: Bool - , _spacyTags_like_num :: Bool - , _spacyTags_like_email :: Bool - , _spacyTags_is_oov :: Bool - , _spacyTags_is_stop :: Bool - , _spacyTags_pos :: POS - , _spacyTags_tag :: POS - , _spacyTags_dep :: !Text - , _spacyTags_lang :: !Text - , _spacyTags_prob :: !Int - , _spacyTags_char_offset :: !Int - } deriving (Show) - - -data SpacyRequest = SpacyRequest { _spacyRequest_text :: !Text } - deriving (Show) - spacyRequest :: URI -> Text -> IO SpacyData spacyRequest uri txt = do req <- parseRequest $ "POST " <> show (uri { uriPath = "/pos" }) @@ -87,30 +40,18 @@ spacyRequest uri txt = do result <- httpJSON request :: IO (Response SpacyData) pure $ getResponseBody result - --- Instances -deriveJSON (unPrefix "_spacy_") ''SpacyData -deriveJSON (unPrefix "_spacy_") ''SpacyText -deriveJSON (unPrefix "_spacyTags_") ''SpacyTags -deriveJSON (unPrefix "_spacyRequest_") ''SpacyRequest - -makeLenses ''SpacyData -makeLenses ''SpacyText -makeLenses ''SpacyTags -makeLenses ''SpacyRequest - ---------------------------------------------------------------- spacyTagsToToken :: SpacyTags -> Token -spacyTagsToToken st = Token (st ^. spacyTags_index) - (st ^. spacyTags_normalized) - (st ^. spacyTags_text) - (st ^. spacyTags_lemma) - (st ^. spacyTags_head_index) - (st ^. spacyTags_char_offset) - (Just $ st ^. spacyTags_pos) - (Just $ st ^. spacyTags_ent_type) - (Just $ st ^. spacyTags_prefix) - (Just $ st ^. spacyTags_suffix) +spacyTagsToToken st = Token (_spacyTags_index st) + (_spacyTags_normalized st) + (_spacyTags_text st) + (_spacyTags_lemma st) + (_spacyTags_head_index st) + (_spacyTags_char_offset st) + (Just $ _spacyTags_pos st) + (Just $ _spacyTags_ent_type st) + (Just $ _spacyTags_prefix st) + (Just $ _spacyTags_suffix st) spacyDataToPosSentences :: SpacyData -> PosSentences spacyDataToPosSentences (SpacyData ds) = PosSentences diff --git a/src/Gargantext/Utils/SpacyNLP/Types.hs b/src/Gargantext/Utils/SpacyNLP/Types.hs new file mode 100644 index 0000000000000000000000000000000000000000..a43cd69aca53ea3f3eaeefff0e35a0bbb0062610 --- /dev/null +++ b/src/Gargantext/Utils/SpacyNLP/Types.hs @@ -0,0 +1,95 @@ +{-| +Module : Gargantext.Utils.SpacyNLP.Types +Description : John Snow NLP API connexion +Copyright : (c) CNRS, 2017 +License : AGPL + CECILL v3 +Maintainer : team@gargantext.org +Stability : experimental +Portability : POSIX + +Spacy ecosystem: https://github.com/explosion/spaCy + +Server to be used: https://gitlab.iscpif.fr/gargantext/spacy-server + +-} + +{-# LANGUAGE TemplateHaskell #-} + +module Gargantext.Utils.SpacyNLP.Types where + +import Control.Lens +import Data.Aeson.TH (deriveJSON) +import Data.Text hiding (map, group, filter, concat, zip) +import Gargantext.Core.Types (POS(..), NER(..)) +import Gargantext.Core.Utils.Prefix (unPrefix) +import Gargantext.Prelude + + +data SpacyData = SpacyData { _spacy_data :: ![SpacyText]} + deriving (Show) + +data SpacyText = SpacyText { _spacy_text :: !Text + , _spacy_tags :: ![SpacyTags] + } deriving (Show) +data SpacyTags = + SpacyTags { _spacyTags_text :: !Text + , _spacyTags_text_with_ws :: !Text + , _spacyTags_whitespace :: !Text + , _spacyTags_head :: !Text + , _spacyTags_head_index :: !Int + , _spacyTags_left_edge :: !Text + , _spacyTags_right_edge :: !Text + , _spacyTags_index :: Int + , _spacyTags_ent_type :: !NER + , _spacyTags_ent_iob :: !Text + , _spacyTags_lemma :: !Text + , _spacyTags_normalized :: !Text + , _spacyTags_shape :: !Text + , _spacyTags_prefix :: !Text + , _spacyTags_suffix :: !Text + , _spacyTags_is_alpha :: Bool + , _spacyTags_is_ascii :: Bool + , _spacyTags_is_digit :: Bool + , _spacyTags_is_title :: Bool + , _spacyTags_is_punct :: Bool + , _spacyTags_is_left_punct :: Bool + , _spacyTags_is_right_punct :: Bool + , _spacyTags_is_space :: Bool + , _spacyTags_is_bracket :: Bool + , _spacyTags_is_quote :: Bool + , _spacyTags_is_currency :: Bool + , _spacyTags_like_url :: Bool + , _spacyTags_like_num :: Bool + , _spacyTags_like_email :: Bool + , _spacyTags_is_oov :: Bool + , _spacyTags_is_stop :: Bool + , _spacyTags_pos :: POS + , _spacyTags_tag :: POS + , _spacyTags_dep :: !Text + , _spacyTags_lang :: !Text + , _spacyTags_prob :: !Int + , _spacyTags_char_offset :: !Int + } deriving (Show) + + +data SpacyRequest = SpacyRequest { _spacyRequest_text :: !Text } + deriving (Show) + +-- +-- JSON instances +-- + +deriveJSON (unPrefix "_spacyTags_") ''SpacyTags +deriveJSON (unPrefix "_spacy_") ''SpacyText +deriveJSON (unPrefix "_spacy_") ''SpacyData +deriveJSON (unPrefix "_spacyRequest_") ''SpacyRequest + +-- +-- Lenses +-- + +makeLenses ''SpacyData +makeLenses ''SpacyText +makeLenses ''SpacyTags +makeLenses ''SpacyRequest + diff --git a/stack.yaml b/stack.yaml index 941f09ef2d8b23d96101854d5b55f330ddaeb99d..06036cef64d28568f06f8926980a53f751768ef0 100644 --- a/stack.yaml +++ b/stack.yaml @@ -148,6 +148,11 @@ extra-deps: - tmp-postgres-1.34.1.0 - vector-0.12.3.0@sha256:0ae2c1ba86f0077910be242ec6802cc3d7725fe7b2bea6987201aa3737b239b5,7953 - wai-3.2.4 +- morpheus-graphql-0.24.3 +- morpheus-graphql-app-0.24.3 +- morpheus-graphql-core-0.24.3 +- morpheus-graphql-server-0.24.3 +- morpheus-graphql-subscriptions-0.24.3 # For the graph clustering ghc-options: