card-mod-graphql 0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +20 -0
- data/lib/card/mod/graphql.rb +2 -0
- data/lib/graph_q_l/card_schema.rb +36 -0
- data/lib/graph_q_l/loader.rb +7 -0
- data/lib/graph_q_l/mutations/base_mutation.rb +10 -0
- data/lib/graph_q_l/types/base_argument.rb +6 -0
- data/lib/graph_q_l/types/base_connection.rb +9 -0
- data/lib/graph_q_l/types/base_edge.rb +8 -0
- data/lib/graph_q_l/types/base_enum.rb +6 -0
- data/lib/graph_q_l/types/base_field.rb +7 -0
- data/lib/graph_q_l/types/base_input_object.rb +7 -0
- data/lib/graph_q_l/types/base_interface.rb +12 -0
- data/lib/graph_q_l/types/base_object.rb +9 -0
- data/lib/graph_q_l/types/base_scalar.rb +6 -0
- data/lib/graph_q_l/types/base_union.rb +8 -0
- data/lib/graph_q_l/types/card.rb +50 -0
- data/lib/graph_q_l/types/mutation_type.rb +12 -0
- data/lib/graph_q_l/types/node_type.rb +9 -0
- data/lib/graph_q_l/types/query.rb +49 -0
- data/lib/graph_q_l.rb +1 -0
- data/lib/graphql_controller.rb +58 -0
- data/lib/tasks/graphql.rake +3 -0
- metadata +109 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 6671fb819df81906a42cfa6b31f917702c45f2d9c21a8db1856f7038c4789a04
|
4
|
+
data.tar.gz: af0734bd58e72ab4d48e70384ec75ed8f6a01746f91ee3e436f5dcb4d513ef9b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 12425293668d7cb00b2fec6678ea333d8062d111d4894b3fdde37076b41dd696bcf2a9809af996f76551d438041ac1aa1ad5ede3013eb3302829e5450f856e20
|
7
|
+
data.tar.gz: 863b3a60b13f477ee78635e7c83f97919dbb70d8f4ec61d27a3f4926976e2ad0fc0dc409ed7fd1931ed6595fefa2773ae134dacfce1325317f2e2ab4a38abf0c
|
data/README.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
<!--
|
2
|
+
# @title README - mod: graphql
|
3
|
+
-->
|
4
|
+
|
5
|
+
# GraphQL mod (alpha)
|
6
|
+
|
7
|
+
This experimental mod supports simple GraphQL queries of decko sites.
|
8
|
+
|
9
|
+
## Setup
|
10
|
+
|
11
|
+
Once this mod is installed, you will need to add the following to
|
12
|
+
`config/routes.rb`:
|
13
|
+
|
14
|
+
```
|
15
|
+
post "api/graphql", to: "graphql#execute"
|
16
|
+
mount GraphiQL::Rails::Engine, at: "api/graphiql", graphql_path: "graphql"
|
17
|
+
```
|
18
|
+
|
19
|
+
Having done so, you can point your browser to `YOUR_DECK_ROOT/api/graphiql` to
|
20
|
+
get a GraphiQL client with which you can make GraphiQL requests.
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module GraphQL
|
2
|
+
class CardSchema < GraphQL::Schema
|
3
|
+
GraphQL::Loader.load_mod_queries
|
4
|
+
mutation Types::MutationType
|
5
|
+
query Types::Query
|
6
|
+
|
7
|
+
class << self
|
8
|
+
# Union and Interface Resolution
|
9
|
+
def resolve_type abstract_type, obj, ctx
|
10
|
+
# TODO: Implement this function
|
11
|
+
# to return the correct object type for `obj`
|
12
|
+
raise GraphQL::RequiredImplementationMissingError
|
13
|
+
end
|
14
|
+
|
15
|
+
# Relay-style Object Identification:
|
16
|
+
|
17
|
+
# Return a string UUID for `object`
|
18
|
+
def id_from_object object, type_definition, query_ctx
|
19
|
+
# Here's a simple implementation which:
|
20
|
+
# - joins the type name & object.id
|
21
|
+
# - encodes it with base64:
|
22
|
+
# GraphQL::Schema::UniqueWithinType.encode(type_definition.name, object.id)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Given a string UUID, find the object
|
26
|
+
def object_from_id id, query_ctx
|
27
|
+
# For example, to decode the UUIDs generated above:
|
28
|
+
# type_name, item_id = GraphQL::Schema::UniqueWithinType.decode(id)
|
29
|
+
#
|
30
|
+
# Then, based on `type_name` and `id`
|
31
|
+
# find an object in your application
|
32
|
+
# ...
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module GraphQL
|
2
|
+
module Types
|
3
|
+
class Card < BaseObject
|
4
|
+
field :id, Integer, "unique numerical identifier", null: true
|
5
|
+
field :type, Card, "card type", null: false
|
6
|
+
field :name, String, "name that is unique across all cards", null: false
|
7
|
+
field :linkname, String,"url-friendly name variant", null: false
|
8
|
+
field :created_at, Types::ISO8601DateTime, "when created", null: true
|
9
|
+
field :updated_at, Types::ISO8601DateTime, "when last updated", null: true
|
10
|
+
field :creator, Card, "User who created", null: true
|
11
|
+
field :updater, Card, "User who last updated", null: true
|
12
|
+
field :left, Card, "left name", null: true
|
13
|
+
field :right, Card, "right name", null: true
|
14
|
+
field :content, String, "core view of card rendered in text format", null: true
|
15
|
+
|
16
|
+
def type
|
17
|
+
object.type_id.card
|
18
|
+
end
|
19
|
+
|
20
|
+
def linkname
|
21
|
+
object.name.url_key
|
22
|
+
end
|
23
|
+
|
24
|
+
def left
|
25
|
+
object.left_id.card
|
26
|
+
end
|
27
|
+
|
28
|
+
def right
|
29
|
+
object.right_id.card
|
30
|
+
end
|
31
|
+
|
32
|
+
def content
|
33
|
+
object.format(:text).render_core
|
34
|
+
end
|
35
|
+
|
36
|
+
def creator
|
37
|
+
object.creator_id.card
|
38
|
+
end
|
39
|
+
|
40
|
+
def updater
|
41
|
+
object.updater_id.card
|
42
|
+
end
|
43
|
+
|
44
|
+
# support methods (move to module?)
|
45
|
+
def referers type, field
|
46
|
+
::Card.search type: type, limit: 10, right_plus: [field, refer_to: object.card_id]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module GraphQL
|
2
|
+
module Types
|
3
|
+
class Query < BaseObject
|
4
|
+
# Add `node(id: ID!) and `nodes(ids: [ID!]!)`
|
5
|
+
# include Types::Relay::HasNodeField
|
6
|
+
# include Types::Relay::HasNodesField
|
7
|
+
|
8
|
+
# Add root-level fields here.
|
9
|
+
# They will be entry points for queries on your schema.
|
10
|
+
|
11
|
+
field :card, Card, null: true do
|
12
|
+
argument :name, String, required: false
|
13
|
+
argument :id, Integer, required: false
|
14
|
+
end
|
15
|
+
|
16
|
+
field :cards, [Card], null: false do
|
17
|
+
argument :name, String, required: false
|
18
|
+
argument :type, String, required: false
|
19
|
+
end
|
20
|
+
|
21
|
+
def card **mark
|
22
|
+
ok_card nil, **mark
|
23
|
+
end
|
24
|
+
|
25
|
+
def cards name: nil, type: nil, limit: 10, offset: 0
|
26
|
+
card_search name, type, limit, offset
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def ok_card_of_type type_code, **mark
|
32
|
+
card = ok_card(**mark)
|
33
|
+
card if card.type_code == type_code
|
34
|
+
end
|
35
|
+
|
36
|
+
def ok_card type_code, name: nil, id: nil
|
37
|
+
card = ::Card.fetch name || id
|
38
|
+
card if card&.ok?(:read) && (!type_code || card.type_code == type_code)
|
39
|
+
end
|
40
|
+
|
41
|
+
def card_search name, type, limit, offset
|
42
|
+
cql = { limit: limit, offset: offset }
|
43
|
+
cql[:type] = type if type
|
44
|
+
cql[:name] = [:match, name] if name
|
45
|
+
::Card.search cql
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/graph_q_l.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "card/mod/graphql"
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# bypasses card controller, executes graphql queries
|
2
|
+
class GraphqlController < ActionController::Base
|
3
|
+
# If accessing from outside this domain, nullify the session
|
4
|
+
# This allows for outside API access while preventing CSRF attacks,
|
5
|
+
# but you'll have to authenticate your user separately
|
6
|
+
# protect_from_forgery with: :null_session
|
7
|
+
|
8
|
+
def execute
|
9
|
+
variables = prepare_variables params[:variables]
|
10
|
+
query = params[:query]
|
11
|
+
operation_name = params[:operationName]
|
12
|
+
context = {
|
13
|
+
# Query context goes here, for example:
|
14
|
+
# current_user: current_user,
|
15
|
+
}
|
16
|
+
result = GraphQL::CardSchema.execute query,
|
17
|
+
variables: variables,
|
18
|
+
context: context,
|
19
|
+
operation_name: operation_name
|
20
|
+
render json: result
|
21
|
+
rescue StandardError => e
|
22
|
+
raise e unless Rails.env.development?
|
23
|
+
handle_error_in_development e
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
# Handle variables in form data, JSON body, or a blank value
|
29
|
+
def prepare_variables variables_param
|
30
|
+
case variables_param
|
31
|
+
when String
|
32
|
+
prepare_string_variable variables_param
|
33
|
+
when Hash
|
34
|
+
variables_param
|
35
|
+
when ActionController::Parameters
|
36
|
+
variables_param.to_unsafe_hash
|
37
|
+
# GraphQL-Ruby will validate name and type of incoming variables.
|
38
|
+
when nil
|
39
|
+
{}
|
40
|
+
else
|
41
|
+
raise ArgumentError, "Unexpected parameter: #{variables_param}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def prepare_string_variable string
|
46
|
+
return {} unless string.present?
|
47
|
+
|
48
|
+
JSON.parse(string) || {}
|
49
|
+
end
|
50
|
+
|
51
|
+
def handle_error_in_development e
|
52
|
+
logger.error e.message
|
53
|
+
logger.error e.backtrace.join("\n")
|
54
|
+
|
55
|
+
render json: { errors: [{ message: e.message, backtrace: e.backtrace }],
|
56
|
+
data: {} }, status: 500
|
57
|
+
end
|
58
|
+
end
|
metadata
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: card-mod-graphql
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ethan McCutchen
|
8
|
+
- Philipp Kühl
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2021-10-26 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: card
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: graphql
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '1.12'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '1.12'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: graphiql-rails
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '1.7'
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '1.7'
|
56
|
+
description: ''
|
57
|
+
email:
|
58
|
+
- info@decko.org
|
59
|
+
executables: []
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- README.md
|
64
|
+
- lib/card/mod/graphql.rb
|
65
|
+
- lib/graph_q_l.rb
|
66
|
+
- lib/graph_q_l/card_schema.rb
|
67
|
+
- lib/graph_q_l/loader.rb
|
68
|
+
- lib/graph_q_l/mutations/base_mutation.rb
|
69
|
+
- lib/graph_q_l/types/base_argument.rb
|
70
|
+
- lib/graph_q_l/types/base_connection.rb
|
71
|
+
- lib/graph_q_l/types/base_edge.rb
|
72
|
+
- lib/graph_q_l/types/base_enum.rb
|
73
|
+
- lib/graph_q_l/types/base_field.rb
|
74
|
+
- lib/graph_q_l/types/base_input_object.rb
|
75
|
+
- lib/graph_q_l/types/base_interface.rb
|
76
|
+
- lib/graph_q_l/types/base_object.rb
|
77
|
+
- lib/graph_q_l/types/base_scalar.rb
|
78
|
+
- lib/graph_q_l/types/base_union.rb
|
79
|
+
- lib/graph_q_l/types/card.rb
|
80
|
+
- lib/graph_q_l/types/mutation_type.rb
|
81
|
+
- lib/graph_q_l/types/node_type.rb
|
82
|
+
- lib/graph_q_l/types/query.rb
|
83
|
+
- lib/graphql_controller.rb
|
84
|
+
- lib/tasks/graphql.rake
|
85
|
+
homepage: http://decko.org
|
86
|
+
licenses:
|
87
|
+
- GPL-3.0
|
88
|
+
metadata:
|
89
|
+
card-mod: graphql
|
90
|
+
post_install_message:
|
91
|
+
rdoc_options: []
|
92
|
+
require_paths:
|
93
|
+
- lib
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '2.5'
|
99
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
requirements: []
|
105
|
+
rubygems_version: 3.2.28
|
106
|
+
signing_key:
|
107
|
+
specification_version: 4
|
108
|
+
summary: GraphQL for decko cards
|
109
|
+
test_files: []
|