module Nuthatch.Probe.ProductClient ( browse , deleteObject , download , sha256Hex , upload ) where import Crypto.Hash (Digest, SHA256, hash) import qualified Data.ByteArray as BA import qualified Data.ByteString as BS import qualified Data.ByteString.Base16 as B16 import qualified Data.ByteString.Char8 as B8 import qualified Data.Text as Text import qualified Data.Text.Encoding as Text import Network.HTTP.Types.URI (urlEncode) import Nuthatch.Probe.Http import Nuthatch.Probe.Oidc browse :: ProbeContext -> Session -> String -> IO ProbeResponse browse context session query = getWith (probeClient context) defaultRequestOptions { optionCookies = Just (sessionCookies session) , optionHeaders = [("Accept", "application/json")] } (probeBase context <> "/api/browse" <> query) download :: ProbeContext -> Session -> String -> String -> IO ProbeResponse download context session root path = getWith (probeClient context) defaultRequestOptions { optionCookies = Just (sessionCookies session) } ( probeBase context <> "/api/download?root=" <> encode root <> "&path=" <> encode path ) upload :: ProbeContext -> Session -> String -> String -> String -> BS.ByteString -> IO ProbeResponse upload context session root path operationId body = postWith (probeClient context) defaultRequestOptions { optionCookies = Just (sessionCookies session) , optionHeaders = [ ("Content-Type", "application/octet-stream") , ("X-Declared-Size", B8.pack (show (BS.length body))) , ("X-Content-SHA256", sha256Hex body) , ("X-CSRF-Token", sessionCsrf session) ] , optionBody = ByteBody body } ( probeBase context <> "/api/upload?root=" <> encode root <> "&path=" <> encode path <> "&operation_id=" <> encode operationId ) deleteObject :: ProbeContext -> Session -> String -> String -> String -> IO ProbeResponse deleteObject context session root path operationId = postWith (probeClient context) defaultRequestOptions { optionCookies = Just (sessionCookies session) , optionHeaders = [("Content-Type", "application/json")] , optionBody = ByteBody . B8.pack $ "{\"root\":\"" <> root <> "\",\"path\":\"" <> path <> "\",\"operation_id\":\"" <> operationId <> "\",\"csrf\":\"" <> B8.unpack (sessionCsrf session) <> "\"}" } (probeBase context <> "/api/delete") sha256Hex :: BS.ByteString -> BS.ByteString sha256Hex input = B16.encode (BA.convert (hash input :: Digest SHA256)) encode :: String -> String encode = B8.unpack . urlEncode True . Text.encodeUtf8 . Text.pack