private async Task RefreshAccessTokenIfNeededAsync(StravaToken token)
        {
            // check if strava token should be refreshed
            if ((token.ExpirationDate.AddSeconds(-60)).ToUniversalTime() > DateTimeOffset.UtcNow)
            {
                return;
            }

            var httpClient = this.httpClientFactory.CreateClient();

            var refreshResponse = await httpClient.RequestRefreshTokenAsync(
                new RefreshTokenRequest
            {
                Address      = StravaAuthenticationDefaults.TokenEndpoint,
                ClientId     = configuration["StravaClientId"],
                ClientSecret = configuration["StravaClientSecret"],
                RefreshToken = token.RefreshToken
            });

            token.AccessToken    = refreshResponse.AccessToken;
            token.RefreshToken   = refreshResponse.RefreshToken;
            token.TokenType      = refreshResponse.TokenType;
            token.ExpirationDate = DateTimeOffset.UtcNow.AddSeconds(refreshResponse.ExpiresIn);
            token.TokenRefresh();
        }
Exemplo n.º 2
0
        private async Task RefreshToken()
        {
            var request = new RestRequest("/oauth/token");

            request.Method = Method.POST;
            request.AddHeader("Accept", "application/json");
            request.AddParameter("client_id", _settings.ClientId);
            request.AddParameter("client_secret", _settings.ClientSecret);

            if (_token != null && !string.IsNullOrWhiteSpace(_token.RefreshToken) && DateTime.Now > _token.Expiry)
            {
                request.AddParameter("refresh_token", _token.RefreshToken);
                request.AddParameter("grant_type", "refresh_token");
            }
            else if (_token == null || string.IsNullOrWhiteSpace(_token.AccessToken))
            {
                request.AddParameter("code", _settings.Code);
                request.AddParameter("grant_type", "authorization_code");
            }

            TokenDto tokenDto = await Execute <TokenDto>(request, false);

            _token = new StravaToken
            {
                AccessToken = tokenDto?.access_token ?? throw new Exception("Cannot obtain access token from the strava api"),
                                    RefreshToken = tokenDto?.refresh_token ?? throw new Exception("Cannot obtain refresh token from the strava api"),
                                                         Expiry = DateTime.Now.AddSeconds(tokenDto.expires_in)
            };

            await _tokenService.Add(_token);
        }
Exemplo n.º 3
0
        public async Task <StravaToken> GetToken()
        {
            StravaToken token = await _dbContext
                                .Tokens
                                .OrderByDescending(e => e.Expiry)
                                .FirstOrDefaultAsync();

            return(token);
        }
Exemplo n.º 4
0
        private async Task ValidateToken()
        {
            if (_token == null)
            {
                _token = await _tokenService.GetToken();
            }

            if (_token == null || string.IsNullOrWhiteSpace(_token.AccessToken) || DateTime.Now > _token.Expiry)
            {
                await RefreshToken();
            }
        }
        private async Task <List <Activity> > GetActivitiesFromStrava(StravaToken stravaToken, DateTimeOffset startTime)
        {
            try
            {
                var stravaActivites = await this.stravaWrapper.GetAthleteActivites(stravaToken, startTime, endTime : null);

                return(this.mapper.Map <List <Activity> >(stravaActivites));
            }
            catch (Exception)
            {
                return(null);
            }
        }
