{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedStrings #-}

module Database.Bloodhound.OpenSearch2.Requests
  ( module Reexport,
    openPointInTime,
    closePointInTime,
  )
where

import Data.Aeson
import Database.Bloodhound.Client.Cluster
import Database.Bloodhound.Common.Requests as Reexport
import Database.Bloodhound.Internal.Client.BHRequest
import Database.Bloodhound.Internal.Utils.Requests
import Database.Bloodhound.Internal.Versions.Common.Types.Newtypes
import Database.Bloodhound.OpenSearch2.Types
import Prelude hiding (filter, head)

-- | 'openPointInTime' opens a point in time for an index given an 'IndexName'.
-- Note that the point in time should be closed with 'closePointInTime' as soon
-- as it is no longer needed.
--
-- For more information see
-- <https://opensearch.org/docs/latest/search-plugins/point-in-time/>.
openPointInTime ::
  IndexName ->
  BHRequest StatusDependant (ParsedEsResponse OpenPointInTimeResponse)
openPointInTime :: IndexName
-> BHRequest
     StatusDependant (ParsedEsResponse OpenPointInTimeResponse)
openPointInTime IndexName
indexName =
  BHRequest StatusDependant OpenPointInTimeResponse
-> BHRequest
     StatusDependant (ParsedEsResponse OpenPointInTimeResponse)
forall a parsingContext.
BHRequest parsingContext a
-> BHRequest StatusDependant (ParsedEsResponse a)
withBHResponseParsedEsResponse (BHRequest StatusDependant OpenPointInTimeResponse
 -> BHRequest
      StatusDependant (ParsedEsResponse OpenPointInTimeResponse))
-> BHRequest StatusDependant OpenPointInTimeResponse
-> BHRequest
     StatusDependant (ParsedEsResponse OpenPointInTimeResponse)
forall a b. (a -> b) -> a -> b
$ forall contextualized body.
(ParseBHResponse contextualized, FromJSON body) =>
Endpoint -> ByteString -> BHRequest contextualized body
post @StatusDependant [IndexName -> Text
unIndexName IndexName
indexName, Text
Item Endpoint
"_search", Text
Item Endpoint
"point_in_time?keep_alive=1m"] ByteString
emptyBody

-- | 'closePointInTime' closes a point in time given a 'ClosePointInTime'.
--
-- For more information see
-- <https://opensearch.org/docs/latest/search-plugins/point-in-time/>.
closePointInTime ::
  ClosePointInTime ->
  BHRequest StatusDependant (ParsedEsResponse ClosePointInTimeResponse)
closePointInTime :: ClosePointInTime
-> BHRequest
     StatusDependant (ParsedEsResponse ClosePointInTimeResponse)
closePointInTime ClosePointInTime
q = do
  BHRequest StatusDependant ClosePointInTimeResponse
-> BHRequest
     StatusDependant (ParsedEsResponse ClosePointInTimeResponse)
forall a parsingContext.
BHRequest parsingContext a
-> BHRequest StatusDependant (ParsedEsResponse a)
withBHResponseParsedEsResponse (BHRequest StatusDependant ClosePointInTimeResponse
 -> BHRequest
      StatusDependant (ParsedEsResponse ClosePointInTimeResponse))
-> BHRequest StatusDependant ClosePointInTimeResponse
-> BHRequest
     StatusDependant (ParsedEsResponse ClosePointInTimeResponse)
forall a b. (a -> b) -> a -> b
$ forall contextualized body.
(ParseBHResponse contextualized, FromJSON body) =>
Endpoint -> ByteString -> BHRequest contextualized body
deleteWithBody @StatusDependant [Text
Item Endpoint
"_search", Text
Item Endpoint
"point_in_time"] (ClosePointInTime -> ByteString
forall a. ToJSON a => a -> ByteString
encode ClosePointInTime
q)