public async Task <string> GetAccessTokenAsync(long ownerId) { Integration integration = await _integrationRepository.GetIntegrationAsync(Provider.Strava, ownerId.ToString()); if (integration is null) { return(null); } var stravaIntegrationData = (StravaIntegrationData)integration.Data; if (stravaIntegrationData.AccessTokenExpiresUtc > _dateTimeProvider.UtcNow.AddMinutes(1)) { return(stravaIntegrationData.AccessToken); } TokenResponse tokenResponse = await _stravaClient.RefreshTokenAsync(stravaIntegrationData.RefreshToken); stravaIntegrationData.AccessToken = tokenResponse.AccessToken; stravaIntegrationData.AccessTokenExpiresUtc = _dateTimeProvider.UtcNow.AddSeconds(tokenResponse.ExpiresIn); stravaIntegrationData.RefreshToken = tokenResponse.RefreshToken; await _integrationRepository.UpdateIntegrationAsync( integration.UserId, Provider.Strava, stravaIntegrationData); return(tokenResponse.AccessToken); }
public async Task <string> GetAccessTokenAsync(string userId) { Integration fitbitIntegration = await _integrationsRepository.GetIntegrationAsync(userId, Provider.Fitbit); if (fitbitIntegration == null) { throw new ArgumentException($"Fitbit integration not found for userId '{userId}'"); } var fitbitIntegrationData = (FitbitIntegrationData)fitbitIntegration.Data; if (fitbitIntegrationData.AccessTokenExpiresUtc > _dateTimeProvider.UtcNow.AddMinutes(1)) { return(fitbitIntegrationData.AccessToken); } TokenResponse tokenResponse = await _fitbitAuthenticationClient.RefreshTokenAsync(fitbitIntegrationData.RefreshToken); if (tokenResponse.IsError) { throw new Exception($"Failed to refresh Fitbit token: {tokenResponse.Error} - {tokenResponse.ErrorDescription}"); } fitbitIntegrationData.AccessToken = tokenResponse.AccessToken; fitbitIntegrationData.AccessTokenExpiresUtc = _dateTimeProvider.UtcNow.AddSeconds(tokenResponse.ExpiresIn); fitbitIntegrationData.RefreshToken = tokenResponse.RefreshToken; await _integrationsRepository.UpdateIntegrationAsync(userId, Provider.Fitbit, fitbitIntegrationData); return(tokenResponse.AccessToken); }