Şema tipi direktiflerle çalışma
Gato GraphQL, şemayı geliştirmek için kod kullanan code-first bir sunucudur. (Alternatif, önce şemayı oluşturmak için Şema Tanım Dili'ni kullanan ve ardından servisi geliştiren SDL-first yaklaşımıdır).
SDL'ye sahip olmadığından, code-first sunucular şema tipi direktifleri doğal olarak destekleyemez. Bu sınırlamayı aşmak için Gato GraphQL şu mekanizmayı geliştirmiştir:
- Queries'i talep edilenden çalıştırılabilire dönüştürme
- Çalıştırılabilir queries'e IFTTT kuralları uygulama
Bu, GraphQL sunucusunda şema tipi direktifler için tam destek sağlamaktadır.
Neden çalışır?
@deprecated, bir şema tipi direktifidir, dolayısıyla şemaya uygulanmalıdır. Ancak, bir an için bunun bir query tipi direktif olduğunu varsayarsak ve @deprecated'i doğrudan query içinde bir alana eklersek ne olur?
Örneğin, şu query çalıştırıldığında:
query {
posts {
id
title
content @deprecated(reason: "Use newContent instead")
}
}Bu da işe yarayabilir! Çünkü sonuçta bir direktif, alan üzerinde çalıştırılacak bir işlevsellikten ibarettir; bu işlevselliği şema aracılığıyla ya da doğrudan query içinde tanımlamak, işlevselliğin farklı davranmasına yol açmaz.
Şimdi, bu işe yarasa da hiçbir mantığı yoktur. İstemcilerimizi queries'lerine @deprecated eklemeye zorlayamayız. Bu, istemci tarafında değil, uygulama tarafından sunucu tarafında karar verilen bir işlevseliktir.
Ancak işlevselliğin kendisi yine de çalışmaktadır. Dolayısıyla, direktifin şemaya mı yoksa queries'e mi eklendiği işlevsel açıdan önem taşımaz. Üstelik her direktif, çalıştırıldığı yer olan query içinde eninde sonunda var olacaktır.
Bu nedenle, sunucunun bir SDL'si olmasa bile direktifi çalışma zamanında query içine gömebilir.