Discourse_api の sync_sso custom_fields がペイロード内で「custom.custom.<field>」として結果を返す

DiscourseApi::SingleSignOn は、カスタム属性を以下のように割り当てることを想定しています。

sso.custom_fields['field_1'] = 'value'

# これにより、ペイロード内に `custom.field_1` キーが生成されます

DiscourseApi::API::SSO.sync_sso() は、パラメータに以下を想定しています。

{ 'custom.field_1' => 'value' }

しかし、sso.custom_fieldscustom. プレフィックスを渡してしまいます。
その結果、ペイロードには以下が含まれてしまいます。

custom.custom.field_1

また、sync_sso に対して過剰なテストも追加しました。

「いいね!」 1

個人的にはもっとシンプルにできたと思いますが、既存のアプリを壊したくないので :grimacing:。SSO インスタンスの生成はユーザーに任せることにします。

# frozen_string_literal: true
module DiscourseApi
  module API
    module SSO
      def sync_sso(sso)
        post("/admin/users/sync_sso", sso.payload)
      end
    end
  end
end

明日には、もっときれいな形でこんな感じにできるかもしれません。

# frozen_string_literal: true
module DiscourseApi
  module API
    module SSO
      def sync_sso(params)
        if params.instance_of?(DiscourseApi::SingleSignOn)
          post("/admin/users/sync_sso", sso.payload) 
        elsif params.instance_of?(Hash)
          .... 現在のロジックと同じ
        end
      end
    end
  end
end

どう思いますか?理想としては、DiscourseApi::SingleSignOn を生成する単一の関数を持つアプリにして、それを sso_loginsync_sso に渡せるようにしたいです。

あるいは、パラメータを以下のように定義することもできます。

{
  sso_secret: ...
  name: ...
  custom_fields: {
    field_1: ...
  }
}

ただし、これも既存のアプリを壊すことになります。

「いいね!」 2

この問題は先月修正されました:

「いいね!」 2