diff options
Diffstat (limited to 'app/graphql/resolvers/todos_resolver.rb')
-rw-r--r-- | app/graphql/resolvers/todos_resolver.rb | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/app/graphql/resolvers/todos_resolver.rb b/app/graphql/resolvers/todos_resolver.rb new file mode 100644 index 00000000000..3e8dddb4859 --- /dev/null +++ b/app/graphql/resolvers/todos_resolver.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +module Resolvers + class TodosResolver < BaseResolver + type Types::TodoType.connection_type, null: true + + alias_method :target, :object + + argument :action, [Types::TodoActionEnum], + required: false, + description: 'Action to be filtered.' + + argument :author_id, [GraphQL::Types::ID], + required: false, + description: 'ID of an author.' + + argument :project_id, [GraphQL::Types::ID], + required: false, + description: 'ID of a project.' + + argument :group_id, [GraphQL::Types::ID], + required: false, + description: 'ID of a group.' + + argument :state, [Types::TodoStateEnum], + required: false, + description: 'State of the todo.' + + argument :type, [Types::TodoTargetEnum], + required: false, + description: 'Type of the todo.' + + before_connection_authorization do |nodes, current_user| + Preloaders::UserMaxAccessLevelInProjectsPreloader.new( + nodes.map(&:project).compact, + current_user + ).execute + end + + def resolve(**args) + return Todo.none unless current_user.present? && target.present? + return Todo.none if target.is_a?(User) && target != current_user + + TodosFinder.new(current_user, todo_finder_params(args)).execute.with_entity_associations + end + + private + + def todo_finder_params(args) + { + state: args[:state], + type: args[:type], + group_id: args[:group_id], + author_id: args[:author_id], + action_id: args[:action], + project_id: args[:project_id] + }.merge(target_params) + end + + def target_params + return {} unless TodosFinder::TODO_TYPES.include?(target.class.name) + + { + type: target.class.name, + target_id: target.id + } + end + end +end |