GraphQL ve Prisma ile REST API — Part 3

Mucahid Yazar
3 min readJan 15, 2021

RELATION & CUSTOM RESOLVERS (parent)

GraphQL’de datalar arasında ki relation’u Custom resolvers’lar ile sağlarız. Tabi burada işin içine Prisma ve farklı servislesle birlikte kullanımlar girince değişebilir ama şuan ki yapımız da Realation kurmak için bu yöntemi izleyeceğiz. Ve bir önce ki yazımda dediğim gibi parent argumentini burada kullanacağız ve sizde parent’ın nasıl kullanıldığına dair daha iyi bir fikire sahip olmuş olacaksınız.

Ne yapacağız?

Tüm postsları almak istediğimizde artık sadece belirli bir user’a ait tüm postsları alacağız veya filtreleyeceğiz. Bunu istersek direk posts querysi içinde postlarda olan author kısmındaki idyi kullanarak yapabiliriz. Ama bunun yerine GraphQL için daha uygun olan Custom resolverslar oluşturarak GraphQL servisimize dahil edeceğiz ve içinde resolverın hangi sorgulamada ne yapacağınız söyleyeceğiz ve kalan herşeyi GraphQL servisi bizim için gerçekleştirecek.

resolvers klasörü içinde User.js adında bir dosya açıyoruz ve aşağıda ki kodları yazdıktan sonra export ediyoruz.

Burada GraphQL query sorgularında users query sini çalıştırdığımızda bize users içinde o user’a air postlarıda dönüyor olacaktır artık. Ve user içindeki posts’ları sorgularken User’a aıt bu yazdığımız custom Resolver’ı görecek ve içine girip posts larla alakalı bir query varmı ona bakacaktır. Ve burada posts keyini görünce içine girip içeride istenilen şeyi gerçekleştirecektir. Ve burada parent, hangi user sorgulandığında GraphQL servisi buraya giriyorsa, parent o user’ın kendisi olacaktır. O yüzden parent.id diyerek aslında user’ın id sini alıyoruz. Biraz karışık olduğu için daha detaylı bir örnek verecek olursam, diyelim ki mucahidyazar adlı username’e sahıp user’ı query’de user’ı kullanarak sorguluyoruz. GraphQL User’larla ilgili her işlem yaptığında bu custom resolverin içine giriyor. Ve bu custom resolverın içine her girdiğinde parent mucahidyazar oluyor.

Tabi Custom resolver’ın daha çalışması için bunu index.js içinde import edip aşağıda ki gibi resolvers olarak eklememiz gerekiyor. Hatta eklemeden önce sizde benim gibi içi boş da olsa Comment.js ve Post.js adında da 2 tane daha custom resolver oluşturun ve bu şekilde benim gibi aşağıdaki gibi import edip ekleyin.

Ve artık aşağıda ki gibi herhangi bir user ile ilgili sorgu yaptığımızda, ve bu sorguda posts’ları istiyorsak eğer, GraphQL User resolverına girip o user için oradaki gerekli postslarla alakalı bir işlem varmı bakacak ve bize sonuçları o şekilde dönecektir.

SUBSCRIPTION

GraphQL’deki anlaması en güç konulardan bir diğeridir aslında. Fakat mantık olarak WebSocket’ler gibi olduklarını söyleyebiliriz. GraphQL bizim için belirli bir sorguyu izler watch eder ve değişiklik gördüğünde bizim belirlediğimiz şeyleri return eder bize.

İlk önce subscription yapımızı index.js içerisinde de oluşturalım. Bunun için PubSub’ı import ediyoruz graphql-yoga paketinden. daha önce dediğim gibi graphql-yoga paketi bizim için bir çok işi çok daha kolay hale getirir subscription işlemleride bunlardan birisidir.

daha sonra pubsub adında bir değişken oluşturup import ettiğimiz bu PubSub ile new PubSub oluşturuyoruz.

ve index.js içinde en son olarak da aşağıdaki gibi GraphQLServer içinde context’e bu pubsub’ı gönderiyoruz. Subscription.js içinde buna erişebilmek için.

Ve son olarak bütün index.js dosyamızın içerisi böyle oluyor GraphQL serimizde.