Exemplo n.º 6
0
        private async Task <List <Club> > GetClubsFromStrava(StravaToken stravaToken)
        {
            try
            {
                var stravaClubs = await this.stravaWrapper.GetAthleteClubs(stravaToken);

                return(this.mapper.Map <List <Club> >(stravaClubs));
            }
            catch (Exception)
            {
                return(null);
            }
        }
        private void UpdateStravaToken(long athleteId, StravaToken token)
        {
            var athlete = this.db.Athletes.Include(p => p.AthleteStravaToken).FirstOrDefault(p => p.Id == athleteId);

            if (athlete.AthleteStravaToken == null)
            {
                athlete.AthleteStravaToken = new AthleteStravaToken();
            }

            athlete.AthleteStravaToken.LastUpdateDate = DateTimeOffset.UtcNow;
            athlete.AthleteStravaToken.AccessToken    = token.AccessToken;
            athlete.AthleteStravaToken.RefreshToken   = token.RefreshToken;
            athlete.AthleteStravaToken.TokenType      = token.TokenType;
            athlete.AthleteStravaToken.ExpirationDate = token.ExpirationDate;

            this.db.SaveChanges();
        }
        public void UpdateStravaToken(long athleteId, AuthenticationProperties properties)
        {
            var authenticationTokens = properties.GetTokens();

            var stravaToken = new StravaToken
            {
                AccessToken  = authenticationTokens.FirstOrDefault(p => p.Name == "access_token")?.Value,
                RefreshToken = authenticationTokens.FirstOrDefault(p => p.Name == "refresh_token")?.Value,
                TokenType    = authenticationTokens.FirstOrDefault(p => p.Name == "token_type")?.Value
            };

            var expiresAt = authenticationTokens.FirstOrDefault(p => p.Name == "expires_at")?.Value;

            stravaToken.ExpirationDate = DateTimeOffset.TryParse(expiresAt, CultureInfo.InvariantCulture, DateTimeStyles.None, out var expiration)
                ? expiration
                : DateTimeOffset.UtcNow;

            this.UpdateStravaToken(athleteId, stravaToken);
        }
        public async Task <DetailedActivity> GetActivity(StravaToken token, long activityId)
        {
            try
            {
                await this.RefreshAccessTokenIfNeededAsync(token);

                var apiClient = new ApiClient {
                    AccessToken = token.AccessToken
                };
                var apiInstance = new ActivitiesApi(apiClient);

                return(apiInstance.GetActivityById(activityId, includeAllEfforts: false));
            }
            catch (Exception)
            {
                // TODO: log error
                return(null);
            }
        }
        public async Task <List <SummaryActivity> > GetAthleteActivites(StravaToken token, DateTimeOffset startTime, DateTimeOffset?endTime = null)
        {
            var allActivites = new List <SummaryActivity>();

            var minActivityDateTime  = startTime > ActivitiesMinDataTime ? startTime : ActivitiesMinDataTime;
            var maxActivityDateTime  = endTime ?? DateTimeOffset.UtcNow;
            var minActivityEpochTime = (int)minActivityDateTime.ToUnixTimeSeconds();
            var maxActivityEpochTime = (int)maxActivityDateTime.ToUnixTimeSeconds();
            var pageNumber           = 1;

            try
            {
                await this.RefreshAccessTokenIfNeededAsync(token);

                var apiClient = new ApiClient {
                    AccessToken = token.AccessToken
                };
                var apiInstance = new ActivitiesApi(apiClient);

                while (true)
                {
                    var activites = apiInstance.GetLoggedInAthleteActivities(maxActivityEpochTime, minActivityEpochTime, pageNumber, StravaConsts.MaxApiRecordsPerPage);
                    allActivites.AddRange(activites);

                    if (activites.Count <= StravaConsts.MaxApiRecordsPerPage * 0.9)
                    {
                        break;
                    }
                    else
                    {
                        pageNumber++;
                    }
                }
            }
            catch (Exception)
            {
                // TODO: log error
                throw;
            }

            return(allActivites);
        }
        public async Task <List <SummaryClub> > GetAthleteClubs(StravaToken token)
        {
            var allClubs   = new List <SummaryClub>();
            var pageNumber = 1;

            try
            {
                await this.RefreshAccessTokenIfNeededAsync(token);

                var apiClient = new ApiClient {
                    AccessToken = token.AccessToken
                };
                var apiInstance = new ClubsApi(apiClient);

                while (true)
                {
                    var clubs = apiInstance.GetLoggedInAthleteClubs(pageNumber, StravaConsts.MaxApiRecordsPerPage);
                    allClubs.AddRange(clubs);

                    if (clubs.Count <= StravaConsts.MaxApiRecordsPerPage * 0.9)
                    {
                        break;
                    }
                    else
                    {
                        pageNumber++;
                    }
                }
            }
            catch (Exception)
            {
                // TODO: log error
                throw;
            }

            return(allClubs);
        }
Exemplo n.º 12
0
        public async Task Add(StravaToken token)
        {
            _dbContext.Tokens.Add(token);

            await _dbContext.SaveChangesAsync();
        }