ecoportal-api-graphql 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.rspec +3 -0
- data/.rubocop.yml +55 -0
- data/.travis.yml +5 -0
- data/.yardopts +10 -0
- data/CHANGELOG.md +22 -0
- data/Gemfile +6 -0
- data/LICENSE +21 -0
- data/README.md +20 -0
- data/Rakefile +27 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/bin/setup.ps1 +6 -0
- data/ecoportal-api-graphql.gemspec +34 -0
- data/lib/ecoportal/api/common/graphql/auth_service.rb +66 -0
- data/lib/ecoportal/api/common/graphql/class_helpers.rb +34 -0
- data/lib/ecoportal/api/common/graphql/client.rb +43 -0
- data/lib/ecoportal/api/common/graphql/doc_helpers.rb +10 -0
- data/lib/ecoportal/api/common/graphql/hash_helpers.rb +79 -0
- data/lib/ecoportal/api/common/graphql/http_client.rb +84 -0
- data/lib/ecoportal/api/common/graphql.rb +15 -0
- data/lib/ecoportal/api/common.graphql.rb +8 -0
- data/lib/ecoportal/api/graphql/base/action.rb +36 -0
- data/lib/ecoportal/api/graphql/base/action_category.rb +13 -0
- data/lib/ecoportal/api/graphql/base/connection.rb +33 -0
- data/lib/ecoportal/api/graphql/base/contractor_entity.rb +17 -0
- data/lib/ecoportal/api/graphql/base/date_time.rb +12 -0
- data/lib/ecoportal/api/graphql/base/field.rb +12 -0
- data/lib/ecoportal/api/graphql/base/file_attachment.rb +15 -0
- data/lib/ecoportal/api/graphql/base/file_container.rb +14 -0
- data/lib/ecoportal/api/graphql/base/id_diff_input.rb +11 -0
- data/lib/ecoportal/api/graphql/base/model.rb +33 -0
- data/lib/ecoportal/api/graphql/base/organization.rb +13 -0
- data/lib/ecoportal/api/graphql/base/page.rb +12 -0
- data/lib/ecoportal/api/graphql/base/page_info.rb +12 -0
- data/lib/ecoportal/api/graphql/base/payload.rb +25 -0
- data/lib/ecoportal/api/graphql/base/person_member.rb +20 -0
- data/lib/ecoportal/api/graphql/base/query.rb +61 -0
- data/lib/ecoportal/api/graphql/base/query_connection.rb +56 -0
- data/lib/ecoportal/api/graphql/base/resource.rb +13 -0
- data/lib/ecoportal/api/graphql/base/validation_errors.rb +23 -0
- data/lib/ecoportal/api/graphql/base.rb +28 -0
- data/lib/ecoportal/api/graphql/connection/action.rb +11 -0
- data/lib/ecoportal/api/graphql/connection/contractor_entity.rb +11 -0
- data/lib/ecoportal/api/graphql/connection/person_member.rb +11 -0
- data/lib/ecoportal/api/graphql/connection.rb +12 -0
- data/lib/ecoportal/api/graphql/fragment/contractor_entity.rb +19 -0
- data/lib/ecoportal/api/graphql/fragment/pagination.rb +17 -0
- data/lib/ecoportal/api/graphql/fragment.rb +50 -0
- data/lib/ecoportal/api/graphql/input/create_contractor_entity.rb +14 -0
- data/lib/ecoportal/api/graphql/input/destroy_contractor_entity.rb +11 -0
- data/lib/ecoportal/api/graphql/input/search.rb +13 -0
- data/lib/ecoportal/api/graphql/input/search_filter.rb +12 -0
- data/lib/ecoportal/api/graphql/input/search_sorter.rb +11 -0
- data/lib/ecoportal/api/graphql/input/update_contractor_entity.rb +10 -0
- data/lib/ecoportal/api/graphql/input.rb +15 -0
- data/lib/ecoportal/api/graphql/model/account.rb +13 -0
- data/lib/ecoportal/api/graphql/model/action.rb +21 -0
- data/lib/ecoportal/api/graphql/model/contractor_entity.rb +12 -0
- data/lib/ecoportal/api/graphql/model/field.rb +10 -0
- data/lib/ecoportal/api/graphql/model/file_attachment.rb +10 -0
- data/lib/ecoportal/api/graphql/model/file_container.rb +11 -0
- data/lib/ecoportal/api/graphql/model/organization.rb +46 -0
- data/lib/ecoportal/api/graphql/model/page.rb +10 -0
- data/lib/ecoportal/api/graphql/model/person_member.rb +15 -0
- data/lib/ecoportal/api/graphql/model/resource.rb +12 -0
- data/lib/ecoportal/api/graphql/model/user.rb +12 -0
- data/lib/ecoportal/api/graphql/model.rb +20 -0
- data/lib/ecoportal/api/graphql/payload/create_contractor_entity.rb +11 -0
- data/lib/ecoportal/api/graphql/payload/destroy_contractor_entity.rb +10 -0
- data/lib/ecoportal/api/graphql/payload/update_contractor_entity.rb +10 -0
- data/lib/ecoportal/api/graphql/payload.rb +12 -0
- data/lib/ecoportal/api/graphql/query/actions.rb +94 -0
- data/lib/ecoportal/api/graphql/query/contractor_entities.rb +64 -0
- data/lib/ecoportal/api/graphql/query.rb +11 -0
- data/lib/ecoportal/api/graphql.rb +38 -0
- data/lib/ecoportal/api/graphql_version.rb +5 -0
- data/lib/ecoportal/api-graphql.rb +10 -0
- data/tests/actions_get.rb +8 -0
- data/tests/contractor_entities_get.rb +20 -0
- data/tests/local_libs.rb +14 -0
- metadata +278 -0
@@ -0,0 +1,33 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
module Base
|
5
|
+
class Connection < Ecoportal::API::GraphQL::Base::Model
|
6
|
+
class GenericNode
|
7
|
+
def initialize(*args, **kargs)
|
8
|
+
raise "Missuse error. You should define a node_class for a class that inherits from GraphqlConnection class."
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
include Enumerable
|
13
|
+
|
14
|
+
class_resolver :node_class, GenericNode
|
15
|
+
|
16
|
+
passthrough :edges
|
17
|
+
passthrough :totalCount
|
18
|
+
embeds_many :nodes, klass: :node_class
|
19
|
+
embeds_one :pageInfo, klass: Ecoportal::API::GraphQL::Base::PageInfo
|
20
|
+
|
21
|
+
def empty?
|
22
|
+
count < 1
|
23
|
+
end
|
24
|
+
|
25
|
+
def each(&block)
|
26
|
+
return to_enum(:each) unless block
|
27
|
+
nodes.each(&block)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
module Base
|
5
|
+
class ContractorEntity < Ecoportal::API::GraphQL::Base::Model
|
6
|
+
passkey :id
|
7
|
+
passthrough :name
|
8
|
+
passboolean :active, :approved
|
9
|
+
passthrough :schemaId
|
10
|
+
|
11
|
+
passarray :associatedPeopleIds, :leadContractorIds
|
12
|
+
embeds_one :creator, klass: "Ecoportal::API::GraphQL::Model::User"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
module Base
|
5
|
+
class FileAttachment < Ecoportal::API::GraphQL::Base::Model
|
6
|
+
passkey :id
|
7
|
+
passthrough :attachmentFileSize, :attachmentFileName, :attachmentContentType
|
8
|
+
passthrough :urlType, :activeName
|
9
|
+
passthrough :userId, :userName
|
10
|
+
embeds_one :attachmentUpdatedAt, klass: GraphQL::Base::DateTime
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
module Base
|
5
|
+
class FileContainer < Ecoportal::API::GraphQL::Base::Model
|
6
|
+
passkey :id
|
7
|
+
passthrough :name, :activeName
|
8
|
+
passthrough :fileSize, :token, :activeVersionId
|
9
|
+
passarray :tags
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
module Base
|
5
|
+
class Model < Ecoportal::API::Common::Content::DoubleModel
|
6
|
+
include Ecoportal::API::Common::GraphQL::ClassHelpers
|
7
|
+
#include GraphModel::HashKeys
|
8
|
+
class << self
|
9
|
+
attr_accessor :client
|
10
|
+
|
11
|
+
def as_input(hash, clientMutationId: "")
|
12
|
+
hash_input = hash.merge(clientMutationId: clientMutationId)
|
13
|
+
Ecoportal::API::Common::GraphQL::HashHelpers.remove_nil_keys_deep(hash_input, target: :id)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def as_update(ref = :last, ignore: [], sym_keys: false)
|
18
|
+
new_doc = as_json
|
19
|
+
ref_doc = ref == :total ? initial_doc : original_doc
|
20
|
+
Ecoportal::API::Common::HashDiff.diff(new_doc, ref_doc, ignore: ignore).yield_self do |out|
|
21
|
+
next out unless sym_keys
|
22
|
+
Ecoportal::API::Common::GraphQL::HashHelpers.keys_to_sym_deep(out)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def as_input(clientMutationId: "")
|
27
|
+
self.class.as_input(as_update(sym_keys: true), clientMutationId: clientMutationId)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
module Base
|
5
|
+
class Payload < Ecoportal::API::GraphQL::Base::Model
|
6
|
+
class GenericItem
|
7
|
+
def initialize(*args, **kargs)
|
8
|
+
raise "Missuse error. You should define a item_class for a class that inherits from GraphqlPayload class."
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
passthrough :clientMutationId
|
13
|
+
|
14
|
+
class_resolver :item_class, GenericItem
|
15
|
+
embeds_one :item, klass: :item_class
|
16
|
+
embeds_one :errors, klass: Ecoportal::API::GraphQL::Base::ValidationErrors, nullable: true
|
17
|
+
|
18
|
+
def success?
|
19
|
+
!errors || errors.empty?
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
module Base
|
5
|
+
class PersonMember < Ecoportal::API::GraphQL::Base::Model
|
6
|
+
passkey :id
|
7
|
+
passthrough :name, :email
|
8
|
+
passarray :tagRestrict, :userGroupIds
|
9
|
+
|
10
|
+
passthrough :personSchemaId
|
11
|
+
|
12
|
+
passthrough :contractorOrganizationId
|
13
|
+
passthrough :userId
|
14
|
+
|
15
|
+
passboolean :tracingAdmin
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
module Base
|
5
|
+
class Query
|
6
|
+
class GenericItem
|
7
|
+
def initialize(*args, **kargs)
|
8
|
+
raise "Missuse error. You should define a item_class for a class that inherits from Query class."
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
include Ecoportal::API::Common::GraphQL::ClassHelpers
|
13
|
+
|
14
|
+
inheritable_attrs :accepted_params
|
15
|
+
|
16
|
+
class << self
|
17
|
+
def accepted_params(*keys)
|
18
|
+
@accepted_params ||= []
|
19
|
+
return @accepted_params if keys.empty?
|
20
|
+
@accepted_params.push(*keys).tap {|ks| ks.uniq!}
|
21
|
+
end
|
22
|
+
|
23
|
+
def clear_accepted_params
|
24
|
+
@accepted_params = []
|
25
|
+
end
|
26
|
+
|
27
|
+
def slice_params(kargs)
|
28
|
+
kargs.slice(*accepted_params)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class_resolver :item_class, GenericItem
|
33
|
+
attr_reader :client
|
34
|
+
|
35
|
+
def initialize(client)
|
36
|
+
@client = client
|
37
|
+
end
|
38
|
+
|
39
|
+
def response_class
|
40
|
+
item_class
|
41
|
+
end
|
42
|
+
|
43
|
+
def access_point(path = [])
|
44
|
+
path.last
|
45
|
+
end
|
46
|
+
|
47
|
+
def request(*path)
|
48
|
+
response = yield
|
49
|
+
wrap_response(response, path)
|
50
|
+
end
|
51
|
+
|
52
|
+
def wrap_response(response, path = [])
|
53
|
+
raise "Complete failure on request. Path: #{path}" unless res = response.to_h.dig("data", *path)
|
54
|
+
data = Ecoportal::API::Common::GraphQL::HashHelpers.deep_dup(res)
|
55
|
+
response_class.new(data)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
module Base
|
5
|
+
class QueryConnection < Ecoportal::API::GraphQL::Base::Query
|
6
|
+
accepted_params :searchConf, :after, :before, :first, :last
|
7
|
+
include Enumerable
|
8
|
+
|
9
|
+
attr_reader :path
|
10
|
+
|
11
|
+
def initialize(*args, path: default_base_path, **kargs)
|
12
|
+
@path = path
|
13
|
+
super(*args, **kargs)
|
14
|
+
end
|
15
|
+
|
16
|
+
def query(path: default_base_path, **kargs, &block)
|
17
|
+
path ||= default_base_path
|
18
|
+
kargs = self.class.slice_params(kargs)
|
19
|
+
ap = access_point(path)
|
20
|
+
raise "Missuse. You have to implement this method in the child class"
|
21
|
+
end
|
22
|
+
|
23
|
+
def each(**kargs, &block)
|
24
|
+
return to_enum(:each, **kargs) unless block
|
25
|
+
cursor = nil; results = 0
|
26
|
+
loop do
|
27
|
+
kargs.update(after: cursor) if cursor
|
28
|
+
connection = query(**kargs)
|
29
|
+
#total = connection.totalCount
|
30
|
+
pageInfo = connection.pageInfo
|
31
|
+
connection.nodes.each do |item|
|
32
|
+
yield item
|
33
|
+
end
|
34
|
+
break unless cursor = pageInfo.endCursor
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def response_class
|
39
|
+
return connection_class if respond_to?(:connection_class)
|
40
|
+
@response_class ||= self.class.new_class(
|
41
|
+
item_class,
|
42
|
+
inherits: Ecoportal::API::GraphQL::Base::Connection,
|
43
|
+
namespace: "Ecoportal::API::GraphQL::Connection"
|
44
|
+
) do |klass|
|
45
|
+
klass.item_class = item_class
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def default_base_path
|
50
|
+
["currentOrganization"]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
module Base
|
5
|
+
class ValidationErrors < Ecoportal::API::GraphQL::Base::Model
|
6
|
+
include Enumerable
|
7
|
+
|
8
|
+
passthrough :details
|
9
|
+
passarray :fullMessages
|
10
|
+
|
11
|
+
def empty?
|
12
|
+
count < 1
|
13
|
+
end
|
14
|
+
|
15
|
+
def each(&block)
|
16
|
+
return to_enum(:each) unless block
|
17
|
+
fullMessages.each(&block)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
module Base
|
5
|
+
end
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'ecoportal/api/graphql/base/model'
|
11
|
+
require 'ecoportal/api/graphql/base/date_time'
|
12
|
+
require 'ecoportal/api/graphql/base/id_diff_input'
|
13
|
+
require 'ecoportal/api/graphql/base/page_info'
|
14
|
+
require 'ecoportal/api/graphql/base/query'
|
15
|
+
require 'ecoportal/api/graphql/base/connection'
|
16
|
+
require 'ecoportal/api/graphql/base/query_connection'
|
17
|
+
require 'ecoportal/api/graphql/base/validation_errors'
|
18
|
+
require 'ecoportal/api/graphql/base/payload'
|
19
|
+
require 'ecoportal/api/graphql/base/person_member'
|
20
|
+
require 'ecoportal/api/graphql/base/file_attachment'
|
21
|
+
require 'ecoportal/api/graphql/base/file_container'
|
22
|
+
require 'ecoportal/api/graphql/base/field'
|
23
|
+
require 'ecoportal/api/graphql/base/page'
|
24
|
+
require 'ecoportal/api/graphql/base/resource'
|
25
|
+
require 'ecoportal/api/graphql/base/action_category'
|
26
|
+
require 'ecoportal/api/graphql/base/action'
|
27
|
+
require 'ecoportal/api/graphql/base/contractor_entity'
|
28
|
+
require 'ecoportal/api/graphql/base/organization'
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
module Connection
|
5
|
+
end
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'ecoportal/api/graphql/connection/person_member'
|
11
|
+
require 'ecoportal/api/graphql/connection/contractor_entity'
|
12
|
+
require 'ecoportal/api/graphql/connection/action'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
class Fragment
|
5
|
+
fragment :ContractorEntity, <<~'GRAPHQL'
|
6
|
+
fragment on ContractorEntity {
|
7
|
+
id
|
8
|
+
name
|
9
|
+
schemaId
|
10
|
+
active
|
11
|
+
approved
|
12
|
+
associatedPeopleIds
|
13
|
+
leadContractorIds
|
14
|
+
}
|
15
|
+
GRAPHQL
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
class Fragment
|
5
|
+
class << self
|
6
|
+
def const?(value)
|
7
|
+
begin
|
8
|
+
const_get(value)
|
9
|
+
rescue NameError => e
|
10
|
+
return false
|
11
|
+
end
|
12
|
+
true
|
13
|
+
end
|
14
|
+
|
15
|
+
def fragment(sym, heredoc)
|
16
|
+
fragments[sym] = heredoc
|
17
|
+
end
|
18
|
+
|
19
|
+
def fragments
|
20
|
+
@fragments ||= {}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
attr_reader :client, :fragments
|
25
|
+
|
26
|
+
def initialize(client)
|
27
|
+
@client = client
|
28
|
+
parse
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def parse
|
34
|
+
fragments = self.class.fragments.each_with_object({}) do |(sym, heredoc), out|
|
35
|
+
if self.class.const?(sym)
|
36
|
+
fragment = self.class.get_const(sym)
|
37
|
+
else
|
38
|
+
fragment = client.parse(heredoc)
|
39
|
+
self.class.const_set(sym, fragment)
|
40
|
+
end
|
41
|
+
out[sym] = fragment
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
require 'ecoportal/api/graphql/fragment/contractor_entity'
|
50
|
+
require 'ecoportal/api/graphql/fragment/pagination'
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
module Input
|
5
|
+
class CreateContractorEntity < Ecoportal::API::GraphQL::Base::ContractorEntity
|
6
|
+
passthrough :clientMutationId
|
7
|
+
class_resolver :id_diff_input, "Ecoportal::API::GraphQL::Base::IdDiffInput"
|
8
|
+
embeds_one :associatedPeopleIds, klass: :id_diff_input
|
9
|
+
embeds_one :leadContractorIds, klass: :id_diff_input
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
module Input
|
5
|
+
class Search < Ecoportal::API::GraphQL::Base::Model
|
6
|
+
embeds_many :filters, enum_class: "Ecoportal::API::GraphQL::Input::SearchFilter"
|
7
|
+
passthrough :query
|
8
|
+
embeds_many :sorters, enum_class: "Ecoportal::API::GraphQL::Input::SearchSorter"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class GraphQL
|
4
|
+
module Input
|
5
|
+
end
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'ecoportal/api/graphql/input/search_filter'
|
11
|
+
require 'ecoportal/api/graphql/input/search_sorter'
|
12
|
+
require 'ecoportal/api/graphql/input/search'
|
13
|
+
require 'ecoportal/api/graphql/input/create_contractor_entity'
|
14
|
+
require 'ecoportal/api/graphql/input/update_contractor_entity'
|
15
|
+
require 'ecoportal/api/graphql/input/destroy_contractor_entity'
|