{"id":16428532,"url":"https://github.com/buraksenyurt/graphql-challenge","last_synced_at":"2025-09-13T08:32:33.512Z","repository":{"id":166875231,"uuid":"642261129","full_name":"buraksenyurt/graphql-challenge","owner":"buraksenyurt","description":"Senaryomuzda birden fazla veri kaynağını kullanıma sunan bir graphQL servisinin .Net 7 platformunda geliştirilmesi söz konusu.","archived":false,"fork":false,"pushed_at":"2025-01-28T13:36:09.000Z","size":759,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-09-08T16:25:06.099Z","etag":null,"topics":["challenge","csharp","dotnet","entity-framework-core","graphql","postgresql"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/buraksenyurt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-05-18T07:09:25.000Z","updated_at":"2025-01-28T13:36:13.000Z","dependencies_parsed_at":null,"dependency_job_id":"d2bf7d70-9ca9-494e-8a9c-aaabdac7f76a","html_url":"https://github.com/buraksenyurt/graphql-challenge","commit_stats":null,"previous_names":["buraksenyurt/graphql-challenge"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/buraksenyurt/graphql-challenge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Fgraphql-challenge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Fgraphql-challenge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Fgraphql-challenge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Fgraphql-challenge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/buraksenyurt","download_url":"https://codeload.github.com/buraksenyurt/graphql-challenge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Fgraphql-challenge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274938398,"owners_count":25377530,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-13T02:00:10.085Z","response_time":70,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["challenge","csharp","dotnet","entity-framework-core","graphql","postgresql"],"created_at":"2024-10-11T08:17:22.923Z","updated_at":"2025-09-13T08:32:33.482Z","avatar_url":"https://github.com/buraksenyurt.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GraphQL Challenge\n\nUygulamanın senaryosu şöyle...Bir e-ticaret platformunun servislerinden birisini geliştiriyoruz. Arzu edilen fonksiyonelliklerden birisi, müşterinin baktığı ürüne ait bilgiler haricinde, kullanıcı yorumlarını ve görsellerini de döndürebilmek. Bu veri setini istemci uygulamanın (kuvvetle muhtemel önyüz tarafı) istediği şekilde sorgulayabilmesini istiyoruz. Yani birden fazla resource'u esnek bir şekilde sorgulayabileceğimiz imkanlarımız olsun derdindeyiz. Ürün bilgisinin içeren ana parça Entity Framework odaklı bir veri kaynağı olabilir. Kuvvetle muhtemel Postgresql iyi bir çözüm gibi duruyor. Diğer yandan yorumlar başka bir servisten gelecek. Ayrıca ürün görselleri de fiziki diskten okuma yapan (CDN gibi bölge de olabilir) bir enstrüman üstünden geliyor olabilir ya da minik thumnail görüntüleri olduğunu düşünerek Redis cache sisteminden çekebilirim.\n\n## Ön Hazırlıklar\n\n```bash\n# Postgresql tarafı için docker imajı kullanılabilir\nsudo docker run --name postgresql -e POSTGRES_USER=scoth -e POSTGRES_PASSWORD=tiger -p 5432:5432 -v /data:/var/lib/postgresql/data -d postgres\n\n# Migration için EF tool'a ihtiyacımız olacaktır\ndotnet tool install -g dotnet-ef\n\n# Migration planı oluşturup çalıştırmak için\ndotnet ef migrations add InitialCreate\ndotnet ef database update\n\n# Redis Cache tarafı için Docker imajını kullanabiliriz\nsudo docker run --name redis-on-moon -dp 6378:6379 redis\n\n# Redis'in çalıştığından emin olmak için şöyle ilerlenebilir\nsudo docker exec -it redis-on-moon /bin/bash\nredis-cli\nping\n```\n\n![images/runtime_02.png](images/runtime_02.png)\n\n## Örnek Sorgu\n\nGraphQL tarafında aşağıdakine benzer bir sorguyu işletebilmek düşüncesindeyiz.\n\n```graphql\nquery Query {\n  productInfo(productId: 1) {\n    name\n    unitPrice\n    categoryName\n    photos{\n      name,\n      base64Content\n    }\n    comments {\n      star\n      content\n      date\n    }\n  }\n}\n```\n\nİlk sonuçlar fena değil.\n\n![images/runtime_01.png](images/runtime_01.png)\n\n## Notlar\n\nUtilityApp isimli uygulama Redis tarafına minik ürün görsellerini nasıl atabileceğimizi test etmek için kullanılmakta. Redis'den çok sık değişmeyeceğini düşündüğümüz ürün görsellerini alabiliriz. Kobay fotoğrafları dağıtık bir cache sisteminden çekmek oldukça mantıklı gibi. Hem Console hem de GraphQL servisi, Redis için NRedisStack isimli Nuget paketini kullanmakta.\n\n```bash\ndotnet add package NRedisStack\n```\n\nConsole uygulaması ile assets klasöründeki kobay 4 fotoğraf redis'e yüklenebiliyor.\n\n![images/runtime_03.png](images/runtime_03.png)\n\n## Nasıl Çalıştırırız?\n\n- Öncelikle Postgresql ve Redis container'larının ayakta olduğundan emin olmalıyız.\n- Diğer yandan ilk önce CommentService çalıştırılmalıdır.\n- Ardından ProductService çalışıtırılır.\n- Cache'duran ürün görselleri zaman içinde silinmiş olabilir. Bunları \"key yoksa ekle\" şeklinde ProductService tarafında da ele alabiliriz ancak amaç var olan dağıtık cache kaynaklarından gelmesini denemektir. Bu nedenle belki UtilityApp'ı bir kere çalıştırmak gerekebilir.\n\n```bash\n# Postgresql'i başlat\nsudo docker start [container_no]\n\n# Redis'i başlat\nsudo docker start [container_no]\n\n# Belki UtilitApp'ı bir kere çalıştırmak gerekebilir\ndotnet run\n\n# CommentService'i çalıştır\ndotnet run\n\n# ProductService'i çalıştır\ndotnet run\n```\n\nNihayetinden aşağıdakine benzer şekilde bir çıktı elde edebilmeliyiz.\n\n![images/runtime_04.png](images/runtime_04.png)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fburaksenyurt%2Fgraphql-challenge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fburaksenyurt%2Fgraphql-challenge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fburaksenyurt%2Fgraphql-challenge/lists"}