Lekcja 20: Łączenie danych użytkownika z różnych źródeł
W poprzedniej lekcji samouczka dowiedzieliśmy się, że możemy pobierać dane użytkowników z API REST Mailchimp i łączyć je z danymi użytkowników przechowywanymi w naszej witrynie.
Możemy uogólnić ten pomysł, stosując go do dowolnych dwóch źródeł danych, łącząc ich zestawy danych w jeden, a następnie wykonując jakąś operację na połączonych danych.
Łączenie zestawów danych z różnych źródeł
Pole funkcji _arrayInnerJoinJSONObjectProperties (dostarczane przez rozszerzenie PHP Functions Via Schema) pozwala nam łączyć obiekty JSON odwołujące się do tej samej encji w jeden obiekt JSON zawierający wszystkie właściwości.
Obiekty JSON w obu źródłach można zidentyfikować jako odwołujące się do tej samej encji, ponieważ ich właściwość "indeks" ma tę samą wartość.
W tym zapytaniu GraphQL, dane wejściowe source i target otrzymują listy obiektów JSON, które mają wspólną właściwość email (używaną jako "indeks"):
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"
)
}Gdy wartość właściwości email jest taka sama w obiektach JSON źródłowym i docelowym, te obiekty są łączone na wynikowej liście:
{
"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"
}
]
}
}Możemy pobierać dane przechowywane w wielu usługach chmurowych (dostępnych za pośrednictwem API tych usług) i łączyć te różnorodne zestawy danych w jeden.
Na przykład, wybierz dowolne dwie z tych usług, które mogą przechowywać dane użytkowników:
- Mailchimp
- Dropbox
- GitHub
- Microsoft Teams
- Slack
- Trello
- Google Drive
- Twoja witryna WordPress
- Wewnętrzne aplikacje Twojej firmy
- itp.
Poniższe zapytanie GraphQL łączy zestawy danych z dwóch hipotetycznych usług:
- System newslettera (przechowujący dane subskrybentów, w tym adres e-mail i język)
- CRM (przechowujący dane klientów, w tym imię i adres e-mail)
Najpierw pobiera wszystkie rekordy z usługi newslettera i wyodrębnia adresy e-mail. Następnie używa tych adresów e-mail do wygenerowania adresu URL punktu końcowego API REST CRM, aby pobrać dane tylko dla tych użytkowników. Na koniec łączy oba zestawy danych w jeden, wokół wspólnej właściwości email:
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")
}...co daje:
{
"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"
}
]
}
}