Skip to content

Instantly share code, notes, and snippets.

@rmosolgo
rmosolgo / lookahead_example.rb
Created July 3, 2024 14:23
GraphQL-Ruby lookahead to plan sql queries by alias
require "bundler/inline"
gemfile do
gem "graphql", "2.3.7"
gem "sqlite3", "~>1.4"
gem "activerecord", require: "active_record"
end
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Schema.define do
@rmosolgo
rmosolgo / lookahead_active_record_sql_example.rb
Created July 3, 2024 13:15
Only query for selected columns with ActiveRecord and GraphQL
require "bundler/inline"
gemfile do
gem "graphql", "2.3.7"
gem "sqlite3", "~>1.4"
gem "activerecord", require: "active_record"
end
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Schema.define do
@rmosolgo
rmosolgo / empty_list.rb
Created May 27, 2024 13:48
Optional list investigation
require "bundler/inline"
gemfile do
gem "racc"
# gem "graphql", "2.0.16"
gem "graphql", "2.2.3"
end
class MySchema < GraphQL::Schema
class Query < GraphQL::Schema::Object
@rmosolgo
rmosolgo / can_can_graphql.rb
Created May 22, 2024 21:22
GraphQL-Pro CanCan integration example
require "bundler/inline"
gemfile do
gem "graphql", "2.3.4"
gem "graphql-pro", "1.27.5"
gem "cancancan", "3.5.0"
end
class Ability
include CanCan::Ability
@rmosolgo
rmosolgo / defer_example.rb
Last active May 16, 2024 21:01
GraphQL-Pro `@defer` on Fragments when context flag is present
require "bundler/inline"
gemfile do
gem "graphql", "~>2.2.0"
# or: gem "graphql", "~>1.13.0"
gem "graphql-batch", "0.6.0"
gem "graphql-pro", "~>1.27.0"
end
class Schema < GraphQL::Schema
# This module will add a method
# to clean up empty topics:
module RemoveEmptyTopicsStorageExtension
def remove_empty_topics
all_topics, _topics_count = topics(limit: nil, offset: nil)
topics_to_remove = all_topics.select { |t| t.subscriptions_count == 0 }
if topics_to_remove.any?
topic_names = topics_to_remove.map(&:name)
fingerprint_key = topic_names.map { |t| fingerprints_key(t) }
with_redis do |r|
@rmosolgo
rmosolgo / broadcast_debug.rb
Created April 18, 2024 18:44
A query analyzer for debugging the broadcastability of GraphQL-Ruby subscriptions
require "bundler/inline"
gemfile do
gem "graphql", path: "./" # "2.3.0"
end
class MySchema < GraphQL::Schema
class SubThing < GraphQL::Schema::Object
field :name, String, broadcastable: true
field :viewer_can_edit, Boolean # not broadcastable
@rmosolgo
rmosolgo / nodes_auth.rb
Created March 15, 2024 20:35
Removing items from `nodes` after it has been paginated
# In this approach `nodes` are removed from a connection _after_ pagination has been applied.
#
# This approach has some downsides:
# - It may leak data about unauthorized nodes. hasNextPage and hasPrevPage will
# indicate that items were removed from the list; depending on sort and filter options,
# a client could learn about the attributes of the removed nodes.
# - pagination metadata may be wrong, since the list of nodes was modified after it was calculated.
# (some pagination info may be calculated _while_ the list of nodes is prepared.)
#
# The best alternative approach is to use `scope_items` instead, but I share this
require "bundler/inline"
gemfile do
gem "graphql", "1.12.17"
# gem "graphql", "1.12.18"
end
class MySchema < GraphQL::Schema
class Model < GraphQL::Schema::Object
field :name, String, null: false
@rmosolgo
rmosolgo / custom_client_mutation_id.rb
Last active February 7, 2024 17:01
Custom clientMutationId directives in GraphQL-Ruby
require "bundler/inline"
gemfile do
gem "graphql", "2.2.6"
end
class MySchema < GraphQL::Schema
class Undocumented < GraphQL::Schema::Directive
locations(FIELD_DEFINITION, INPUT_FIELD_DEFINITION)
description "This should be removed our generated docs"