2013-02-05 14:16:51 -05:00
require_dependency 'rest_client'
2013-02-19 15:16:50 -05:00
require_dependency 'version'
2013-02-05 14:16:51 -05:00
2013-02-14 12:57:26 -05:00
module DiscourseHub
2013-02-05 14:16:51 -05:00
2014-03-12 12:39:27 -04:00
class UsernameUnavailable < RuntimeError
def initialize ( username )
@username = username
2013-08-25 22:41:17 +00:00
end
def response_message
{
success : false ,
message : I18n . t (
" login.errors " ,
errors : I18n . t (
2014-03-12 12:39:27 -04:00
" login.not_available " , suggestion : UserNameSuggester . suggest ( @username )
2013-08-25 22:41:17 +00:00
)
)
}
2013-09-11 16:32:49 -04:00
end
2013-08-25 22:41:17 +00:00
end
2013-02-05 14:16:51 -05:00
2014-03-12 12:39:27 -04:00
def self . username_available? ( username )
json = get ( '/users/username_available' , { username : username } )
2013-04-15 14:52:07 -04:00
[ json [ 'available' ] , json [ 'suggestion' ] ]
2013-02-05 14:16:51 -05:00
end
2014-03-12 12:39:27 -04:00
def self . username_match? ( username , email )
json = get ( '/users/username_match' , { username : username , email : email } )
2013-04-15 14:52:07 -04:00
[ json [ 'match' ] , json [ 'available' ] || false , json [ 'suggestion' ] ]
2013-02-05 14:16:51 -05:00
end
2014-03-12 12:39:27 -04:00
def self . username_for_email ( email )
json = get ( '/users/username_match' , { email : email } )
2013-11-19 14:15:05 -05:00
json [ 'suggestion' ]
end
2014-03-12 12:39:27 -04:00
def self . register_username ( username , email )
json = post ( '/users' , { username : username , email : email } )
2013-02-05 14:16:51 -05:00
if json . has_key? ( 'success' )
true
else
2014-03-12 12:39:27 -04:00
raise UsernameUnavailable . new ( username ) # TODO: report ALL the errors
2013-02-05 14:16:51 -05:00
end
end
2014-03-12 12:39:27 -04:00
def self . unregister_username ( username )
json = delete ( '/memberships/' + username )
2013-04-15 14:52:07 -04:00
json . has_key? ( 'success' )
end
2014-03-12 12:39:27 -04:00
def self . change_username ( current_username , new_username )
json = put ( " /users/ #{ current_username } /username " , { username : new_username } )
2013-02-12 10:13:09 -05:00
if json . has_key? ( 'success' )
true
else
2014-03-12 12:39:27 -04:00
raise UsernameUnavailable . new ( new_username ) # TODO: report ALL the errors
2013-02-12 10:13:09 -05:00
end
end
2014-05-12 09:06:28 +10:00
def self . version_check_payload
{
2013-03-01 16:01:36 -05:00
installed_version : Discourse :: VERSION :: STRING ,
forum_title : SiteSetting . title ,
2013-09-11 16:32:49 -04:00
forum_description : SiteSetting . site_description ,
2013-05-27 16:30:06 -04:00
forum_url : Discourse . base_url ,
2013-04-24 14:13:20 -04:00
contact_email : SiteSetting . contact_email ,
2013-05-27 16:30:06 -04:00
topic_count : Topic . listable_topics . count ,
2014-05-12 09:06:28 +10:00
post_count : Post . count ,
2013-07-30 17:52:19 -04:00
user_count : User . count ,
2014-05-12 09:06:28 +10:00
topics_7_days : Topic . listable_topics . where ( 'created_at > ?' , 7 . days . ago ) . count ,
posts_7_days : Post . where ( 'created_at > ?' , 7 . days . ago ) . count ,
users_7_days : User . where ( 'created_at > ?' , 7 . days . ago ) . count ,
2013-11-22 15:30:02 -05:00
login_required : SiteSetting . login_required ,
locale : SiteSetting . default_locale
2014-05-12 09:06:28 +10:00
}
end
def self . discourse_version_check
get ( '/version_check' , version_check_payload )
2013-02-05 14:16:51 -05:00
end
private
def self . get ( rel_url , params = { } )
2013-04-15 14:52:07 -04:00
singular_action :get , rel_url , params
2013-02-05 14:16:51 -05:00
end
def self . post ( rel_url , params = { } )
2013-04-15 14:52:07 -04:00
collection_action :post , rel_url , params
2013-02-05 14:16:51 -05:00
end
2013-02-12 10:13:09 -05:00
def self . put ( rel_url , params = { } )
2013-04-15 14:52:07 -04:00
collection_action :put , rel_url , params
end
def self . delete ( rel_url , params = { } )
singular_action :delete , rel_url , params
end
def self . singular_action ( action , rel_url , params = { } )
JSON . parse RestClient . send ( action , " #{ hub_base_url } #{ rel_url } " , { params : { access_token : access_token } . merge ( params ) , accept : accepts } )
end
def self . collection_action ( action , rel_url , params = { } )
JSON . parse RestClient . send ( action , " #{ hub_base_url } #{ rel_url } " , { access_token : access_token } . merge ( params ) , content_type : :json , accept : accepts )
2013-02-12 10:13:09 -05:00
end
2013-02-14 12:57:26 -05:00
def self . hub_base_url
2013-02-05 14:16:51 -05:00
if Rails . env == 'production'
'http://api.discourse.org/api'
else
2013-11-19 14:15:05 -05:00
ENV [ 'HUB_BASE_URL' ] || 'http://local.hub:3000/api'
2013-02-05 14:16:51 -05:00
end
end
def self . access_token
2013-03-05 13:53:23 -05:00
SiteSetting . discourse_org_access_key
2013-02-05 14:16:51 -05:00
end
def self . accepts
[ :json , 'application/vnd.discoursehub.v1' ]
end
2013-08-28 17:18:31 +10:00
2014-03-12 12:39:27 -04:00
def self . username_operation
2013-08-28 17:18:31 +10:00
if SiteSetting . call_discourse_hub?
begin
yield
2014-03-12 12:39:27 -04:00
rescue DiscourseHub :: UsernameUnavailable
2013-08-28 17:18:31 +10:00
false
rescue = > e
Rails . logger . error e . message + " \n " + e . backtrace . join ( " \n " )
end
end
end
2013-08-25 22:41:17 +00:00
end