Mucahid Yazar
mucahid.dev

Follow

mucahid.dev

Follow
GraphQL ve Prisma ile REST API — Part 2

GraphQL ve Prisma ile REST API — Part 2

Mucahid Yazar's photo
Mucahid Yazar
·Jan 11, 2021·

4 min read

QUERY

Bir önceki yazımda GraphQL servisimizi ayağa kaldırmıştık. Şimdi de mock datalarımızın olduğu bir db.js oluşturup bu db.js üzerinden GraphQL işlemlerimizi gerçekleştirelim. Bunun için root dizinindeki src klasörüne db.js oluşturup içine aşağıdaki users, posts, ve comments objelerini ekleyip export ediyoruz.

Yukarıda oluşturduğumuz bu mock datamızı index.js’e import edip daha sonra bunu GraphQLServer’ımıza context olarak tanıtıyoruz aşağıda ki gibi ve bundan sonra bu mock databasemize Query ve Mutationlarımızdan ulaşabileceğiz.

2. satırda import ettiğimiz databasemizi 14. satırda tanımladığımız context içine veriyoruz.

Ve şimdi Bu dataları kullanabilmek için User Post ve Comment için 3 tane type belirleyelim schema.graphql içinde.

Yukarıda User type’ında id, email, username, alanlarını Scalar type olarak belirleyip zorunlu olsun demişiz, age, firstName, lastName ise olabilirde olmayabilirde demişiz. Yani eğer bir user oluşturacak olursak id, email, username vermeden oluşturamayacağımız anlamına geliyor.

Şimdi gelin sizlerle ilk gerçek Query mizi oluşturalım. Querylerde REST API’daki GET işlemlerini yapıyoruz diyebiliriz. Yani GraphQL ile sorgulama yaparken Query işlemlerini yapacağız.

Aşağıda ilk olarak tüm postslarımızı çektiğimiz veya eğer argument vererek belirli postslarımızı çekeceğimiz Query tanımlarımızı yapalım.

schema.graphql içine aşağıdaki query mizi tanımlayalım.

Bu Query ile posts querysi için schema.graphql içinde tanımladığımız Post type ında post objelerine sahip bir array return edeceğimizi söylemişiz. Ve bu kesinlikle Array olmalı ve içindeki elemanlarının hepside Post type ında bir obje olmalı diye ! işareti ile belirtmişiz.

Daha sonra resolver kalsörümüzdeki Query.js dosyasına gelip aşağıda ki gibi context’te gönderdiğimiz db.js mock databasemizden tüm postları return edelim.

Ve index.js de GraphQLServer’da context’e eklediğimiz db’ye bu şekilde erişiyoruz.

Query, Mutation ve Subscription’larımız function olarak tanımlanır ve içlerinde 4 tane argument taşırlar. Bunlar parent, args, ctx ve info’dur.

args’lar Query ve Mutationlar sorgularında gönderdiğimiz argumentleri taşırlar. Örneklerini birazdan göreceğiz.

ctx ise index.js içinde context objesinin içine tanımladığımız değerleri bize döner.

info’da ise dönecek değerler üzerine belirlemeler yaparız.

parent ise bence bu aralarında olan en karışığıdır uygulama üzerinde göstermek istiyorum.

npm run dev yaparak GraphQL serverımızı çalıştırıyoruz ve localhost:3000 veya siz hangi porttan çalıştırıyorsanız orada ki playground’a giderek aşağıdaki gibi query sorgumuzu yaparak tüm posts’larımızı alabiliyoruz artık.

Şimdi argsları kullanmayı göreceğiz bunun için şu örneği yapacağız. Tüm postsları yukarıdaki gibi isteyebiliriz şimdi ise tüm post ları belirleyeceğimiz bir query title veya bodyde geçiyorsa filtrelesin ve sadece o query title ve bodyde varsa bize dönsün veya publish edilip edilmediğine göre dönsün filtrelemesini yapsın isteyelim.

artık posts querylerini

Ve daha sonra Query.js e gidip query sorgumuzu aşağıdaki gibi daha karmaşık hale getirelim. :)

args’lara yukarıdaki gibi ulaşıyoruz. Peki nasıl gönderiyorsunuz diye merak ediyorsanız aşağıdaki Playgrounddan gönderdiğim örneğe bakabilirsiniz. Aşağıdaki gibi gönderdiğim query içindeki argumentlere Query.js içinde yukarıdaki örnekteki gibi ulaşıyorsunuz.

Yukarıda posts’larımızın title ve bodysinde aranması üzere query olarak “post” kelimesini göndermişiz yani title ve bodysinde post kelimesi geçen, published’ı true olan bu her iki özelliği taşıyan tüm postlar sadece return olsun demişiz.

MUTATIONS

Mutationlar ise REST API’daki POST methodları olarak düşünebilirsiniz. Birşey oluşturmak silmek veya güncellemek istediğimizde GraphQL’de bunun için Mutationları kullanırız. Gelin ilk mutationumuzu oluşturalım.

Hatırlarsanız User type’ında 3 tane nullable yani zorunlu alan belirlemiştik bunlar id, name ve email idi. Yani eğer bir user oluşturmak istiyorsak bu 3 ünü kesinlikle vermeliyiz.

Oluşturacağımzı user’ın bilgilerini mutationumuza argument olarak gönderelim. Hatta gelin bu vesileyle Inputları öğrenelim.

Input

Inputlar GraphQL’de başlarında input yazarak tanımlanırlar ve içlerine sadece Scalar type alacak değerler tanımlanır. Yani oluşturduğumuz User Post veya Comment Custom typelarını bunların içerisinde kullanamayız. Zaten bu şekilde kullanmak istiyorsanız Type kullanmalısınız.

Şimdi createUser’a biz data adında bir argument gönderelim ve bu data argumenti bizim oluşturacağımız adı CreateUserInput olan input’a göre tanımlar içersin istiyoruz. Onun için schema.graphql’e gelip aşağıdaki input’u tanımlıyoruz.

daha sonra schema.graphql içindeki type Mutation içine gelip aşağıdaki gibi createUser mutationunu tanımlıyoruz.

Burada createUser mutationu içine argument olarak data alsın demişiz ve bu data CreateUserInput özelliklerinde olsun diye belirlemişiz ve son olarakda bize User type ında bir obje dönsün istemişiz.

Ve şimdi son olarak resolvers daki Mutation.js e gidip createUser mutationunu tanımlamamız gerekiyor.

İlk aşama olarak args’a gönderdiğimiz data içinden user olusturmak için gerekli alanları const olarak alıyoruz yukarıdaki gibi. Daha sonra gelen email bilgisi ile databasemizdeki userlardan hiç bu emaile sahip birisi varmı diye sorgulatıyoruz ve eğer varsa hata fırlatıyoruz çünkü emaillerimiz unique olmalı. Daha sonra newUser değişkeni tanımlayıp uuidv4 kütüphanesi ile random bir id oluşturuyorum ve datadan gelen diğer datalarıda burada kullanıyorum ve bu newUser’ı context’den aldığım db.users içine push ediyorum.

Ve şimdi GraphQL playgroundumuza giderek aşağıda ki gibi kullanarak bir createUser mutationumuzu kullanabiliriz.

Ve artık users query’si ile yeni oluşturduğunuz kullanıcı dahil tüm userslarınızı yakalayabilirsiniz.

 
Share this