binda-api 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +84 -0
  4. data/Rakefile +26 -0
  5. data/app/controllers/binda/api/application_controller.rb +7 -0
  6. data/app/controllers/graphql_controller.rb +35 -0
  7. data/app/graphql/binda/api/fields/board_by_slug_field.rb +8 -0
  8. data/app/graphql/binda/api/fields/component_by_slug_field.rb +9 -0
  9. data/app/graphql/binda/api/fields/components_by_structure_field.rb +10 -0
  10. data/app/graphql/binda/api/fields/components_field.rb +11 -0
  11. data/app/graphql/binda/api/fields/repeaters_field.rb +10 -0
  12. data/app/graphql/binda/api/fields/structures_field.rb +6 -0
  13. data/app/graphql/binda/api/resolvers/board_by_slug_resolver.rb +5 -0
  14. data/app/graphql/binda/api/resolvers/component_by_slug_resolver.rb +5 -0
  15. data/app/graphql/binda/api/resolvers/components_by_structure_resolver.rb +5 -0
  16. data/app/graphql/binda/api/resolvers/components_resolver.rb +14 -0
  17. data/app/graphql/binda/api/resolvers/repeaters_resolver.rb +6 -0
  18. data/app/graphql/binda/api/resolvers/structures_resolver.rb +5 -0
  19. data/app/graphql/binda/api/schema.rb +8 -0
  20. data/app/graphql/binda/api/types/audio_type.rb +22 -0
  21. data/app/graphql/binda/api/types/board_type.rb +11 -0
  22. data/app/graphql/binda/api/types/checkbox_type.rb +18 -0
  23. data/app/graphql/binda/api/types/component_type.rb +13 -0
  24. data/app/graphql/binda/api/types/image_type.rb +28 -0
  25. data/app/graphql/binda/api/types/mutation_type.rb +11 -0
  26. data/app/graphql/binda/api/types/query_type.rb +11 -0
  27. data/app/graphql/binda/api/types/radio_type.rb +15 -0
  28. data/app/graphql/binda/api/types/repeater_type.rb +8 -0
  29. data/app/graphql/binda/api/types/selection_type.rb +16 -0
  30. data/app/graphql/binda/api/types/structure_type.rb +6 -0
  31. data/app/graphql/binda/api/types/svg_type.rb +10 -0
  32. data/app/graphql/binda/api/types/text_type.rb +10 -0
  33. data/app/graphql/binda/api/types/video_type.rb +22 -0
  34. data/app/helpers/binda/api/application_helper.rb +6 -0
  35. data/app/models/binda/api/application_record.rb +7 -0
  36. data/config/database.yml.travis +3 -0
  37. data/config/routes.rb +7 -0
  38. data/lib/binda/api.rb +8 -0
  39. data/lib/binda/api/engine.rb +21 -0
  40. data/lib/binda/api/fields.rb +111 -0
  41. data/lib/binda/api/version.rb +5 -0
  42. data/lib/tasks/binda/api_tasks.rake +4 -0
  43. metadata +243 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 314f92cda8132491aba8f9578ca7304a8c0ab84f
