{-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TemplateHaskell #-} -- | module Strive.Types.Activities ( ActivityDetailed(..) , ActivitySummary(..) , ActivityZoneDetailed(..) , ActivityZoneDistributionBucket(..) , ActivityLapSummary(..) ) where import Control.Applicative (empty) import Data.Aeson ((.:), (.:?), FromJSON, Value(Object), parseJSON) import Data.Aeson.TH (deriveFromJSON) import Data.Aeson.Types (Parser, withObject) import Data.Text (Text) import Data.Time.Clock (UTCTime) import Strive.Enums (ActivityType, ActivityZoneType, ResourceState) import Strive.Internal.TH (options) import Strive.Types.Athletes (AthleteMeta) import Strive.Types.Efforts (EffortDetailed) import Strive.Types.Gear (GearSummary) import Strive.Types.Polylines (PolylineDetailed, PolylineSummary) parseLatlng :: Maybe [Double] -> Parser (Maybe (Double, Double)) parseLatlng = \case Nothing -> pure Nothing Just [] -> pure Nothing Just [lat, lng] -> pure $ Just (lat, lng) _ -> fail "Invalid array length when parsing a Latlng" -- | data ActivityDetailed = ActivityDetailed { activityDetailed_achievementCount :: Integer , activityDetailed_athlete :: AthleteMeta , activityDetailed_athleteCount :: Integer , activityDetailed_averageSpeed :: Double , activityDetailed_averageWatts :: Maybe Double , activityDetailed_averageHeartrate :: Maybe Double , activityDetailed_calories :: Double , activityDetailed_commentCount :: Integer , activityDetailed_commute :: Bool , activityDetailed_description :: Maybe Text , activityDetailed_deviceWatts :: Maybe Bool , activityDetailed_distance :: Double , activityDetailed_elapsedTime :: Integer , activityDetailed_endLatlng :: Maybe (Double, Double) , activityDetailed_externalId :: Maybe Text , activityDetailed_flagged :: Bool , activityDetailed_gear :: GearSummary , activityDetailed_gearId :: Maybe Text , activityDetailed_hasKudoed :: Bool , activityDetailed_id :: Integer , activityDetailed_instagramPrimaryPhoto :: Maybe Text , activityDetailed_kilojoules :: Maybe Double , activityDetailed_locationCity :: Maybe Text , activityDetailed_locationCountry :: Maybe Text , activityDetailed_locationState :: Maybe Text , activityDetailed_manual :: Bool , activityDetailed_map :: PolylineDetailed , activityDetailed_maxHeartrate :: Maybe Double , activityDetailed_maxSpeed :: Double , activityDetailed_movingTime :: Integer , activityDetailed_name :: Text , activityDetailed_photoCount :: Integer , activityDetailed_private :: Bool , activityDetailed_resourceState :: ResourceState , activityDetailed_segmentEfforts :: [EffortDetailed] , activityDetailed_startDate :: UTCTime , activityDetailed_startDateLocal :: UTCTime , activityDetailed_startLatitude :: Double , activityDetailed_startLatlng :: Maybe (Double, Double) , activityDetailed_startLongitude :: Double , activityDetailed_timezone :: Text , activityDetailed_totalElevationGain :: Double , activityDetailed_trainer :: Bool , activityDetailed_truncated :: Integer , activityDetailed_type :: ActivityType , activityDetailed_uploadId :: Maybe Integer , activityDetailed_weightedAverageWatts :: Maybe Integer } deriving Show instance FromJSON ActivityDetailed where parseJSON = withObject "ActivityDetailed" $ \v -> ActivityDetailed <$> v .: "achievement_count" <*> v .: "athlete" <*> v .: "athlete_count" <*> v .: "average_speed" <*> v .:? "average_watts" <*> v .:? "average_heartrate" <*> v .: "calories" <*> v .: "comment_count" <*> v .: "commute" <*> v .:? "description" <*> v .:? "device_watts" <*> v .: "distance" <*> v .: "elapsed_time" <*> (v .:? "end_latlng" >>= parseLatlng) <*> v .:? "external_id" <*> v .: "flagged" <*> v .: "gear" <*> v .:? "gear_id" <*> v .: "has_kudoed" <*> v .: "id" <*> v .:? "instagram_primary_photo" <*> v .:? "kilojoules" <*> v .:? "location_city" <*> v .:? "location_country" <*> v .:? "location_state" <*> v .: "manual" <*> v .: "map" <*> v .:? "max_heartrate" <*> v .: "max_speed" <*> v .: "moving_time" <*> v .: "name" <*> v .: "photo_count" <*> v .: "private" <*> v .: "resource_state" <*> v .: "segment_efforts" <*> v .: "start_date" <*> v .: "start_date_local" <*> v .: "start_latitude" <*> (v .:? "start_latlng" >>= parseLatlng) <*> v .: "start_longitude" <*> v .: "timezone" <*> v .: "total_elevation_gain" <*> v .: "trainer" <*> v .: "truncated" <*> v .: "type" <*> v .:? "upload_id" <*> v .:? "weighted_average_watts" -- | data ActivitySummary = ActivitySummary { activitySummary_achievementCount :: Integer , activitySummary_athlete :: AthleteMeta , activitySummary_athleteCount :: Integer , activitySummary_averageSpeed :: Double , activitySummary_averageWatts :: Maybe Double , activitySummary_averageHeartrate :: Maybe Double , activitySummary_commentCount :: Integer , activitySummary_commute :: Bool , activitySummary_deviceWatts :: Maybe Bool , activitySummary_distance :: Double , activitySummary_elapsedTime :: Integer , activitySummary_endLatlng :: Maybe (Double, Double) , activitySummary_externalId :: Maybe Text , activitySummary_flagged :: Bool , activitySummary_gearId :: Maybe Text , activitySummary_hasKudoed :: Bool , activitySummary_id :: Integer , activitySummary_kilojoules :: Maybe Double , activitySummary_kudosCount :: Integer , activitySummary_locationCity :: Maybe Text , activitySummary_locationCountry :: Maybe Text , activitySummary_locationState :: Maybe Text , activitySummary_manual :: Bool , activitySummary_map :: PolylineSummary , activitySummary_maxHeartrate :: Maybe Double , activitySummary_maxSpeed :: Double , activitySummary_movingTime :: Integer , activitySummary_name :: Text , activitySummary_photoCount :: Integer , activitySummary_private :: Bool , activitySummary_resourceState :: ResourceState , activitySummary_startDate :: UTCTime , activitySummary_startDateLocal :: UTCTime , activitySummary_startLatitude :: Double , activitySummary_startLatlng :: Maybe (Double, Double) , activitySummary_startLongitude :: Double , activitySummary_timezone :: Text , activitySummary_totalElevationGain :: Double , activitySummary_trainer :: Bool , activitySummary_type :: ActivityType , activitySummary_uploadId :: Maybe Integer , activitySummary_weightedAverageWatts :: Maybe Integer } deriving Show instance FromJSON ActivitySummary where parseJSON = withObject "ActivitySummary" $ \v -> ActivitySummary <$> v .: "achievement_count" <*> v .: "athlete" <*> v .: "athlete_count" <*> v .: "average_speed" <*> v .:? "average_watts" <*> v .:? "average_heartrate" <*> v .: "comment_count" <*> v .: "commute" <*> v .:? "device_watts" <*> v .: "distance" <*> v .: "elapsed_time" <*> (v .:? "end_latlng" >>= parseLatlng) <*> v .:? "external_id" <*> v .: "flagged" <*> v .:? "gear_id" <*> v .: "has_kudoed" <*> v .: "id" <*> v .:? "kilojoules" <*> v .: "kudos_count" <*> v .:? "location_city" <*> v .:? "location_country" <*> v .:? "location_state" <*> v .: "manual" <*> v .: "map" <*> v .:? "max_heartrate" <*> v .: "max_speed" <*> v .: "moving_time" <*> v .: "name" <*> v .: "photo_count" <*> v .: "private" <*> v .: "resource_state" <*> v .: "start_date" <*> v .: "start_date_local" <*> v .: "start_latitude" <*> (v .:? "start_latlng" >>= parseLatlng) <*> v .: "start_longitude" <*> v .: "timezone" <*> v .: "total_elevation_gain" <*> v .: "trainer" <*> v .: "type" <*> v .:? "upload_id" <*> v .:? "weighted_average_watts" -- | data ActivityZoneDistributionBucket = ActivityZoneDistributionBucket { activityZoneDistributionBucket_max :: Integer , activityZoneDistributionBucket_min :: Integer , activityZoneDistributionBucket_time :: Integer } deriving Show $(deriveFromJSON options ''ActivityZoneDistributionBucket) -- | data ActivityZoneDetailed = ActivityZoneDetailed { activityZoneDetailed_distributionBuckets :: [ActivityZoneDistributionBucket] , activityZoneDetailed_resourceState :: ResourceState , activityZoneDetailed_sensorBased :: Bool , activityZoneDetailed_type :: ActivityZoneType } deriving Show $(deriveFromJSON options ''ActivityZoneDetailed) -- | data ActivityLapSummary = ActivityLapSummary { activityLapSummary_activityId :: Integer , activityLapSummary_athleteId :: Integer , activityLapSummary_averageSpeed :: Double , activityLapSummary_averageWatts :: Double , activityLapSummary_distance :: Double , activityLapSummary_elapsedTime :: Integer , activityLapSummary_endIndex :: Integer , activityLapSummary_id :: Integer , activityLapSummary_lapIndex :: Integer , activityLapSummary_maxSpeed :: Double , activityLapSummary_movingTime :: Double , activityLapSummary_name :: Text , activityLapSummary_resourceState :: ResourceState , activityLapSummary_startDate :: UTCTime , activityLapSummary_startDateLocal :: UTCTime , activityLapSummary_startIndex :: Integer , activityLapSummary_totalElevationGain :: Double } deriving Show instance FromJSON ActivityLapSummary where parseJSON (Object o) = ActivityLapSummary <$> ((o .: "activity") >>= (.: "id")) <*> ((o .: "athlete") >>= (.: "id")) <*> o .: "average_speed" <*> o .: "average_watts" <*> o .: "distance" <*> o .: "elapsed_time" <*> o .: "end_index" <*> o .: "id" <*> o .: "lap_index" <*> o .: "max_speed" <*> o .: "moving_time" <*> o .: "name" <*> o .: "resource_state" <*> o .: "start_date" <*> o .: "start_date_local" <*> o .: "start_index" <*> o .: "total_elevation_gain" parseJSON _ = empty