Просмотр исходного кода

Maintenance: Refactor handling of object attributes in GraphQL.

Martin Gruner 2 лет назад
Родитель
Сommit
5d52133d97

+ 0 - 2
app/graphql/gql/mutations/base_mutation.rb

@@ -7,8 +7,6 @@ module Gql::Mutations
     include Gql::Concerns::HasNestedGraphqlName
     include Gql::Concerns::HandlesServices
 
-    include Gql::Mutations::Concerns::HandlesObjectAttributeValues
-
     # FIXME: Remove when all mutations are using services which are taking care of this flag.
     include Gql::Mutations::Concerns::HandlesCoreWorkflow
 

+ 0 - 19
app/graphql/gql/mutations/concerns/handles_object_attribute_values.rb

@@ -1,19 +0,0 @@
-# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
-
-module Gql::Mutations::Concerns::HandlesObjectAttributeValues
-  extend ActiveSupport::Concern
-
-  included do
-    def convert_object_attribute_values(params)
-      return if !params.key?(:object_attribute_values)
-
-      params[:object_attribute_values].each do |object_attribute|
-        params[object_attribute[:name]] = object_attribute[:value]
-      end
-
-      params.delete(:object_attribute_values)
-
-      true
-    end
-  end
-end

+ 0 - 1
app/graphql/gql/mutations/organization/update.rb

@@ -27,7 +27,6 @@ module Gql::Mutations
     def update(current_organization, input)
       params = input.to_h
 
-      convert_object_attribute_values(params)
       set_core_workflow_information(params, ::Organization, 'update')
 
       current_organization.with_lock do

+ 0 - 2
app/graphql/gql/mutations/user/add.rb

@@ -21,8 +21,6 @@ module Gql::Mutations
     def add(input)
       user_data = input.to_h
 
-      convert_object_attribute_values(user_data)
-
       execute_service(::User::AddInternalService, user_data: user_data)
     end
   end

+ 0 - 1
app/graphql/gql/mutations/user/update.rb

@@ -26,7 +26,6 @@ module Gql::Mutations
     def update(current_user, input)
       user_data = input.to_h
 
-      convert_object_attribute_values(user_data)
       set_core_workflow_information(user_data, ::User, 'update')
       execute_service(::User::CheckAttributesService, user_data: user_data)
 

+ 24 - 0
app/graphql/gql/types/base_input_object.rb

@@ -6,5 +6,29 @@ module Gql::Types
     include Gql::Concerns::HasNestedGraphqlName
 
     argument_class Gql::Types::BaseArgument
+
+    # Add the possibility to specify custom value transformation handlers.
+    #
+    #   transform :my_transformer
+    #
+    #   def my_transformer(payload)
+    #     ... # return modified payload
+    #   end
+    class << self
+      def transformers
+        @transformers || []
+      end
+
+      def transform(function_name)
+        @transformers ||= []
+        @transformers.push(function_name)
+      end
+    end
+
+    def prepare
+      self.class.transformers.reduce(super) do |result, t|
+        send(t, result)
+      end
+    end
   end
 end

+ 11 - 2
app/graphql/gql/types/input/concerns/provides_object_attribute_values.rb

@@ -4,8 +4,17 @@ module Gql::Types::Input::Concerns::ProvidesObjectAttributeValues
   extend ActiveSupport::Concern
 
   included do
-    description 'Provides names and values for custom object fields'
-
     argument :object_attribute_values, [Gql::Types::Input::ObjectAttributeValueInputType], required: false, description: 'Additional custom attributes (names + values)'
+
+    transform :transform_object_attribute_values
+
+    def transform_object_attribute_values(payload)
+      payload.to_h.tap do |result|
+        result.delete(:object_attribute_values)
+        object_attribute_values&.each do |object_attribute|
+          result[object_attribute[:name]] = object_attribute[:value]
+        end
+      end
+    end
   end
 end