Discourse_api sync_sso custom_fields resulta em "custom.custom.<field>" no payload

DiscourseApi::SingleSignOn espera que atributos personalizados sejam atribuídos assim:

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

# o que resulta na chave `custom.field_1` no payload

DiscourseApi::API::SSO.sync_sso() espera que os parâmetros tenham:

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

Mas ele passa o prefixo custom. para sso.custom_fields
Isso resulta no payload tendo:

custom.custom.field_1

Também adicionei alguns testes excessivos para sync_sso

1 curtida

Isso teria sido muito mais simples, na minha opinião, mas não quero quebrar aplicativos existentes :grimacing:. Deixe a geração da instância de SSO por conta do usuário.

# 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

Talvez amanhã eu faça algo assim (mas mais elegante)

# 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)
          .... mesmo que o atual
        end
      end
    end
  end
end

O que acham? Idealmente, meu aplicativo terá uma única função que gera DiscourseApi::SingleSignOn, e assim poderei passá-la para sso_login ou sync_sso.

Ou os parâmetros podem ser definidos assim:

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

O que também quebraria aplicativos existentes.

2 curtidas

Uma correção foi feita para isso no mês passado:

2 curtidas