-- | <http://strava.github.io/api/v3/uploads/>
module Strive.Actions.Uploads
  ( uploadActivity,
    getUpload,
  )
where

import Data.ByteString (ByteString)
import Network.HTTP.Client (RequestBody (RequestBodyBS), requestBody)
import Network.HTTP.Types (Query, methodPost, toQuery)
import Strive.Aliases (Extension, Result, UploadId)
import Strive.Client (Client)
import Strive.Internal.HTTP (buildRequest, get, handleResponse, performRequest)
import Strive.Options (UploadActivityOptions)
import Strive.Types (UploadStatus)

-- | <http://strava.github.io/api/v3/uploads/#post-file>
uploadActivity ::
  Client ->
  ByteString ->
  Extension ->
  UploadActivityOptions ->
  IO (Result UploadStatus)
uploadActivity :: Client
-> ByteString
-> Extension
-> UploadActivityOptions
-> IO (Result UploadStatus)
uploadActivity Client
client ByteString
body Extension
dataType UploadActivityOptions
options = do
  Request
initialRequest <- forall q.
QueryLike q =>
ByteString -> Client -> Extension -> q -> IO Request
buildRequest ByteString
methodPost Client
client Extension
resource Query
query
  let request :: Request
request = Request
initialRequest {requestBody :: RequestBody
requestBody = ByteString -> RequestBody
RequestBodyBS ByteString
body}
  Response ByteString
response <- Client -> Request -> IO (Response ByteString)
performRequest Client
client Request
request
  forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall j. FromJSON j => Response ByteString -> Result j
handleResponse Response ByteString
response)
  where
    resource :: Extension
resource = Extension
"api/v3/uploads"
    query :: Query
query = forall a. QueryLike a => a -> Query
toQuery [(Extension
"data_type", Extension
dataType)] forall a. Semigroup a => a -> a -> a
<> forall a. QueryLike a => a -> Query
toQuery UploadActivityOptions
options

-- | <http://strava.github.io/api/v3/uploads/#get-status>
getUpload :: Client -> UploadId -> IO (Result UploadStatus)
getUpload :: Client -> UploadId -> IO (Result UploadStatus)
getUpload Client
client UploadId
uploadId = forall q j.
(QueryLike q, FromJSON j) =>
Client -> Extension -> q -> IO (Result j)
get Client
client Extension
resource Query
query
  where
    resource :: Extension
resource = Extension
"api/v3/uploads/" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> Extension
show UploadId
uploadId
    query :: Query
query = [] :: Query