Ejemplo n.º 1
0
        public Task WithingsRunDeviceNotificationIngestion(
            [ActivityTrigger] IDurableActivityContext context,
            CancellationToken cancellationToken)
        {
            return(exceptionFilter.FilterExceptions(async() =>
            {
                var message = context.GetInput <StartNotificationIngestionMessage>();
                var userId = message.UserId;
                var startDate = DateTimeOffset.FromUnixTimeSeconds(message.StartDateEpoch);
                var endDate = DateTimeOffset.FromUnixTimeSeconds(message.EndDateEpoch);

                var consent = await consentStore.FetchConsent(userId, cancellationToken);
                consent = consent.Verify(userId);

                var measurementsTask = withingsClient.FetchMeasurements(userId, startDate, endDate, cancellationToken);
                var devicesTask = withingsClient.FetchDevices(userId, cancellationToken);

                var measurements = await measurementsTask;
                var devices = await devicesTask;

                var fhirDevices = converter.Convert(devices, consent.Devices.Select(d => d.Value).ToArray()).ToArray();
                var fhirObservations = converter.Convert(consent.FhirId, measurements, fhirDevices).ToArray();

                await fhirClient.CreateObservations(userId, fhirObservations, cancellationToken);

                await SendNotifications(
                    consent,
                    messages: fhirObservations
                    .Select(observation => observation.Device)
                    .Distinct()
                    .Select(device => $"New data is available for {device.Display}"),
                    silent: true,
                    cancellationToken);
            }));
        }
Ejemplo n.º 2
0
        public Task <JsonResult> GetUser(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "user")] HttpRequest req,
            [HttpHeader(Name = "Authorization")] HttpParam <string> authorization,
            CancellationToken cancellationToken)
        {
            return(exceptionFilter.FilterExceptions(async() =>
            {
                var(userId, _, _) = await auth.ValidateUser(authorization, cancellationToken);
                var consent = await consentStore.FetchConsent(userId, cancellationToken);
                consent = consent.Verify(userId, ignoreFhir: true);

                return new JsonResult(await userFactory.CreateUser(consent, jobId: null, cancellationToken));
            }));
        }
Ejemplo n.º 3
0
        public Task <JsonResult> WithingsAuth(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "withings/auth")] HttpRequest req,
            [HttpBody(Required = true)] HttpParam <AuthDto> authDto,
            [HttpHeader(Name = "Authorization")] HttpParam <string> authorization,
            CancellationToken cancellationToken)
        {
            return(exceptionFilter.FilterExceptions(async() =>
            {
                var withingsAccessCode = authDto.Value.WithingsAccessCode;
                var withingsRedirectUri = authDto.Value.WithingsRedirectUri;

                var(userId, _, _) = await auth.ValidateUser(authorization, cancellationToken);
                var consent = await consentStore.FetchConsent(userId, cancellationToken);

                var newWithingsUserId = await withingsClient.CreateAccount(userId, withingsAccessCode, withingsRedirectUri, cancellationToken);

                if (consent == null || !consent.ExternalIds.TryGetValue(withingsToFhirConverter.System, out var withingsUserId) || withingsUserId != newWithingsUserId)
                {
                    consent ??= ConsentFactory.WithId(userId);
                    consent.ExternalIds[withingsToFhirConverter.System] = newWithingsUserId;
                    await consentStore.WriteConsent(consent, cancellationToken);
                }

                return new JsonResult(await userFactory.CreateUser(consent, jobId: null, cancellationToken));
            }));
        }
Ejemplo n.º 4
0
        public Task AccountDeletionTakeLock(
            [ActivityTrigger] IDurableActivityContext context,
            CancellationToken cancellationToken)
        {
            return(exceptionFilter.FilterExceptions(async() =>
            {
                var message = context.GetInput <StartAccountDeletionMessage>();
                var userId = message.UserId;

                var consent = await consentStore.FetchConsent(userId, cancellationToken);

                if (consent == null)
                {
                    return;
                }

                consent.IsDeleting = true;

                await consentStore.WriteConsent(consent, cancellationToken);
            }));
        }
Ejemplo n.º 5
0
        public Task <JsonResult> GetObservations(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "observations")] HttpRequest req,
            [HttpHeader(Name = "Authorization")] HttpParam <string> authorization,
            [HttpQuery] HttpParam <long?> afterEpoch,
            [HttpQuery] HttpParam <long?> beforeEpoch,
            CancellationToken cancellationToken)
        {
            return(exceptionFilter.FilterExceptions(async() =>
            {
                var(userId, _, _) = await auth.ValidateUser(authorization, cancellationToken);
                var consent = await consentStore.FetchConsent(userId, cancellationToken);

                var observations = await fhirClient.FetchObservations(
                    userId,
                    fhirUserId: consent.Verify(userId).FhirId,
                    after: ToDateTimeOffset(afterEpoch),
                    before: ToDateTimeOffset(beforeEpoch),
                    cancellationToken: cancellationToken);

                return new JsonResult(observations);
            }));
        }