Estou atualizando meus fóruns de 1.6 para 3.1, o que envolveu a migração para um novo servidor, restauração de backup e reconexão de tudo.
Usamos SSO para login em ambos, o que ainda funciona.
No entanto, o Discourse agora parece apresentar erros em algumas áreas aleatórias, o que está causando problemas na criação de contas a partir do site usando a API.
Estávamos usando a gem ruby discourse_api na versão 0.10.1, que atualizei para 0.48.1.
O erro ocorre em DiscourseApiService.new.user(self)
que chama resp = client.get("/users/by-external/#{user.id}")
que lança o erro {"errors"=>["O URL ou recurso solicitado não pôde ser encontrado."], "error_type"=>"not_found"}
Isso costumava funcionar bem, mas agora, por algum motivo, o URL não é encontrado.
Tentei rebaixar a gem discourse_api para 0.10.1 novamente, que é o que estávamos executando anteriormente, e ela passa pelo estágio client.get normalmente, mas falha na próxima chamada com o mesmo erro:
client.sync_sso(
{"errors"=>["O URL ou recurso solicitado não pôde ser encontrado."], "error_type"=>"not_found"}
Eu consegui resolver
Parece que eles atualizaram o código para realmente lançar um erro se nenhum usuário for encontrado, então tive que usar rescue em vez de comparar com nil?
begin
resp = client.get("/users/by-external/#{user.id}")
rescue DiscourseApi::NotFoundError => error
puts error.response.body['errors'].first
sync_user(user)
else
resp.response.env.body['user']
end
Além disso, a resposta mudou de resp['body']['user']
para resp.response.env.body['user']
Meu último problema restante é que, quando chamo client.sync_sso, recebo um erro interno do servidor 500 agora
Os logs mostram ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "user_emails_pkey")
No entanto, se eu usar os mesmos detalhes no terminal do Rails e executar client.sync_sso, ele funciona perfeitamente
Apenas para informação, eu não mudei o endpoint para que as partes acima voltassem a funcionar, então parece que /users/by-external/ ainda é válido