-- | 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