4
+ data.tar.gz: b61d424f831112ed415bdcca30ea693872ddeb21
5
+ SHA512:
6
+ metadata.gz: 20f2f402ae3cd2d88fb0fbb3fc77a7676386a29c6d41ac2e309288dc12f5c041047f2fb54b2b016289ae997a25dcca538a1ce9eed381261d9b5af36dd37a2e7e
7
+ data.tar.gz: edf1e7c0cd685f4496be108b24de281b7d28bb89a5b0cacbd6d241e3134b912943e8f428cbe3823c7ed5d82938c86b82427e4dce6a176b78663b15a45e1af0e9
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2018 Marco Crepaldi
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,84 @@
1
+ # Binda API
2
+ A GraphQL API for [Binda CMS](http://github.com/lacolonia/binda).
3
+
4
+ **Binda** is a headless CMS with an intuitive out-of-the-box interface which makes very easy creating application infrastructures. For more info about Binda structure please visit the [official documentation](http://www.rubydoc.info/gems/binda)
5
+
6
+ [![Maintainability](https://api.codeclimate.com/v1/badges/d670f30b4635e5d7bb2a/maintainability)](https://codeclimate.com/github/lacolonia/binda-api/maintainability)
7
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/d670f30b4635e5d7bb2a/test_coverage)](https://codeclimate.com/github/lacolonia/binda-api/test_coverage)
8
+
9
+ # Quick start
10
+ Install Binda APi via terminal
11
+
12
+ ```bash
13
+ gem install binda-api
14
+ ```
15
+
16
+ alternatively add the gem to your application's Gemfile:
17
+
18
+ ```ruby
19
+ gem 'binda-api'
20
+ ```
21
+
22
+ Then execute:
23
+
24
+ ```bash
25
+ bundle install
26
+ ```
27
+
28
+ (If you have installed Binda already you can skip next steps)
29
+
30
+ Setup the database. If you are going to use Postgres set it up now.
31
+
32
+ To complete binda installation run the installer from terminal. Binda will take you through a short configuration process where you will setup the first user and some basic details.
33
+
34
+ ```bash
35
+ rails generate binda:install
36
+ ```
37
+
38
+ Now you are good to go. Good job!
39
+
40
+ # Query
41
+ Binda API is based on [GraphQL](https://graphql.org).
42
+
43
+ Here below an example of a simple query that retrives the name of all `post` components using [Axios](https://github.com/axios/axios) library.
44
+
45
+ ```javascript
46
+ axios
47
+ .post(
48
+ "http://my.domain.com/graphql",
49
+ { query: "{ components(slug: \"post\"){ edges { node { name } } }}" },
50
+ { headers: { "Content-Type": "application/json" } }
51
+ )
52
+ .then(response => response.data)
53
+ .catch(error => {
54
+ throw error;
55
+ })
56
+ ```
57
+
58
+ This is one of the possible approaces to access Binda content with GraphQL. Feel free to make requests to GraphQL as you prefer.
59
+
60
+ ## GraphiQL and Binda API documentation
61
+ Binda API documentation is integrated in the GraphiQL panel which is accessible from `/admin_panel/graphiql`. In your local environment this would be `http://localhost:3000/admin_panel/graphiql` (if you use port 3000).
62
+
63
+ ## Absolute URL
64
+ If Binda is using a CDN to store all assets you should already receive a proper absolute URL. If insted you are storing assets inside public folder (see [Carrierwave documentation](https://github.com/carrierwaveuploader/carrierwave#configuring-carrierwave)) Binda API will give you a relative path.
65
+
66
+ You can fix this issue modify few lines of the CMS application on which Binda is installed.
67
+
68
+ Assuming that you set a environmental variable `BINDA_ASSET_HOST`
69
+
70
+ ```yaml
71
+ BINDA_ASSET_HOST=http://your.domain.com
72
+ ```
73
+
74
+ Add this line to `config/environments/production.rb`
75
+
76
+ ```ruby
77
+ config.action_controller.asset_host = ENV['BINDA_ASSET_HOST']
78
+ ```
79
+
80
+ Add also this line to `config/initializers/carrierwave.rb`
81
+
82
+ ```ruby
83
+ config.asset_host = ActionController::Base.asset_host
84
+ ```
data/Rakefile ADDED
@@ -0,0 +1,26 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'Binda::Api'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../spec/test_app/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+
21
+ load 'rails/tasks/statistics.rake'
22
+
23
+
24
+
25
+ require 'bundler/gem_tasks'
26
+
@@ -0,0 +1,7 @@
1
+ module Binda
2
+ module Api
3
+ class ApplicationController < ActionController::Base
4
+ protect_from_forgery with: :exception
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,35 @@
1
+ class GraphqlController < ApplicationController
2
+ protect_from_forgery with: :null_session
3
+
4
+ def execute
5
+ variables = ensure_hash(params[:variables])
6
+ query = params[:query]
7
+ operation_name = params[:operationName]
8
+ context = {
9
+ # Query context goes here, for example:
10
+ # current_user: current_user,
11
+ }
12
+ result = Binda::Api::Schema.execute(query, variables: variables, context: context, operation_name: operation_name)
13
+ render json: result
14
+ end
15
+
16
+ private
17
+
18
+ # Handle form data, JSON body, or a blank value
19
+ def ensure_hash(ambiguous_param)
20
+ case ambiguous_param
21
+ when String
22
+ if ambiguous_param.present?
23
+ ensure_hash(JSON.parse(ambiguous_param))
24
+ else
25
+ {}
26
+ end
27
+ when Hash, ActionController::Parameters
28
+ ambiguous_param
29
+ when nil
30
+ {}
31
+ else
32
+ raise ArgumentError, "Unexpected parameter: #{ambiguous_param}"
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,8 @@
1
+ Binda::Api::Fields::BoardBySlugField = GraphQL::Field.define do
2
+ name 'boardBySlug'
3
+ type Binda::Api::Types::BoardType
4
+
5
+ argument :slug, !types.String
6
+
7
+ resolve(Binda::Api::Resolvers::BoardBySlugResolver.new)
8
+ end
@@ -0,0 +1,9 @@
1
+ Binda::Api::Fields::ComponentBySlugField = GraphQL::Field.define do
2
+ name 'componentBySlug'
3
+ type Binda::Api::Types::ComponentType
4
+
5
+ argument :slug, !types.String
6
+
7
+ resolve(Binda::Api::Resolvers::ComponentBySlugResolver.new)
8
+ end
9
+
@@ -0,0 +1,10 @@
1
+ Binda::Api::Fields::ComponentsByStructureField = GraphQL::Field.define do
2
+ name 'componentsByStructure'
3
+ type Binda::Api::Types::ComponentType.connection_type
4
+
5
+ argument :slug, !types.String
6
+ argument :structure_slug, !types.String
7
+ argument :publish_state, !types.String
8
+
9
+ resolve(Binda::Api::Resolvers::ComponentsByStructureResolver.new)
10
+ end
@@ -0,0 +1,11 @@
1
+ Binda::Api::Fields::ComponentsField = GraphQL::Field.define do
2
+ name 'components'
3
+
4
+ argument :slug, types.String.to_list_type
5
+ argument :structure_slug, types.String
6
+ argument :publish_state, types.String
7
+
8
+ type Binda::Api::Types::ComponentType.connection_type
9
+
10
+ resolve(Binda::Api::Resolvers::ComponentsResolver.new)
11
+ end
@@ -0,0 +1,10 @@
1
+ Binda::Api::Fields::RepeatersField = GraphQL::Field.define do
2
+ name 'repeaters'
3
+ type Binda::Api::Types::RepeaterType.to_list_type
4
+
5
+ argument :slug, !types.String
6
+ argument :fieldable_slug, !types.String
7
+
8
+ resolve(Binda::Api::Resolvers::RepeatersResolver.new)
9
+ end
10
+
@@ -0,0 +1,6 @@
1
+ Binda::Api::Fields::StructuresField = GraphQL::Field.define do
2
+ name 'structures'
3
+ type Binda::Api::Types::StructureType.connection_type
4
+
5
+ resolve(Binda::Api::Resolvers::StructuresResolver.new)
6
+ end
@@ -0,0 +1,5 @@
1
+ class Binda::Api::Resolvers::BoardBySlugResolver
2
+ def call(obj, args, ctx = {})
3
+ Binda::Board.find_by! slug: args[:slug]
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Binda::Api::Resolvers::ComponentBySlugResolver
2
+ def call(obj, args, ctx = {})
3
+ Binda::Component.find_by! slug: args[:slug]
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Binda::Api::Resolvers::ComponentsByStructureResolver
2
+ def call(obj, args, ctx = {})
3
+ Binda::Component.includes(:structure).where(binda_structures: { slug: args[:slug] })
4
+ end
5
+ end
@@ -0,0 +1,14 @@
1
+ class Binda::Api::Resolvers::ComponentsResolver
2
+ def call(obj, args, ctx = {})
3
+ query_params = args.to_h.symbolize_keys
4
+ query_params.reject!{|k,v| [:first, :last, :after, :before].include? k }
5
+ structure_slug = query_params.delete(:structure_slug)
6
+
7
+ components = Binda::Component.where query_params
8
+ if structure_slug
9
+ components = components.includes(:structure).where(binda_structures: { slug: structure_slug })
10
+ end
11
+
12
+ components.order('binda_components.position ASC')
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ class Binda::Api::Resolvers::RepeatersResolver
2
+ def call(obj, args, ctx = {})
3
+ repeaters = Binda::Repeater.includes(:field_setting).where(binda_field_settings: { slug: args[:slug] }).order(:position)
4
+ repeaters.select{|r| r.fieldable.slug == args[:fieldable_slug] }
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class Binda::Api::Resolvers::StructuresResolver
2
+ def call(obj, args, ctx = {})
3
+ Binda::Structure.all
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ Binda::Api::Schema = GraphQL::Schema.define do
2
+ mutation(Binda::Api::Types::MutationType)
3
+ query(Binda::Api::Types::QueryType)
4
+
5
+ rescue_from ActiveRecord::RecordNotFound do
6
+ 'Record not found'
7
+ end
8
+ end
@@ -0,0 +1,22 @@
1
+ Binda::Api::Types::AudioType = GraphQL::ObjectType.define do
2
+ name 'Binda_Audio'
3
+
4
+ field :audio, types.String do
5
+ resolve ->(obj, args, ctx) do
6
+ obj.audio.url
7
+ end
8
+ end
9
+
10
+ field :content_type, types.String do
11
+ resolve ->(obj, args, ctx) do
12
+ obj.content_type
13
+ end
14
+ end
15
+
16
+ field :file_size, types.String do
17
+ resolve ->(obj, args, ctx) do
18
+ obj.file_size
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,11 @@
1
+ require 'binda/api/fields'
2
+
3
+ Binda::Api::Types::BoardType = GraphQL::ObjectType.define do |context|
4
+ name "Binda_Board"
5
+ context.field :id, context.types.ID
6
+ context.field :name, context.types.String
7
+ context.field :slug, context.types.String
8
+ context.field :position, context.types.Int
9
+
10
+ ::Binda::Api::Fields::SHARED_FIELDS.call(context)
11
+ end
@@ -0,0 +1,18 @@
1
+ require 'binda/api/fields'
2
+
3
+ Binda::Api::Types::CheckboxType = GraphQL::ObjectType.define do
4
+ name 'Binda_Checkbox'
5
+
6
+ field :value, types.String do
7
+ resolve ->(obj, args, ctx) do
8
+ obj[:value]
9
+ end
10
+ end
11
+
12
+ field :label, types.String do
13
+ resolve ->(obj, args, ctx) do
14
+ obj[:label]
15
+ end
16
+ end
17
+
18
+ end
@@ -0,0 +1,13 @@
1
+ require 'binda/api/fields'
2
+
3
+ Binda::Api::Types::ComponentType = GraphQL::ObjectType.define do |context|
4
+ name "Binda_Component"
5
+ context.field :id, context.types.ID
6
+ context.field :name, context.types.String
7
+ context.field :slug, context.types.String
8
+ context.field :publish_state, context.types.String
9
+ context.field :structure, ::Binda::Api::Types::StructureType
10
+ context.field :position, context.types.Int
11
+
12
+ ::Binda::Api::Fields::SHARED_FIELDS.call(context)
13
+ end
@@ -0,0 +1,28 @@
1
+ Binda::Api::Types::ImageType = GraphQL::ObjectType.define do
2
+ name 'Binda_Image'
3
+
4
+ field :image, types.String do
5
+ resolve ->(obj, args, ctx) do
6
+ obj.image.url
7
+ end
8
+ end
9
+
10
+ field :thumb, types.String do
11
+ resolve ->(obj, args, ctx) do
12
+ obj.image.thumb.url
13
+ end
14
+ end
15
+
16
+ field :width, types.String do
17
+ resolve ->(obj, args, ctx) do
18
+ obj.file_width.to_i
19
+ end
20
+ end
21
+
22
+ field :height, types.String do
23
+ resolve ->(obj, args, ctx) do
24
+ obj.file_height.to_i
25
+ end
26
+ end
27
+
28
+ end
@@ -0,0 +1,11 @@
1
+ Binda::Api::Types::MutationType = GraphQL::ObjectType.define do
2
+ name "Mutation"
3
+
4
+ # TODO: Remove me
5
+ field :testField, types.String do
6
+ description "An example field added by the generator"
7
+ resolve ->(obj, args, ctx) {
8
+ "Hello World!"
9
+ }
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ Binda::Api::Types::QueryType = GraphQL::ObjectType.define do
2
+ name "Query"
3
+
4
+ connection :structures, Binda::Api::Fields::StructuresField
5
+ connection :components, Binda::Api::Fields::ComponentsField
6
+ connection :components_by_structure, Binda::Api::Fields::ComponentsByStructureField
7
+
8
+ field :component_by_slug, Binda::Api::Fields::ComponentBySlugField
9
+ field :board_by_slug, Binda::Api::Fields::BoardBySlugField
10
+ field :repeaters, Binda::Api::Fields::RepeatersField
11
+ end
@@ -0,0 +1,15 @@
1
+ Binda::Api::Types::RadioType = GraphQL::ObjectType.define do
2
+ name 'Binda_Radio'
3
+
4
+ field :value, types.String do
5
+ resolve ->(obj, args, ctx) do
6
+ obj[:value]
7
+ end
8
+ end
9
+
10
+ field :label, types.String do
11
+ resolve ->(obj, args, ctx) do
12
+ obj[:label]
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ require 'binda/api/fields'
2
+
3
+ Binda::Api::Types::RepeaterType = GraphQL::ObjectType.define do |context|
4
+ name 'Binda_Repeater'
5
+ context.field :position, context.types.Int
6
+
7
+ ::Binda::Api::Fields::SHARED_FIELDS.call(context)
8
+ end
@@ -0,0 +1,16 @@
1
+ Binda::Api::Types::SelectionType = GraphQL::ObjectType.define do
2
+ name 'Binda_Selection'
3
+
4
+ field :value, types.String do
5
+ resolve ->(obj, args, ctx) do
6
+ obj[:value]
7
+ end
8
+ end
9
+
10
+ field :label, types.String do
11
+ resolve ->(obj, args, ctx) do
12
+ obj[:label]
13
+ end
14
+ end
15
+
16
+ end
@@ -0,0 +1,6 @@
1
+ Binda::Api::Types::StructureType = GraphQL::ObjectType.define do
2
+ name "Binda_Structure"
3
+
4
+ field :id, !types.ID
5
+ field :name, !types.String
6
+ end
@@ -0,0 +1,10 @@
1
+ Binda::Api::Types::SvgType = GraphQL::ObjectType.define do
2
+ name 'Binda_Svg'
3
+
4
+ field :svg, types.String do
5
+ resolve ->(obj, args, ctx) do
6
+ obj.svg.url
7
+ end
8
+ end
9
+ end
10
+
@@ -0,0 +1,10 @@
1
+ Binda::Api::Types::TextType = GraphQL::ObjectType.define do
2
+ name 'Binda_Text'
3
+
4
+ field :value, types.String do
5
+ resolve ->(obj, args, ctx) do
6
+ obj.try(:html_safe)
7
+ end
8
+ end
9
+ end
10
+
@@ -0,0 +1,22 @@
1
+ Binda::Api::Types::VideoType = GraphQL::ObjectType.define do
2
+ name 'Binda_Video'
3
+
4
+ field :video, types.String do
5
+ resolve ->(obj, args, ctx) do
6
+ obj.video.url
7
+ end
8
+ end
9
+
10
+ field :content_type, types.String do
11
+ resolve ->(obj, args, ctx) do
12
+ obj.content_type
13
+ end
14
+ end
15
+
16
+ field :file_size, types.String do
17
+ resolve ->(obj, args, ctx) do
18
+ obj.file_size
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,6 @@
1
+ module Binda
2
+ module Api
3
+ module ApplicationHelper
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ module Binda
2
+ module Api
3
+ class ApplicationRecord < ActiveRecord::Base
4
+ self.abstract_class = true
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ test:
2
+ adapter: postgresql
3
+ database: travis_ci_test
data/config/routes.rb ADDED
@@ -0,0 +1,7 @@
1
+ Rails.application.routes.draw do
2
+ post "/graphql", to: "graphql#execute"
3
+ end
4
+
5
+ Binda::Engine.routes.draw do
6
+ mount GraphiQL::Rails::Engine, at: "/graphiql", graphql_path: "/graphql"
7
+ end
data/lib/binda/api.rb ADDED
@@ -0,0 +1,8 @@
1
+ require "binda/api/engine"
2
+ require 'binda/api/fields'
3
+
4
+ module Binda
5
+ module Api
6
+ # Your code goes here...
7
+ end
8
+ end
@@ -0,0 +1,21 @@
1
+ require 'binda'
2
+ require 'graphql'
3
+ require 'graphiql/rails'
4
+ require 'rack/cors'
5
+
6
+ module Binda
7
+ module Api
8
+ class Engine < ::Rails::Engine
9
+ isolate_namespace Binda::Api
10
+
11
+ initializer "add_rack_cors_middleware" do |app|
12
+ app.middleware.insert_before 0, Rack::Cors do
13
+ allow do
14
+ origins '*'
15
+ resource '*', :headers => :any, :methods => [:get, :post, :options]
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,111 @@
1
+ module Binda
2
+ module Api
3
+ module Fields
4
+ SHARED_FIELDS = Proc.new do |context|
5
+ context.field :get_related_components, ::Binda::Api::Types::ComponentType.to_list_type do
6
+ argument :slug, !context.types.String
7
+
8
+ resolve ->(obj, args, ctx) {
9
+ obj.get_related_components(args[:slug])
10
+ }
11
+ end
12
+
13
+ context.field :get_related_boards, ::Binda::Api::Types::BoardType.to_list_type do
14
+ argument :slug, !context.types.String
15
+
16
+ resolve ->(obj, args, ctx) {
17
+ obj.get_related_boards(args[:slug])
18
+ }
19
+ end
20
+
21
+ context.field :get_string, ::Binda::Api::Types::TextType do
22
+ argument :slug, !context.types.String
23
+
24
+ resolve ->(obj, args, ctx) {
25
+ begin
26
+ obj.get_string(args[:slug])
27
+ rescue ArgumentError
28
+ ""
29
+ end
30
+ }
31
+ end
32
+
33
+ context.field :get_text, ::Binda::Api::Types::TextType do
34
+ argument :slug, !context.types.String
35
+
36
+ resolve ->(obj, args, ctx) {
37
+ begin
38
+ obj.get_text(args[:slug])
39
+ rescue ArgumentError
40
+ ""
41
+ end
42
+ }
43
+ end
44
+
45
+ context.field :get_radio_choice, ::Binda::Api::Types::RadioType do
46
+ argument :slug, !context.types.String
47
+
48
+ resolve ->(obj, args, ctx) {
49
+ obj.get_radio_choice(args[:slug])
50
+ }
51
+ end
52
+
53
+ context.field :get_checkbox_choices, ::Binda::Api::Types::CheckboxType.to_list_type do
54
+ argument :slug, !context.types.String
55
+
56
+ resolve ->(obj, args, ctx) {
57
+ obj.get_checkbox_choices(args[:slug])
58
+ }
59
+ end
60
+
61
+ context.field :get_selection_choice, ::Binda::Api::Types::SelectionType do
62
+ argument :slug, !context.types.String
63
+
64
+ resolve ->(obj, args, ctx) {
65
+ obj.get_selection_choice(args[:slug])
66
+ }
67
+ end
68
+
69
+ context.field :get_image, ::Binda::Api::Types::ImageType do
70
+ argument :slug, !context.types.String
71
+
72
+ resolve ->(obj, args, ctx) {
73
+ obj.images.find{ |t| t.field_setting_id == ::Binda::FieldSetting.get_id( args[:slug] ) }
74
+ }
75
+ end
76
+
77
+ context.field :get_audio, ::Binda::Api::Types::AudioType do
78
+ argument :slug, !context.types.String
79
+
80
+ resolve ->(obj, args, ctx) {
81
+ obj.audios.find{ |t| t.field_setting_id == ::Binda::FieldSetting.get_id( args[:slug] ) }
82
+ }
83
+ end
84
+
85
+ context.field :get_video, ::Binda::Api::Types::VideoType do
86
+ argument :slug, !context.types.String
87
+
88
+ resolve ->(obj, args, ctx) {
89
+ obj.videos.find{ |t| t.field_setting_id == ::Binda::FieldSetting.get_id( args[:slug] ) }
90
+ }
91
+ end
92
+
93
+ context.field :get_svg, ::Binda::Api::Types::SvgType do
94
+ argument :slug, !context.types.String
95
+
96
+ resolve ->(obj, args, ctx) {
97
+ obj.svgs.find{ |t| t.field_setting_id == ::Binda::FieldSetting.get_id( args[:slug] ) }
98
+ }
99
+ end
100
+
101
+ context.field :repeaters, ::Binda::Api::Types::RepeaterType.to_list_type do
102
+ argument :slug, !context.types.String
103
+
104
+ resolve ->(obj, args, ctx) {
105
+ obj.repeaters.order("binda_repeaters.position").select{ |t| t.field_setting_id == ::Binda::FieldSetting.get_id( args[:slug] ) }
106
+ }
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,5 @@
1
+ module Binda
2
+ module Api
3
+ VERSION = '0.1.2'
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :binda_api do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,243 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: binda-api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Marco Crepaldi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-05-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: binda
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.9
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.9
41
+ - !ruby/object:Gem::Dependency
42
+ name: graphql
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.8.0.pre11
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.8.0.pre11
55
+ - !ruby/object:Gem::Dependency
56
+ name: graphiql-rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.4'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.4'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rack-cors
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pg
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0.21'
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: '1.0'
93
+ type: :runtime
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0.21'
100
+ - - "<"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rspec-rails
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '3.5'
110
+ - - "<"
111
+ - !ruby/object:Gem::Version
112
+ version: '3.8'
113
+ type: :development
114
+ prerelease: false
115
+ version_requirements: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '3.5'
120
+ - - "<"
121
+ - !ruby/object:Gem::Version
122
+ version: '3.8'
123
+ - !ruby/object:Gem::Dependency
124
+ name: byebug
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '10.0'
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "~>"
135
+ - !ruby/object:Gem::Version
136
+ version: '10.0'
137
+ - !ruby/object:Gem::Dependency
138
+ name: factory_bot_rails
139
+ requirement: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - "~>"
142
+ - !ruby/object:Gem::Version
143
+ version: '4.8'
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - "~>"
149
+ - !ruby/object:Gem::Version
150
+ version: '4.8'
151
+ - !ruby/object:Gem::Dependency
152
+ name: database_cleaner
153
+ requirement: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '1.6'
158
+ - - "<"
159
+ - !ruby/object:Gem::Version
160
+ version: '2'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '1.6'
168
+ - - "<"
169
+ - !ruby/object:Gem::Version
170
+ version: '2'
171
+ description: ''
172
+ email:
173
+ - marco.crepaldi@gmail.com
174
+ executables: []
175
+ extensions: []
176
+ extra_rdoc_files: []
177
+ files:
178
+ - MIT-LICENSE
179
+ - README.md
180
+ - Rakefile
181
+ - app/controllers/binda/api/application_controller.rb
182
+ - app/controllers/graphql_controller.rb
183
+ - app/graphql/binda/api/fields/board_by_slug_field.rb
184
+ - app/graphql/binda/api/fields/component_by_slug_field.rb
185
+ - app/graphql/binda/api/fields/components_by_structure_field.rb
186
+ - app/graphql/binda/api/fields/components_field.rb
187
+ - app/graphql/binda/api/fields/repeaters_field.rb
188
+ - app/graphql/binda/api/fields/structures_field.rb
189
+ - app/graphql/binda/api/resolvers/board_by_slug_resolver.rb
190
+ - app/graphql/binda/api/resolvers/component_by_slug_resolver.rb
191
+ - app/graphql/binda/api/resolvers/components_by_structure_resolver.rb
192
+ - app/graphql/binda/api/resolvers/components_resolver.rb
193
+ - app/graphql/binda/api/resolvers/repeaters_resolver.rb
194
+ - app/graphql/binda/api/resolvers/structures_resolver.rb
195
+ - app/graphql/binda/api/schema.rb
196
+ - app/graphql/binda/api/types/audio_type.rb
197
+ - app/graphql/binda/api/types/board_type.rb
198
+ - app/graphql/binda/api/types/checkbox_type.rb
199
+ - app/graphql/binda/api/types/component_type.rb
200
+ - app/graphql/binda/api/types/image_type.rb
201
+ - app/graphql/binda/api/types/mutation_type.rb
202
+ - app/graphql/binda/api/types/query_type.rb
203
+ - app/graphql/binda/api/types/radio_type.rb
204
+ - app/graphql/binda/api/types/repeater_type.rb
205
+ - app/graphql/binda/api/types/selection_type.rb
206
+ - app/graphql/binda/api/types/structure_type.rb
207
+ - app/graphql/binda/api/types/svg_type.rb
208
+ - app/graphql/binda/api/types/text_type.rb
209
+ - app/graphql/binda/api/types/video_type.rb
210
+ - app/helpers/binda/api/application_helper.rb
211
+ - app/models/binda/api/application_record.rb
212
+ - config/database.yml.travis
213
+ - config/routes.rb
214
+ - lib/binda/api.rb
215
+ - lib/binda/api/engine.rb
216
+ - lib/binda/api/fields.rb
217
+ - lib/binda/api/version.rb
218
+ - lib/tasks/binda/api_tasks.rake
219
+ homepage: http://lacolonia.studio
220
+ licenses:
221
+ - MIT
222
+ metadata: {}
223
+ post_install_message:
224
+ rdoc_options: []
225
+ require_paths:
226
+ - lib
227
+ required_ruby_version: !ruby/object:Gem::Requirement
228
+ requirements:
229
+ - - ">="
230
+ - !ruby/object:Gem::Version
231
+ version: '0'
232
+ required_rubygems_version: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ requirements: []
238
+ rubyforge_project:
239
+ rubygems_version: 2.6.12
240
+ signing_key:
241
+ specification_version: 4
242
+ summary: Binda plugin that adds a GraphQL api to your applicaiton
243
+ test_files: []