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 type_ startDateLocal elapsedTime options = post client resource query
where
resource = "api/v3/activities"
query = toQuery
[ ("name", name)
, ("type", show type_)
, ("start_date_local", unpack (toStrict (encode startDateLocal)))
, ("elapsed_time", show elapsedTime)
] ++ toQuery options
getActivity :: Client -> ActivityId -> GetActivityOptions -> IO (Result ActivitySummary)
getActivity client activityId options = get client resource query
where
resource = "api/v3/activities/" ++ show activityId
query = toQuery options
updateActivity :: Client -> ActivityId -> UpdateActivityOptions -> IO (Result ActivityDetailed)
updateActivity client activityId options = put client resource query
where
resource = "api/v3/activities/" ++ show activityId
query = toQuery options
deleteActivity :: Client -> ActivityId -> IO (Result ())
deleteActivity client activityId = do
request <- buildRequest methodDelete client resource query
response <- performRequest client request
return (if responseStatus response == noContent204
then Right ()
else Left (response, unpack (toStrict (responseBody response))))
where
resource = "api/v3/activities/" ++ show activityId
query = [] :: Query
getCurrentActivities :: Client -> GetCurrentActivitiesOptions -> IO (Result [ActivitySummary])
getCurrentActivities client options = get client resource query
where
resource = "api/v3/athlete/activities"
query = toQuery options
getRelatedActivities :: Client -> ActivityId -> GetRelatedActivitiesOptions -> IO (Result [ActivitySummary])
getRelatedActivities client activityId options = get client resource query
where
resource = "api/v3/activities/" ++ show activityId ++ "/related"
query = toQuery options
getFeed :: Client -> GetFeedOptions -> IO (Result [ActivitySummary])
getFeed client options = get client resource query
where
resource = "api/v3/activities/following"
query = toQuery options
getActivityZones :: Client -> ActivityId -> IO (Result [ActivityZoneDetailed])
getActivityZones client activityId = get client resource query
where
resource = "api/v3/activities/" ++ show activityId ++ "/zones"
query = [] :: Query
getActivityLaps :: Client -> ActivityId -> IO (Result [ActivityLapSummary])
getActivityLaps client activityId = get client resource query
where
resource = "api/v3/activities/" ++ show activityId ++ "/laps"
query = [] :: Query