Ve schema.graphql dosyamizda asagidaki gibi type Subscription ‘i olusturuyoruz.Ve bunun icinde de kullanmak icin bir geri donen subscription item i olusturuyoruz count gibi. İstersek buradaki count() icinde argumentde kullanabiliriz ama burada gerekmiyor.

daha sonra resolvers içinde daha önce oluşturduğumuz Subscription.js dosyasına gelip aşağıdakileri ekliyoruz içine count subscriptionu için.

Burada adım adım ne ne için anlatmaya çalıştım kod satırı içinde siz silebilirsiniz isterseniz.

Ve şimdi graphql playgroundumuzu açıp aşağıda ki gibi bir subscription sorgusu yaptığımızda saniyede bir artan countu saniyelik olarak takip ettiğimiz bir subscription oluşturmuş olacağız.

Subscriptionların hava kalmasını istemiyorum. Gelin bir başka örnek yapalım ve bu daha bir gerçek hayat projelerine uygun bir örnek olsun. Peki ne yapıyoruz. Oluşturulan silinen ve güncellenen her postu dinlediğimiz bir subscription oluşturalım.

Ilk once tekrardan schema.graphql’e aşağıdakileri ekliyoruz.

Enum

Yukarıda farkedeceğiniz üzere enum oluşturup MutationType yaptık bu enumun adını. Ve dinleyeceğimiz post subscriptionunun bu enumu atadığımız PostSubscriptionPayload döneceğini söyledik. enumu ise bunun içerisindeki mutation için atadık. Yani dönecek PostSubscriptionPayload ın mutation’u bu enumun içerisindeki 3 değerden birisinin string halinde dönmesi gerektiğini söyler. Bu 3 değer harici hiçbirşeyi dönderemeyiz PostSubscriptionPayload içindeki mutation için. (Kısa bir bilgi enumlar arka tarafta çalışırken ilk sıradaki CREATED aslında 1 olarak bilinerek hafızada tutulur. Konumuzun dışına çıkmaya gerek yok şuan çok önemli değil bizim için.)

Post için subscriptionumuzu schema.graphql içinde oluşturduğumuza göre gelelim Subscription resolverı içinde yapmamız gereken işleme. Aşağıdaki gibi resolversdaki Subscription.js içine gelip post adında subscriptionumuzu oluşturuyoruz. ve contextden aldığımız pubsub ile asyncIterator metodunu çalıştırıp post adında bir kanal oluşturuyoruz. Artık tek yapmamız gereken mutationlarımızda postlarımızı CREATE UPDATE ve DELETE yaptığımız yerlerde bu kanallara bağlanıp PostSubscriptionPayload typeında bir değer dönmek.

Öncelikle ben CREATED işlemini ayrıntılı olarak açıklayacağım UPDATED ve DELETED’de aynı mantıkla olacağı için onları açıklamayacağım. Kaynak kodlarını paylaşacağım repoda bularak onlarıda inceleyebilirsiniz.

Eğer oluşturulan post publish edilmiş ise context’den gelen pubsub u kullanarak oluşturdugumuz kanala bağlanıyoruz ve subscripitionda döneceğimiz type da değimizi dönüyoruz örnekte ki gibi.

Ve evet GraphQL serimizin burada sonuna gelmiş bulunmaktayız. Genel olarak en önemli gördüğüm özellikleri burada size anlatmaya çalıştım. Umarım sizler için güzel bir bilgi kaynağı ve hafıza tazeleme olmuştur. Bundan sonra ki kısımda oluşturduğumuz bu yapıyı Prisma ile bağlama kısmına değinmek istiyorum. Sizler bu yapıyı daha fazla geliştirerek daha fazla pratik yapabilirsiniz ki bunu tavsiye ederim. Prisma kısmı ile biraz daha karmaşık bir yapıya dönüşüyor aslında. Ve şimdiler de Prisma 2 de çıkmış durumda bizim kuracağımız GraphQL yapısı Prisma 1 ile olacak. Ama sizler tabiki Prisma ile bunu yapmak zorunda değilsinizde isterseniz bu örnekte gönderdiğimiz db yerinden mongo db bağlantınızı göndererek GraphQL ve MongoDB yide bir birine bağlayabilir Authentication ve CRUD işlemlerinizi rahatlıkla yapabilirsiniz. Bir sonra ki yazımda görüşmek üzere hoşçakalın ve sağlıkla kalın diliyorum.

--

--