Lektion 20: Benutzerdaten aus verschiedenen Quellen kombinieren
In der vorherigen Tutorial-Lektion haben wir gelernt, dass wir Benutzerdaten aus der REST API von Mailchimp abrufen und mit auf unserer Website gespeicherten Benutzerdaten kombinieren koennen.
Wir koennen diese Idee verallgemeinern, sie auf beliebige zwei Datenquellen anwenden, deren Datensaetze zu einem zusammenfuehren und anschliessend eine Operation mit den kombinierten Daten ausfuehren.
Datensaetze aus verschiedenen Quellen kombinieren
Das Funktionsfeld _arrayInnerJoinJSONObjectProperties (bereitgestellt durch die PHP Functions Via Schema-Erweiterung) erlaubt es uns, JSON-Objekte, die auf dieselbe Entitaet verweisen, in einem einzigen JSON-Objekt zusammenzufuehren, das alle Eigenschaften enthaelt.
Die JSON-Objekte in beiden Quellen koennen als Verweise auf dieselbe Entitaet erkannt werden, weil ihre "Index"-Eigenschaft denselben Wert hat.
In dieser GraphQL-Query erhalten die Eingaben source und target Listen von JSON-Objekten, die eine gemeinsame Eigenschaft email teilen (die daher als "Index" verwendet wird):
query {
_arrayInnerJoinJSONObjectProperties(
source: [
{
email: "abracadabra@ganga.com",
lang: "de"
},
{
email: "longon@caramanon.com",
lang: "es"
},
{
email: "rancotanto@parabara.com",
lang: "en"
},
{
email: "quezarapadon@quebrulacha.net",
lang: "fr"
},
{
email: "test@test.com",
lang: "de"
},
{
email: "emilanga@pedrola.com",
lang: "fr"
}
],
target: [
{
email: "quezarapadon@quebrulacha.net",
name: "Abrigail Ataluncha"
},
{
email: "abracadabra@ganga.com",
name: "Chip Bennett"
},
{
email: "contributor@test.com",
name: "Contributor"
},
{
email: "longon@caramanon.com",
name: "Emil Uzelac"
},
{
email: "rancotanto@parabara.com",
name: "Lance Ampsrong"
},
{
email: "leo@getpop.org",
name: "leo"
},
{
email: "test@test.com",
name: "Test"
},
{
email: "emilanga@pedrola.com",
name: "Theme Demos"
}
],
index: "email"
)
}Wenn der Wert der Eigenschaft email in den JSON-Quell- und Zielobjekten gleich ist, werden diese Objekte in der resultierenden Liste zusammengefuehrt:
{
"data": {
"_arrayInnerJoinJSONObjectProperties": [
{
"email": "quezarapadon@quebrulacha.net",
"name": "Abrigail Ataluncha",
"lang": "fr"
},
{
"email": "abracadabra@ganga.com",
"name": "Chip Bennett",
"lang": "de"
},
{
"email": "contributor@test.com",
"name": "Contributor"
},
{
"email": "longon@caramanon.com",
"name": "Emil Uzelac",
"lang": "es"
},
{
"email": "rancotanto@parabara.com",
"name": "Lance Ampsrong",
"lang": "en"
},
{
"email": "leo@getpop.org",
"name": "leo"
},
{
"email": "test@test.com",
"name": "Test",
"lang": "de"
},
{
"email": "emilanga@pedrola.com",
"name": "Theme Demos",
"lang": "fr"
}
]
}
}Wir koennen Daten abrufen, die in mehreren Cloud-Diensten gespeichert sind (zugaenglich ueber die APIs dieser Dienste), und diese unterschiedlichen Datensaetze zu einem zusammenfuehren.
Waehle zum Beispiel zwei dieser Dienste aus, die Benutzerdaten speichern koennten:
- Mailchimp
- Dropbox
- GitHub
- Microsoft Teams
- Slack
- Trello
- Google Drive
- Deine WordPress-Website
- Die internen Anwendungen deines Unternehmens
- usw.
Die folgende GraphQL-Query kombiniert die Datensaetze aus zwei hypothetischen Diensten:
- Ein Newsletter-System (das Abonnentendaten speichert, einschliesslich E-Mail und gesprochener Sprache)
- Ein CRM (das Kundendaten speichert, einschliesslich Name und E-Mail)
Zuerst werden alle Eintraege aus dem Newsletter-Dienst abgerufen und die E-Mail-Adressen extrahiert. Dann werden diese E-Mail-Adressen verwendet, um die Endpunkt-URL der REST API des CRM zu generieren, um nur Daten fuer diese Benutzer abzurufen. Schliesslich werden beide Datensaetze rund um die gemeinsame Eigenschaft email zu einem zusammengefuehrt:
query ProvideNewsletterUserData {
userList: _sendJSONObjectCollectionHTTPRequest(
input: {
url: "https://newapi.getpop.org/wp-json/newsletter/v1/subscriptions"
}
)
@export(as: "userList")
userEmails: _echo(value: $__userList)
@underEachArrayItem(passValueOnwardsAs: "userListItemForEmail")
@applyField(
name: "_objectProperty",
arguments: {
object: $userListItemForEmail,
by: {
key: "email"
}
},
setResultInResponse: true
)
@export(as: "userEmails")
}
query CombineUserDataFromDisparateSources
@depends(on: "ProvideNewsletterUserData")
{
joinedUserEmails: _arrayJoin(
array: $userEmails,
separator: "&emails[]="
)
userEndpoint: _strAppend(
after: "https://newapi.getpop.org/users/api/rest/?query={name%20email}&emails[]=",
append: $__joinedUserEmails
)
userEndpointDataItems: _sendJSONObjectCollectionHTTPRequest(
input: {
url: $__userEndpoint
}
)
userData: _arrayInnerJoinJSONObjectProperties(
source: $__userEndpointDataItems,
target: $userList,
index: "email"
)
@export(as: "userData")
}...mit folgendem Ergebnis:
{
"data": {
"userList": [
{
"email": "abracadabra@ganga.com",
"lang": "de"
},
{
"email": "longon@caramanon.com",
"lang": "es"
},
{
"email": "rancotanto@parabara.com",
"lang": "en"
},
{
"email": "quezarapadon@quebrulacha.net",
"lang": "fr"
},
{
"email": "test@test.com",
"lang": "de"
},
{
"email": "emilanga@pedrola.com",
"lang": "fr"
}
],
"userEmails": [
"abracadabra@ganga.com",
"longon@caramanon.com",
"rancotanto@parabara.com",
"quezarapadon@quebrulacha.net",
"test@test.com",
"emilanga@pedrola.com"
],
"joinedUserEmails": "abracadabra@ganga.com&emails[]=longon@caramanon.com&emails[]=rancotanto@parabara.com&emails[]=quezarapadon@quebrulacha.net&emails[]=test@test.com&emails[]=emilanga@pedrola.com",
"userEndpoint": "https://newapi.getpop.org/users/api/rest/?query={name%20email}&emails[]=abracadabra@ganga.com&emails[]=longon@caramanon.com&emails[]=rancotanto@parabara.com&emails[]=quezarapadon@quebrulacha.net&emails[]=test@test.com&emails[]=emilanga@pedrola.com",
"userEndpointDataItems": [
{
"name": "Abrigail Ataluncha",
"email": "quezarapadon@quebrulacha.net"
},
{
"name": "Chip Bennett",
"email": "abracadabra@ganga.com"
},
{
"name": "Contributor",
"email": "contributor@test.com"
},
{
"name": "Emil Uzelac",
"email": "longon@caramanon.com"
},
{
"name": "Lance Ampsrong",
"email": "rancotanto@parabara.com"
},
{
"name": "leo",
"email": "leo@getpop.org"
},
{
"name": "Test",
"email": "test@test.com"
},
{
"name": "Theme Demos",
"email": "emilanga@pedrola.com"
}
],
"userData": [
{
"email": "abracadabra@ganga.com",
"lang": "de",
"name": "Chip Bennett"
},
{
"email": "longon@caramanon.com",
"lang": "es",
"name": "Emil Uzelac"
},
{
"email": "rancotanto@parabara.com",
"lang": "en",
"name": "Lance Ampsrong"
},
{
"email": "quezarapadon@quebrulacha.net",
"lang": "fr",
"name": "Abrigail Ataluncha"
},
{
"email": "test@test.com",
"lang": "de",
"name": "Test"
},
{
"email": "emilanga@pedrola.com",
"lang": "fr",
"name": "Theme Demos"
}
]
}
}