14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
# File 'lib/active_admin/graphql/schema_builder/query_type_policies.rb', line 14
def add_activeadmin_policies_query_field!(query_class, builder:, ns:, aa_by_graphql_type_name:)
resource_policy_type = Class.new(::GraphQL::Schema::Object) do
graphql_name "ActiveAdminResourcePolicies"
field :type_name, ::GraphQL::Types::String, null: false, camelize: false
field :activeadmin_policies, builder.send(:policy_set_type), null: false, camelize: false
end
page_policy_type = Class.new(::GraphQL::Schema::Object) do
graphql_name "ActiveAdminPagePolicies"
field :name, ::GraphQL::Types::String, null: false, camelize: false
field :activeadmin_policies, builder.send(:policy_set_type), null: false, camelize: false
end
record_policy_type = Class.new(::GraphQL::Schema::Object) do
graphql_name "ActiveAdminRecordPolicies"
field :id, ::GraphQL::Types::ID, null: false, camelize: false
field :activeadmin_policies, builder.send(:policy_set_type), null: false, camelize: false
end
matrix_type = Class.new(::GraphQL::Schema::Object) do
graphql_name "ActiveAdminPolicies"
field :resources, [resource_policy_type], null: false, camelize: false
field :pages, [page_policy_type], null: false, camelize: false
end
query_class.class_eval do
field :activeadmin_policies, matrix_type, null: false, camelize: false,
visibility: {kind: :query_activeadmin_policies}
field :activeadmin_policies_for, [record_policy_type], null: false, camelize: false,
visibility: {kind: :query_activeadmin_policies_for} do
argument :type_name, ::GraphQL::Types::String, required: true, camelize: false
argument :ids, [::GraphQL::Types::ID], required: true, camelize: false
argument :path, [KeyValuePairInput], required: false, camelize: false
end
define_method(:activeadmin_policies) do
auth = context[:auth]
resources = builder.send(:active_resources).map do |aa_res|
{
type_name: builder.send(:graphql_type_name_for, aa_res),
activeadmin_policies: builder.send(:build_policy_set, auth: auth, subject_owner: aa_res, subject: aa_res.resource_class, context: context)
}
end
pages = ns.resources.select { |r| r.is_a?(ActiveAdmin::Page) }.map do |page|
{
name: page.name,
activeadmin_policies: builder.send(:build_policy_set, auth: auth, subject_owner: page, subject: page, context: context)
}
end
{resources: resources, pages: pages}
end
define_method(:activeadmin_policies_for) do |type_name:, ids:, path: nil|
aa_res = aa_by_graphql_type_name[type_name.to_s]
raise ::GraphQL::ExecutionError, "unknown resource type_name #{type_name.inspect}" unless aa_res
proxy = ResourceQueryProxy.new(
aa_resource: aa_res,
user: context[:auth].user,
namespace: ns,
graph_params: KeyValuePairs.to_hash(path)
)
ids.map do |id|
record = proxy.find_member(id.to_s)
raise ::GraphQL::ExecutionError, "not found" unless record
{
id: id.to_s,
activeadmin_policies: builder.send(:build_policy_set, auth: context[:auth], subject_owner: aa_res, subject: record, context: context)
}
end
end
end
end
|