{-|
Module      : Gargantext.API.Context
Description : Server API
Copyright   : (c) CNRS, 2017-Present
License     : AGPL + CECILL v3
Maintainer  : team@gargantext.org
Stability   : experimental
Portability : POSIX

-}

{-# LANGUAGE ScopedTypeVariables  #-}
{-# LANGUAGE TemplateHaskell      #-}
{-# LANGUAGE TypeOperators        #-}

module Gargantext.API.Context
  where

import Prelude

import Data.Aeson (FromJSON, ToJSON)
import Servant

import Gargantext.API.Admin.Auth (withNamedAccess)
import Gargantext.API.Admin.Auth.Types (PathId(..), AuthenticatedUser)
import Gargantext.API.Prelude
import Gargantext.Database.Admin.Types.Node
import Gargantext.Database.Prelude (JSONB)
import Gargantext.Database.Query.Table.Context
import Servant.Server.Generic (AsServerT)
import Gargantext.API.Routes.Named.Context qualified as Named

-------------------------------------------------------------------
-- TODO use Context instead of Node
-- TODO NodeAPI -> ContextAPI
contextAPI :: ( IsGargServer env err m
              , JSONB a
              , FromJSON a
              , ToJSON a )
           => Proxy a
           -> AuthenticatedUser
           -> ContextId
           -> Named.ContextAPI a (AsServerT m)
contextAPI p uId id' =
  withNamedAccess uId (PathNode $ contextId2NodeId id') contextAPI'
  where
    contextAPI' = Named.ContextAPI $ getContextWith   id' p
