-- | <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 <- ByteString -> Client -> Extension -> [QueryItem] -> IO Request
forall q.
QueryLike q =>
ByteString -> Client -> Extension -> q -> IO Request
buildRequest ByteString
methodPost Client
client Extension
resource [QueryItem]
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
  Result UploadStatus -> IO (Result UploadStatus)
forall (m :: * -> *) a. Monad m => a -> m a
return (Response ByteString -> Result UploadStatus
forall j. FromJSON j => Response ByteString -> Result j
handleResponse Response ByteString
response)
 where
  resource :: Extension
resource = Extension
"api/v3/uploads"
  query :: [QueryItem]
query = [(Extension, Extension)] -> [QueryItem]
forall a. QueryLike a => a -> [QueryItem]
toQuery
    [ (Extension
"data_type", Extension
dataType)
    ] [QueryItem] -> [QueryItem] -> [QueryItem]
forall a. [a] -> [a] -> [a]
++ UploadActivityOptions -> [QueryItem]
forall a. QueryLike a => a -> [QueryItem]
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 = Client -> Extension -> [QueryItem] -> IO (Result UploadStatus)
forall q j.
(QueryLike q, FromJSON j) =>
Client -> Extension -> q -> IO (Result j)
get Client
client Extension
resource [QueryItem]
query
 where
  resource :: Extension
resource = Extension
"api/v3/uploads/" Extension -> Extension -> Extension
forall a. [a] -> [a] -> [a]
++ UploadId -> Extension
forall a. Show a => a -> Extension
show UploadId
uploadId
  query :: [QueryItem]
query = [] :: Query