mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-13 22:32:04 +00:00
feat(integrations): let a guardian connect a managed profile's providers
A guardian acting on a managed profile can now connect and disconnect its Withings, WHOOP, Oura, Polar, Strava and Google Health from the profile's integration cards, and each card says whose record it connects for. The connect starts with a fenced fetch that mints a state naming the profile; the provider's callback lands tokens and data there only after checking that the browser belongs to a guardian with a live MANAGE grant on it. Without a provider app of its own, the profile borrows the guardian's, with an audit row. Withings and Google Health callbacks read the session directly, since a provider redirect cannot carry the record-session header.
This commit is contained in:
1 parent
65e0cba0bf
commit
74ce17b7de
35 files changed
+1392
-158
No files matched your search
+9
-2
@@ -5406,8 +5406,15 @@
|
||||
"unavailableTitle": "In diesem geteilten Datensatz nicht verfügbar",
|
||||
"unavailableDescription": "Dieser Einstellungsbereich ist beim Anzeigen des Datensatzes einer anderen Person bewusst nicht verfügbar.",
|
||||
"integrationStatusDescription": "Verbindungsstatus für diesen verwalteten Datensatz.",
|
||||
"integrationStatusDetail": "Ein betreutes Profil zeigt seine verbundenen Dienste nur als Status. Verbinden, neu verbinden, synchronisieren und trennen ist für Betreuende nicht möglich.",
|
||||
"integrationStatusDocs": "So funktioniert das Teilen"
|
||||
"integrationStatusDetail": "Dienste, die du hier verbindest, schicken ihre Daten in das Profil von {name}, nicht in deins. Ohne eigene Anbieter-App nutzt das Profil deine.",
|
||||
"integrationStatusDocs": "So funktioniert das Teilen",
|
||||
"integrationConnectsFor": "Verbindet für {name}",
|
||||
"integrationConnectFor": "Für {name} verbinden",
|
||||
"integrationDisconnect": "Trennen",
|
||||
"integrationDisconnectTitle": "{provider} von {name} trennen?",
|
||||
"integrationDisconnectBody": "Neue Daten kommen dann nicht mehr an. Was schon importiert ist, bleibt im Profil von {name}.",
|
||||
"integrationNoClientApp": "Weder {name} noch dein eigenes Konto hat bisher eine {provider}-App. Richte zuerst bei deinen eigenen Integrationen eine ein.",
|
||||
"integrationConnectFailed": "{provider} konnte nicht verbunden werden."
|
||||
},
|
||||
"sections": {
|
||||
"account": {
|
||||
|
||||
+9
-2
@@ -5406,8 +5406,15 @@
|
||||
"unavailableTitle": "Unavailable in this shared record",
|
||||
"unavailableDescription": "This Settings area is intentionally unavailable while viewing another person's record.",
|
||||
"integrationStatusDescription": "Connection status for this managed record.",
|
||||
"integrationStatusDetail": "A managed profile shows its connected services as a status only. Connecting, reconnecting, syncing and disconnecting are not available to guardians.",
|
||||
"integrationStatusDocs": "How sharing works"
|
||||
"integrationStatusDetail": "Services you connect here send their data to {name}'s record, not to yours. Without a provider app of its own, the profile uses yours.",
|
||||
"integrationStatusDocs": "How sharing works",
|
||||
"integrationConnectsFor": "Connects for {name}",
|
||||
"integrationConnectFor": "Connect for {name}",
|
||||
"integrationDisconnect": "Disconnect",
|
||||
"integrationDisconnectTitle": "Disconnect {provider} from {name}?",
|
||||
"integrationDisconnectBody": "New data stops arriving. Everything already imported stays in {name}'s record.",
|
||||
"integrationNoClientApp": "Neither {name} nor your own account has a {provider} app yet. Set one up under your own integrations first.",
|
||||
"integrationConnectFailed": "Could not start connecting {provider}."
|
||||
},
|
||||
"sections": {
|
||||
"account": {
|
||||
|
||||
+9
-2
@@ -5406,8 +5406,15 @@
|
||||
"unavailableTitle": "No disponible en este registro compartido",
|
||||
"unavailableDescription": "Esta sección de Ajustes no está disponible intencionadamente mientras consultas el registro de otra persona.",
|
||||
"integrationStatusDescription": "Estado de conexión de este registro gestionado.",
|
||||
"integrationStatusDetail": "Un perfil gestionado muestra sus servicios conectados solo como estado. Conectar, volver a conectar, sincronizar y desconectar no está disponible para quienes lo gestionan.",
|
||||
"integrationStatusDocs": "Cómo funciona compartir"
|
||||
"integrationStatusDetail": "Los servicios que conectes aquí envían sus datos al registro de {name}, no al tuyo. Si el perfil no tiene una app propia del proveedor, usa la tuya.",
|
||||
"integrationStatusDocs": "Cómo funciona compartir",
|
||||
"integrationConnectsFor": "Conecta para {name}",
|
||||
"integrationConnectFor": "Conectar para {name}",
|
||||
"integrationDisconnect": "Desconectar",
|
||||
"integrationDisconnectTitle": "¿Desconectar {provider} de {name}?",
|
||||
"integrationDisconnectBody": "Dejarán de llegar datos nuevos. Todo lo ya importado se queda en el registro de {name}.",
|
||||
"integrationNoClientApp": "Ni {name} ni tu propia cuenta tienen todavía una app de {provider}. Configura una primero en tus propias integraciones.",
|
||||
"integrationConnectFailed": "No se pudo empezar a conectar {provider}."
|
||||
},
|
||||
"sections": {
|
||||
"account": {
|
||||
|
||||
+9
-2
@@ -5406,8 +5406,15 @@
|
||||
"unavailableTitle": "Indisponible dans ce dossier partagé",
|
||||
"unavailableDescription": "Cette section des réglages est volontairement indisponible lorsque vous consultez le dossier d’une autre personne.",
|
||||
"integrationStatusDescription": "État de connexion pour ce dossier géré.",
|
||||
"integrationStatusDetail": "Un profil géré affiche ses services connectés uniquement sous forme d’état. Les personnes qui le gèrent ne peuvent ni connecter, ni reconnecter, ni synchroniser, ni déconnecter.",
|
||||
"integrationStatusDocs": "Comment fonctionne le partage"
|
||||
"integrationStatusDetail": "Les services que vous connectez ici envoient leurs données dans le dossier de {name}, pas dans le vôtre. Sans application propre chez le fournisseur, le profil utilise la vôtre.",
|
||||
"integrationStatusDocs": "Comment fonctionne le partage",
|
||||
"integrationConnectsFor": "Connecte pour {name}",
|
||||
"integrationConnectFor": "Connecter pour {name}",
|
||||
"integrationDisconnect": "Déconnecter",
|
||||
"integrationDisconnectTitle": "Déconnecter {provider} de {name} ?",
|
||||
"integrationDisconnectBody": "Les nouvelles données n’arriveront plus. Tout ce qui a déjà été importé reste dans le dossier de {name}.",
|
||||
"integrationNoClientApp": "Ni {name} ni votre propre compte n’ont encore d’application {provider}. Configurez-en d’abord une dans vos propres intégrations.",
|
||||
"integrationConnectFailed": "Impossible de lancer la connexion à {provider}."
|
||||
},
|
||||
"sections": {
|
||||
"account": {
|
||||
|
||||
+9
-2
@@ -5406,8 +5406,15 @@
|
||||
"unavailableTitle": "Non disponibile in questo record condiviso",
|
||||
"unavailableDescription": "Questa area delle Impostazioni non è disponibile intenzionalmente mentre visualizzi il record di un’altra persona.",
|
||||
"integrationStatusDescription": "Stato di connessione per questo record gestito.",
|
||||
"integrationStatusDetail": "Un profilo gestito mostra i servizi collegati solo come stato. Chi lo gestisce non può collegare, ricollegare, sincronizzare o scollegare.",
|
||||
"integrationStatusDocs": "Come funziona la condivisione"
|
||||
"integrationStatusDetail": "I servizi che colleghi qui inviano i dati al profilo di {name}, non al tuo. Se il profilo non ha un'app propria del fornitore, usa la tua.",
|
||||
"integrationStatusDocs": "Come funziona la condivisione",
|
||||
"integrationConnectsFor": "Collega per {name}",
|
||||
"integrationConnectFor": "Collega per {name}",
|
||||
"integrationDisconnect": "Scollega",
|
||||
"integrationDisconnectTitle": "Scollegare {provider} da {name}?",
|
||||
"integrationDisconnectBody": "I nuovi dati smettono di arrivare. Quanto già importato resta nel profilo di {name}.",
|
||||
"integrationNoClientApp": "Né {name} né il tuo account hanno ancora un'app {provider}. Configurane prima una nelle tue integrazioni.",
|
||||
"integrationConnectFailed": "Impossibile avviare il collegamento a {provider}."
|
||||
},
|
||||
"sections": {
|
||||
"account": {
|
||||
|
||||
+9
-2
@@ -5406,8 +5406,15 @@
|
||||
"unavailableTitle": "이 공유 기록에서는 사용할 수 없어요",
|
||||
"unavailableDescription": "다른 사람의 기록을 보는 동안에는 이 설정 영역을 사용할 수 없어요.",
|
||||
"integrationStatusDescription": "이 관리 기록의 연결 상태예요.",
|
||||
"integrationStatusDetail": "관리 프로필은 연결된 서비스를 상태로만 보여 줘요. 보호자는 연결, 다시 연결, 동기화, 연결 해제를 할 수 없어요.",
|
||||
"integrationStatusDocs": "공유 방식 알아보기"
|
||||
"integrationStatusDetail": "여기서 연결한 서비스의 데이터는 내 기록이 아니라 {name}의 기록으로 들어가요. 프로필에 자체 앱이 없으면 내 앱을 사용해요.",
|
||||
"integrationStatusDocs": "공유 방식 알아보기",
|
||||
"integrationConnectsFor": "{name}을(를) 위해 연결",
|
||||
"integrationConnectFor": "{name}을(를) 위해 연결하기",
|
||||
"integrationDisconnect": "연결 해제",
|
||||
"integrationDisconnectTitle": "{name}에서 {provider} 연결을 해제할까요?",
|
||||
"integrationDisconnectBody": "새 데이터가 더 이상 들어오지 않아요. 이미 가져온 데이터는 {name}의 기록에 남아요.",
|
||||
"integrationNoClientApp": "{name}과(와) 내 계정 모두 아직 {provider} 앱이 없어요. 먼저 내 통합 설정에서 앱을 설정해 주세요.",
|
||||
"integrationConnectFailed": "{provider} 연결을 시작하지 못했어요."
|
||||
},
|
||||
"sections": {
|
||||
"account": {
|
||||
|
||||
+9
-2
@@ -5406,8 +5406,15 @@
|
||||
"unavailableTitle": "Niet beschikbaar in dit gedeelde dossier",
|
||||
"unavailableDescription": "Dit deel van Instellingen is bewust niet beschikbaar terwijl je het dossier van iemand anders bekijkt.",
|
||||
"integrationStatusDescription": "Koppelingsstatus voor dit beheerde dossier.",
|
||||
"integrationStatusDetail": "Een beheerd profiel toont de gekoppelde diensten alleen als status. Koppelen, opnieuw koppelen, synchroniseren en ontkoppelen zijn niet beschikbaar voor verzorgers.",
|
||||
"integrationStatusDocs": "Hoe delen werkt"
|
||||
"integrationStatusDetail": "Diensten die je hier koppelt, sturen hun gegevens naar het dossier van {name}, niet naar het jouwe. Zonder eigen app bij de aanbieder gebruikt het profiel de jouwe.",
|
||||
"integrationStatusDocs": "Hoe delen werkt",
|
||||
"integrationConnectsFor": "Koppelt voor {name}",
|
||||
"integrationConnectFor": "Koppelen voor {name}",
|
||||
"integrationDisconnect": "Ontkoppelen",
|
||||
"integrationDisconnectTitle": "{provider} ontkoppelen van {name}?",
|
||||
"integrationDisconnectBody": "Er komen geen nieuwe gegevens meer binnen. Wat al geïmporteerd is, blijft in het dossier van {name}.",
|
||||
"integrationNoClientApp": "Noch {name} noch je eigen account heeft al een {provider}-app. Stel er eerst een in bij je eigen integraties.",
|
||||
"integrationConnectFailed": "Koppelen met {provider} kon niet starten."
|
||||
},
|
||||
"sections": {
|
||||
"account": {
|
||||
|
||||
+9
-2
@@ -5406,8 +5406,15 @@
|
||||
"unavailableTitle": "Niedostępne w tym udostępnionym rekordzie",
|
||||
"unavailableDescription": "Ten obszar Ustawień jest celowo niedostępny podczas przeglądania rekordu innej osoby.",
|
||||
"integrationStatusDescription": "Stan połączenia dla tego zarządzanego rekordu.",
|
||||
"integrationStatusDetail": "Profil zarządzany pokazuje połączone usługi tylko jako stan. Opiekunowie nie mogą łączyć, ponownie łączyć, synchronizować ani rozłączać.",
|
||||
"integrationStatusDocs": "Jak działa udostępnianie"
|
||||
"integrationStatusDetail": "Usługi połączone tutaj wysyłają dane do profilu {name}, a nie do Twojego. Jeśli profil nie ma własnej aplikacji u dostawcy, używa Twojej.",
|
||||
"integrationStatusDocs": "Jak działa udostępnianie",
|
||||
"integrationConnectsFor": "Łączy dla: {name}",
|
||||
"integrationConnectFor": "Połącz dla: {name}",
|
||||
"integrationDisconnect": "Rozłącz",
|
||||
"integrationDisconnectTitle": "Rozłączyć {provider} od profilu {name}?",
|
||||
"integrationDisconnectBody": "Nowe dane przestaną napływać. Wszystko, co już zaimportowano, zostaje w profilu {name}.",
|
||||
"integrationNoClientApp": "Ani {name}, ani Twoje konto nie ma jeszcze aplikacji {provider}. Najpierw skonfiguruj ją we własnych integracjach.",
|
||||
"integrationConnectFailed": "Nie udało się rozpocząć łączenia z {provider}."
|
||||
},
|
||||
"sections": {
|
||||
"account": {
|
||||
|
||||
Reference in new issue
Block a user