module Strive.Actions.Activities
( createActivity
, getActivity
, updateActivity
, deleteActivity
, getCurrentActivities
, getRelatedActivities
, getFeed
, getActivityZones
, getActivityLaps
) where
import Data.Aeson (encode)
import Data.ByteString.Char8 (unpack)
import Data.ByteString.Lazy (toStrict)
import Network.HTTP.Client (responseBody, responseStatus)
import Network.HTTP.Types (Query, methodDelete, noContent204, toQuery)
import Strive.Aliases (ActivityId, ElapsedTime, Name, Result, StartTime)
import Strive.Client (Client)
import Strive.Enums (ActivityType)
import Strive.Internal.HTTP (buildRequest, get, performRequest, post, put)
import Strive.Options (CreateActivityOptions, GetActivityOptions,
GetCurrentActivitiesOptions, GetFeedOptions,
GetRelatedActivitiesOptions, UpdateActivityOptions)
import Strive.Types (ActivityDetailed, ActivityLapSummary, ActivitySummary,
ActivityZoneDetailed)
createActivity :: Client -> Name -> ActivityType -> StartTime -> ElapsedTime -> CreateActivityOptions -> IO (Result ActivityDetailed)
createActivity :: Client
-> Name
-> ActivityType
-> StartTime
-> ElapsedTime
-> CreateActivityOptions
-> IO (Result ActivityDetailed)
createActivity Client
client Name
name ActivityType
type_ StartTime
startDateLocal ElapsedTime
elapsedTime CreateActivityOptions
options = Client -> Name -> [QueryItem] -> IO (Result ActivityDetailed)
forall q j.
(QueryLike q, FromJSON j) =>
Client -> Name -> q -> IO (Result j)
post Client
client Name
resource [QueryItem]
query
where
resource :: Name
resource = Name
"api/v3/activities"
query :: [QueryItem]
query = [(Name, Name)] -> [QueryItem]
forall a. QueryLike a => a -> [QueryItem]
toQuery
[ (Name
"name", Name
name)
, (Name
"type", ActivityType -> Name
forall a. Show a => a -> Name
show ActivityType
type_)
, (Name
"start_date_local", ByteString -> Name
unpack (ByteString -> ByteString
toStrict (StartTime -> ByteString
forall a. ToJSON a => a -> ByteString
encode StartTime
startDateLocal)))
, (Name
"elapsed_time", ElapsedTime -> Name
forall a. Show a => a -> Name
show ElapsedTime
elapsedTime)
] [QueryItem] -> [QueryItem] -> [QueryItem]
forall a. [a] -> [a] -> [a]
++ CreateActivityOptions -> [QueryItem]
forall a. QueryLike a => a -> [QueryItem]
toQuery CreateActivityOptions
options
getActivity :: Client -> ActivityId -> GetActivityOptions -> IO (Result ActivitySummary)
getActivity :: Client
-> ElapsedTime -> GetActivityOptions -> IO (Result ActivitySummary)
getActivity Client
client ElapsedTime
activityId GetActivityOptions
options = Client -> Name -> [QueryItem] -> IO (Result ActivitySummary)
forall q j.
(QueryLike q, FromJSON j) =>
Client -> Name -> q -> IO (Result j)
get Client
client Name
resource [QueryItem]
query
where
resource :: Name
resource = Name
"api/v3/activities/" Name -> Name -> Name
forall a. [a] -> [a] -> [a]
++ ElapsedTime -> Name
forall a. Show a => a -> Name
show ElapsedTime
activityId
query :: [QueryItem]
query = GetActivityOptions -> [QueryItem]
forall a. QueryLike a => a -> [QueryItem]
toQuery GetActivityOptions
options
updateActivity :: Client -> ActivityId -> UpdateActivityOptions -> IO (Result ActivityDetailed)
updateActivity :: Client
-> ElapsedTime
-> UpdateActivityOptions
-> IO (Result ActivityDetailed)
updateActivity Client
client ElapsedTime
activityId UpdateActivityOptions
options = Client -> Name -> [QueryItem] -> IO (Result ActivityDetailed)
forall q j.
(QueryLike q, FromJSON j) =>
Client -> Name -> q -> IO (Result j)
put Client
client Name
resource [QueryItem]
query
where
resource :: Name
resource = Name
"api/v3/activities/" Name -> Name -> Name
forall a. [a] -> [a] -> [a]
++ ElapsedTime -> Name
forall a. Show a => a -> Name
show ElapsedTime
activityId
query :: [QueryItem]
query = UpdateActivityOptions -> [QueryItem]
forall a. QueryLike a => a -> [QueryItem]
toQuery UpdateActivityOptions
options
deleteActivity :: Client -> ActivityId -> IO (Result ())
deleteActivity :: Client -> ElapsedTime -> IO (Result ())
deleteActivity Client
client ElapsedTime
activityId = do
Request
request <- ByteString -> Client -> Name -> [QueryItem] -> IO Request
forall q.
QueryLike q =>
ByteString -> Client -> Name -> q -> IO Request
buildRequest ByteString
methodDelete Client
client Name
resource [QueryItem]
query
Response ByteString
response <- Client -> Request -> IO (Response ByteString)
performRequest Client
client Request
request
Result () -> IO (Result ())
forall (m :: * -> *) a. Monad m => a -> m a
return (if Response ByteString -> Status
forall body. Response body -> Status
responseStatus Response ByteString
response Status -> Status -> Bool
forall a. Eq a => a -> a -> Bool
== Status
noContent204
then () -> Result ()
forall a b. b -> Either a b
Right ()
else (Response ByteString, Name) -> Result ()
forall a b. a -> Either a b
Left (Response ByteString
response, ByteString -> Name
unpack (ByteString -> ByteString
toStrict (Response ByteString -> ByteString
forall body. Response body -> body
responseBody Response ByteString
response))))
where
resource :: Name
resource = Name
"api/v3/activities/" Name -> Name -> Name
forall a. [a] -> [a] -> [a]
++ ElapsedTime -> Name
forall a. Show a => a -> Name
show ElapsedTime
activityId
query :: [QueryItem]
query = [] :: Query
getCurrentActivities :: Client -> GetCurrentActivitiesOptions -> IO (Result [ActivitySummary])
getCurrentActivities :: Client
-> GetCurrentActivitiesOptions -> IO (Result [ActivitySummary])
getCurrentActivities Client
client GetCurrentActivitiesOptions
options = Client -> Name -> [QueryItem] -> IO (Result [ActivitySummary])
forall q j.
(QueryLike q, FromJSON j) =>
Client -> Name -> q -> IO (Result j)
get Client
client Name
resource [QueryItem]
query
where
resource :: Name
resource = Name
"api/v3/athlete/activities"
query :: [QueryItem]
query = GetCurrentActivitiesOptions -> [QueryItem]
forall a. QueryLike a => a -> [QueryItem]
toQuery GetCurrentActivitiesOptions
options
getRelatedActivities :: Client -> ActivityId -> GetRelatedActivitiesOptions -> IO (Result [ActivitySummary])
getRelatedActivities :: Client
-> ElapsedTime
-> GetRelatedActivitiesOptions
-> IO (Result [ActivitySummary])
getRelatedActivities Client
client ElapsedTime
activityId GetRelatedActivitiesOptions
options = Client -> Name -> [QueryItem] -> IO (Result [ActivitySummary])
forall q j.
(QueryLike q, FromJSON j) =>
Client -> Name -> q -> IO (Result j)
get Client
client Name
resource [QueryItem]
query
where
resource :: Name
resource = Name
"api/v3/activities/" Name -> Name -> Name
forall a. [a] -> [a] -> [a]
++ ElapsedTime -> Name
forall a. Show a => a -> Name
show ElapsedTime
activityId Name -> Name -> Name
forall a. [a] -> [a] -> [a]
++ Name
"/related"
query :: [QueryItem]
query = GetRelatedActivitiesOptions -> [QueryItem]
forall a. QueryLike a => a -> [QueryItem]
toQuery GetRelatedActivitiesOptions
options
getFeed :: Client -> GetFeedOptions -> IO (Result [ActivitySummary])
getFeed :: Client
-> GetRelatedActivitiesOptions -> IO (Result [ActivitySummary])
getFeed Client
client GetRelatedActivitiesOptions
options = Client -> Name -> [QueryItem] -> IO (Result [ActivitySummary])
forall q j.
(QueryLike q, FromJSON j) =>
Client -> Name -> q -> IO (Result j)
get Client
client Name
resource [QueryItem]
query
where
resource :: Name
resource = Name
"api/v3/activities/following"
query :: [QueryItem]
query = GetRelatedActivitiesOptions -> [QueryItem]
forall a. QueryLike a => a -> [QueryItem]
toQuery GetRelatedActivitiesOptions
options
getActivityZones :: Client -> ActivityId -> IO (Result [ActivityZoneDetailed])
getActivityZones :: Client -> ElapsedTime -> IO (Result [ActivityZoneDetailed])
getActivityZones Client
client ElapsedTime
activityId = Client -> Name -> [QueryItem] -> IO (Result [ActivityZoneDetailed])
forall q j.
(QueryLike q, FromJSON j) =>
Client -> Name -> q -> IO (Result j)
get Client
client Name
resource [QueryItem]
query
where
resource :: Name
resource = Name
"api/v3/activities/" Name -> Name -> Name
forall a. [a] -> [a] -> [a]
++ ElapsedTime -> Name
forall a. Show a => a -> Name
show ElapsedTime
activityId Name -> Name -> Name
forall a. [a] -> [a] -> [a]
++ Name
"/zones"
query :: [QueryItem]
query = [] :: Query
getActivityLaps :: Client -> ActivityId -> IO (Result [ActivityLapSummary])
getActivityLaps :: Client -> ElapsedTime -> IO (Result [ActivityLapSummary])
getActivityLaps Client
client ElapsedTime
activityId = Client -> Name -> [QueryItem] -> IO (Result [ActivityLapSummary])
forall q j.
(QueryLike q, FromJSON j) =>
Client -> Name -> q -> IO (Result j)
get Client
client Name
resource [QueryItem]
query
where
resource :: Name
resource = Name
"api/v3/activities/" Name -> Name -> Name
forall a. [a] -> [a] -> [a]
++ ElapsedTime -> Name
forall a. Show a => a -> Name
show ElapsedTime
activityId Name -> Name -> Name
forall a. [a] -> [a] -> [a]
++ Name
"/laps"
query :: [QueryItem]
query = [] :: Query