示例#1
0
        public async Task DeleteIntegrationAsync(string id)
        {
            Integration integration = await _integrationRepository.GetIntegrationAsync(id, _operationContext.UserId);

            if (integration != null)
            {
                IIntegrationSystemService integrationSystemService = _integrationSystemServices.GetService(integration.Provider);
                await integrationSystemService.DeleteIntegrationAsync(_operationContext.UserId);

                await _integrationRepository.DeleteIntegrationAsync(id, _operationContext.UserId);

                await _eventPublisher.PublishAsync(CreateIntegrationDeletedEvent(integration));
            }
        }
示例#2
0
        public async Task ProcessUpdateNotification(StravaUpdateNotification updateNotification)
        {
            StravaSubscription subscription = await _stravaSubscriptionService.GetSubscriptionAsync();

            if (updateNotification.SubscriptionId != subscription.Id)
            {
                _logger.LogWarning($"Received Strava update for unrecognised subscription ID: {updateNotification.SubscriptionId}.");
                return;
            }

            Integration integration = await _integrationRepository.GetIntegrationAsync(Provider.Strava, updateNotification.OwnerId.ToString());

            if (integration is null)
            {
                _logger.LogWarning($"Received Strava update for owner ID with no integration '{updateNotification.OwnerId}'.");
                return;
            }

            await _eventPublisher.PublishAsync(
                new IntegrationProviderUpdateEvent(
                    id : Guid.NewGuid().ToString(),
                    subject : updateNotification.OwnerId.ToString(),
                    eventTime : _dateTimeProvider.UtcNow,
                    dataVersion : EventConstants.EventDataVersion,
                    data : new IntegrationProviderEventData
            {
                OperationId = _operationContext.OperationId,
                SourceSystem = EventConstants.IntegrationsApi,
                SubjectSystem = Provider.Strava.ToString(),
                Provider = Provider.Strava,
                ProviderData = updateNotification,
                UserId = integration.UserId
            }));
        }
        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);
        }
示例#4
0
        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);
        }