discourse_api 0.10.1 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +21 -21
  3. data/.travis.yml +5 -7
  4. data/CHANGELOG.md +99 -85
  5. data/Gemfile +4 -4
  6. data/Guardfile +5 -5
  7. data/LICENSE.txt +22 -22
  8. data/README.md +73 -73
  9. data/Rakefile +7 -7
  10. data/discourse_api.gemspec +35 -33
  11. data/examples/backups.rb +18 -18
  12. data/examples/category.rb +21 -21
  13. data/examples/change_topic_status.rb +33 -0
  14. data/examples/create_topic.rb +23 -23
  15. data/examples/create_user.rb +14 -14
  16. data/examples/dashboard.rb +13 -13
  17. data/examples/disposable_invite_tokens.rb +18 -18
  18. data/examples/example.rb +9 -9
  19. data/examples/groups.rb +25 -25
  20. data/examples/invite_users.rb +15 -15
  21. data/examples/post_action.rb +25 -25
  22. data/examples/search.rb +9 -9
  23. data/examples/sso.rb +14 -14
  24. data/examples/topic_lists.rb +15 -15
  25. data/examples/update_user.rb +22 -22
  26. data/lib/discourse_api.rb +5 -5
  27. data/lib/discourse_api/api/api_key.rb +31 -31
  28. data/lib/discourse_api/api/backups.rb +24 -24
  29. data/lib/discourse_api/api/badges.rb +28 -28
  30. data/lib/discourse_api/api/categories.rb +57 -57
  31. data/lib/discourse_api/api/dashboard.rb +24 -24
  32. data/lib/discourse_api/api/email.rb +15 -15
  33. data/lib/discourse_api/api/groups.rb +52 -52
  34. data/lib/discourse_api/api/invite.rb +17 -17
  35. data/lib/discourse_api/api/notifications.rb +9 -9
  36. data/lib/discourse_api/api/params.rb +55 -55
  37. data/lib/discourse_api/api/posts.rb +41 -42
  38. data/lib/discourse_api/api/private_messages.rb +10 -10
  39. data/lib/discourse_api/api/search.rb +19 -19
  40. data/lib/discourse_api/api/sso.rb +22 -22
  41. data/lib/discourse_api/api/tags.rb +10 -10
  42. data/lib/discourse_api/api/topics.rb +78 -65
  43. data/lib/discourse_api/api/users.rb +85 -85
  44. data/lib/discourse_api/client.rb +133 -133
  45. data/lib/discourse_api/error.rb +17 -17
  46. data/lib/discourse_api/single_sign_on.rb +110 -110
  47. data/lib/discourse_api/version.rb +3 -3
  48. data/routes.txt +203 -203
  49. data/spec/discourse_api/api/api_key_spec.rb +121 -121
  50. data/spec/discourse_api/api/backups_spec.rb +23 -23
  51. data/spec/discourse_api/api/badges_spec.rb +40 -40
  52. data/spec/discourse_api/api/categories_spec.rb +87 -87
  53. data/spec/discourse_api/api/email_spec.rb +39 -39
  54. data/spec/discourse_api/api/groups_spec.rb +94 -94
  55. data/spec/discourse_api/api/notifications_spec.rb +24 -24
  56. data/spec/discourse_api/api/params_spec.rb +32 -32
  57. data/spec/discourse_api/api/posts_spec.rb +41 -29
  58. data/spec/discourse_api/api/private_messages_spec.rb +22 -22
  59. data/spec/discourse_api/api/search_spec.rb +30 -30
  60. data/spec/discourse_api/api/sso_spec.rb +16 -16
  61. data/spec/discourse_api/api/topics_spec.rb +113 -113
  62. data/spec/discourse_api/api/users_spec.rb +227 -227
  63. data/spec/discourse_api/client_spec.rb +115 -115
  64. data/spec/fixtures/api.json +12 -12
  65. data/spec/fixtures/backups.json +12 -12
  66. data/spec/fixtures/badges.json +569 -569
  67. data/spec/fixtures/categories.json +72 -72
  68. data/spec/fixtures/category_latest_topics.json +92 -92
  69. data/spec/fixtures/category_topics.json +91 -91
  70. data/spec/fixtures/email_list_all.json +749 -749
  71. data/spec/fixtures/email_settings.json +13 -13
  72. data/spec/fixtures/generate_api_key.json +12 -12
  73. data/spec/fixtures/generate_master_key.json +7 -7
  74. data/spec/fixtures/groups.json +18 -18
  75. data/spec/fixtures/hot.json +113 -113
  76. data/spec/fixtures/latest.json +115 -115
  77. data/spec/fixtures/members_0.json +403 -403
  78. data/spec/fixtures/members_1.json +363 -363
  79. data/spec/fixtures/new.json +113 -113
  80. data/spec/fixtures/notifications.json +16 -16
  81. data/spec/fixtures/post.json +94 -94
  82. data/spec/fixtures/post_action_users.json +18 -0
  83. data/spec/fixtures/private_messages.json +69 -69
  84. data/spec/fixtures/regenerate_api_key.json +7 -7
  85. data/spec/fixtures/search.json +24 -24
  86. data/spec/fixtures/topic.json +739 -739
  87. data/spec/fixtures/topic_invite_user.json +3 -3
  88. data/spec/fixtures/topics_created_by.json +49 -49
  89. data/spec/fixtures/update_trust_level.json +37 -37
  90. data/spec/fixtures/upload_avatar.json +13 -13
  91. data/spec/fixtures/user.json +65 -65
  92. data/spec/fixtures/user_activate_success.json +3 -3
  93. data/spec/fixtures/user_badges.json +170 -170
  94. data/spec/fixtures/user_create_success.json +5 -5
  95. data/spec/fixtures/user_grant_admin.json +37 -37
  96. data/spec/fixtures/user_list.json +583 -583
  97. data/spec/fixtures/user_log_out_success.json +3 -3
  98. data/spec/fixtures/user_update_avatar_success.json +3 -3
  99. data/spec/fixtures/user_update_user.json +3 -3
  100. data/spec/fixtures/user_update_username.json +4 -4
  101. data/spec/spec_helper.rb +61 -61
  102. metadata +31 -28
@@ -1,19 +1,19 @@
1
- module DiscourseApi
2
- module API
3
- module Search
4
- # Returns search results that match the specified term.
5
- #
6
- # @param term [String] a search term
7
- # @param options [Hash] A customizable set of options
8
- # @option options [String] :type_filter Returns results of the specified type.
9
- # @return [Array] Return results as an array of Hashes.
10
- def search(term, options={})
11
- raise ArgumentError.new("#{term} is required but not specified") unless term
12
- raise ArgumentError.new("#{term} is required but not specified") unless !term.empty?
13
-
14
- response = get('/search/query', options.merge(term: term))
15
- response[:body]
16
- end
17
- end
18
- end
19
- end
1
+ module DiscourseApi
2
+ module API
3
+ module Search
4
+ # Returns search results that match the specified term.
5
+ #
6
+ # @param term [String] a search term
7
+ # @param options [Hash] A customizable set of options
8
+ # @option options [String] :type_filter Returns results of the specified type.
9
+ # @return [Array] Return results as an array of Hashes.
10
+ def search(term, options={})
11
+ raise ArgumentError.new("#{term} is required but not specified") unless term
12
+ raise ArgumentError.new("#{term} is required but not specified") unless !term.empty?
13
+
14
+ response = get('/search/query', options.merge(term: term))
15
+ response[:body]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,22 +1,22 @@
1
- module DiscourseApi
2
- module API
3
- module SSO
4
- def sync_sso(params={})
5
- sso = DiscourseApi::SingleSignOn.new
6
- sso.sso_secret = params[:sso_secret]
7
- sso.name = params[:name]
8
- sso.username = params[:username]
9
- sso.email = params[:email]
10
- sso.external_id = params[:external_id]
11
- sso.suppress_welcome_message = params[:suppress_welcome_message] === true
12
- sso.avatar_url = params[:avatar_url]
13
- sso.avatar_force_update = params[:avatar_force_update] === true
14
- params.keys.select{|key| key.to_s.start_with?("custom") }.each do |custom_key|
15
- sso.custom_fields[custom_key] = params[custom_key]
16
- end
17
-
18
- post("/admin/users/sync_sso", sso.payload)
19
- end
20
- end
21
- end
22
- end
1
+ module DiscourseApi
2
+ module API
3
+ module SSO
4
+ def sync_sso(params={})
5
+ sso = DiscourseApi::SingleSignOn.new
6
+ sso.sso_secret = params[:sso_secret]
7
+ sso.name = params[:name]
8
+ sso.username = params[:username]
9
+ sso.email = params[:email]
10
+ sso.external_id = params[:external_id]
11
+ sso.suppress_welcome_message = params[:suppress_welcome_message] === true
12
+ sso.avatar_url = params[:avatar_url]
13
+ sso.avatar_force_update = params[:avatar_force_update] === true
14
+ params.keys.select{|key| key.to_s.start_with?("custom") }.each do |custom_key|
15
+ sso.custom_fields[custom_key] = params[custom_key]
16
+ end
17
+
18
+ post("/admin/users/sync_sso", sso.payload)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,10 +1,10 @@
1
- module DiscourseApi
2
- module API
3
- module Tags
4
- def show_tag(tag)
5
- response = get("/tags/#{tag}")
6
- response[:body]
7
- end
8
- end
9
- end
10
- end
1
+ module DiscourseApi
2
+ module API
3
+ module Tags
4
+ def show_tag(tag)
5
+ response = get("/tags/#{tag}")
6
+ response[:body]
7
+ end
8
+ end
9
+ end
10
+ end
@@ -1,65 +1,78 @@
1
- module DiscourseApi
2
- module API
3
- module Topics
4
- # :category OPTIONAL name of category, not ID
5
- # :skip_validations OPTIONAL boolean
6
- # :auto_track OPTIONAL boolean
7
- def create_topic(args={})
8
- args = API.params(args)
9
- .required(:title, :raw)
10
- .optional(:skip_validations, :category, :auto_track)
11
- post("/posts", args.to_h)
12
- end
13
-
14
- def create_topic_action(args)
15
- args = API.params(args)
16
- .required(:id, :post_action_type_id)
17
- post("/post_actions", args.to_h.merge(flag_topic: true))
18
- end
19
-
20
- def latest_topics(params={})
21
- response = get('/latest.json', params)
22
- response[:body]['topic_list']['topics']
23
- end
24
-
25
- def new_topics(params={})
26
- response = get("/new.json", params)
27
- response[:body]['topic_list']['topics']
28
- end
29
-
30
- def rename_topic(topic_id, title)
31
- put("/t/#{topic_id}.json", { topic_id: topic_id, title: title })
32
- end
33
-
34
- def recategorize_topic(topic_id, category_id)
35
- put("/t/#{topic_id}.json", { topic_id: topic_id, category_id: category_id })
36
- end
37
-
38
- def topic(id, params={})
39
- response = get("/t/#{id}.json", params)
40
- response[:body]
41
- end
42
-
43
- def topics_by(username, params={})
44
- response = get("/topics/created-by/#{username}.json", params)
45
- response[:body]['topic_list']['topics']
46
- end
47
-
48
- def delete_topic(id)
49
- delete("/t/#{id}.json")
50
- end
51
-
52
- def topic_posts(topic_id, post_ids=[])
53
- url = "/t/#{topic_id}/posts.json"
54
- if post_ids.count > 0
55
- url << '?'
56
- post_ids.each do |id|
57
- url << "post_ids[]=#{id}&"
58
- end
59
- end
60
- response = get(url)
61
- response[:body]
62
- end
63
- end
64
- end
65
- end
1
+ module DiscourseApi
2
+ module API
3
+ module Topics
4
+ # :category OPTIONAL name of category, not ID
5
+ # :skip_validations OPTIONAL boolean
6
+ # :auto_track OPTIONAL boolean
7
+ # :created_at OPTIONAL seconds since epoch.
8
+ def create_topic(args={})
9
+ args = API.params(args)
10
+ .required(:title, :raw)
11
+ .optional(:skip_validations, :category, :auto_track, :created_at, :api_username)
12
+ post("/posts", args.to_h)
13
+ end
14
+
15
+ def create_topic_action(args)
16
+ args = API.params(args)
17
+ .required(:id, :post_action_type_id)
18
+ post("/post_actions", args.to_h.merge(flag_topic: true))
19
+ end
20
+
21
+ # timestamp is seconds past the epoch.
22
+ def edit_topic_timestamp(topic_id,timestamp)
23
+ put("/t/#{topic_id}/change-timestamp", { timestamp: timestamp })
24
+ end
25
+
26
+ def latest_topics(params={})
27
+ response = get('/latest.json', params)
28
+ response[:body]['topic_list']['topics']
29
+ end
30
+
31
+ def new_topics(params={})
32
+ response = get("/new.json", params)
33
+ response[:body]['topic_list']['topics']
34
+ end
35
+
36
+ def rename_topic(topic_id, title)
37
+ put("/t/#{topic_id}.json", { topic_id: topic_id, title: title })
38
+ end
39
+
40
+ def recategorize_topic(topic_id, category_id)
41
+ put("/t/#{topic_id}.json", { topic_id: topic_id, category_id: category_id })
42
+ end
43
+
44
+ def change_topic_status(topic_slug, topic_id, params={})
45
+ params = API.params(params)
46
+ .required(:status, :enabled)
47
+ .optional(:api_username)
48
+ put("/t/#{topic_slug}/#{topic_id}/status", params.to_h)
49
+ end
50
+
51
+ def topic(id, params={})
52
+ response = get("/t/#{id}.json", params)
53
+ response[:body]
54
+ end
55
+
56
+ def topics_by(username, params={})
57
+ response = get("/topics/created-by/#{username}.json", params)
58
+ response[:body]['topic_list']['topics']
59
+ end
60
+
61
+ def delete_topic(id)
62
+ delete("/t/#{id}.json")
63
+ end
64
+
65
+ def topic_posts(topic_id, post_ids=[])
66
+ url = "/t/#{topic_id}/posts.json"
67
+ if post_ids.count > 0
68
+ url << '?'
69
+ post_ids.each do |id|
70
+ url << "post_ids[]=#{id}&"
71
+ end
72
+ end
73
+ response = get(url)
74
+ response[:body]
75
+ end
76
+ end
77
+ end
78
+ end
@@ -1,85 +1,85 @@
1
- module DiscourseApi
2
- module API
3
- module Users
4
- def activate(id)
5
- put "/admin/users/#{id}/activate", api_key: api_key, api_username: api_username
6
- end
7
-
8
- def user(username, params={})
9
- response = get("/users/#{username}.json", params)
10
- response[:body]['user']
11
- end
12
-
13
- def user_sso(username)
14
- response = get("/admin/users/#{username.downcase}")
15
- response[:body]['single_sign_on_record']
16
- end
17
-
18
- def update_avatar(args)
19
- args = API.params(args)
20
- .required(:username)
21
- .optional(:file, :url)
22
- .default(type: 'avatar', synchronous: true)
23
- .to_h
24
- upload_response = post("/uploads", args)
25
- put("/users/#{args[:username]}/preferences/avatar/pick", { upload_id: upload_response['id'] })
26
- end
27
-
28
- def update_email(username, email)
29
- put("/users/#{username}/preferences/email", { email: email, api_key: api_key })
30
- end
31
-
32
- def update_user(username, params={})
33
- put("/users/#{username}", params)
34
- end
35
-
36
- def update_username(username, new_username)
37
- put("/users/#{username}/preferences/username", { new_username: new_username, api_key: api_key })
38
- end
39
-
40
- def update_trust_level(args)
41
- args = API.params(args)
42
- .required(:user_id, :level)
43
- .to_h
44
- response = put("/admin/users/#{args[:user_id]}/trust_level", args)
45
- response[:body]
46
- end
47
-
48
- def create_user(args)
49
- args = API.params(args)
50
- .required(:name, :email, :password, :username)
51
- .optional(:active)
52
- .to_h
53
- post("/users", args)
54
- end
55
-
56
- def log_out(id)
57
- post("/admin/users/#{id}/log_out")
58
- end
59
-
60
- def invite_admin(args={})
61
- post("/admin/users/invite_admin", args)
62
- end
63
-
64
- def list_users(type)
65
- response = get("admin/users/list/#{type}.json")
66
- response[:body]
67
- end
68
-
69
- def grant_admin(user_id)
70
- response = put("admin/users/#{user_id}/grant_admin")
71
- response[:body]
72
- end
73
-
74
- def revoke_admin(user_id)
75
- response = put("admin/users/#{user_id}/revoke_admin")
76
- response[:body]
77
- end
78
-
79
- def by_external_id(external_id)
80
- response = get("/users/by-external/#{external_id}")
81
- response[:body]['user']
82
- end
83
- end
84
- end
85
- end
1
+ module DiscourseApi
2
+ module API
3
+ module Users
4
+ def activate(id)
5
+ put "/admin/users/#{id}/activate", api_key: api_key, api_username: api_username
6
+ end
7
+
8
+ def user(username, params={})
9
+ response = get("/users/#{username}.json", params)
10
+ response[:body]['user']
11
+ end
12
+
13
+ def user_sso(username)
14
+ response = get("/admin/users/#{username.downcase}")
15
+ response[:body]['single_sign_on_record']
16
+ end
17
+
18
+ def update_avatar(args)
19
+ args = API.params(args)
20
+ .required(:username)
21
+ .optional(:file, :url)
22
+ .default(type: 'avatar', synchronous: true)
23
+ .to_h
24
+ upload_response = post("/uploads", args)
25
+ put("/users/#{args[:username]}/preferences/avatar/pick", { upload_id: upload_response['id'] })
26
+ end
27
+
28
+ def update_email(username, email)
29
+ put("/users/#{username}/preferences/email", { email: email, api_key: api_key })
30
+ end
31
+
32
+ def update_user(username, params={})
33
+ put("/users/#{username}", params)
34
+ end
35
+
36
+ def update_username(username, new_username)
37
+ put("/users/#{username}/preferences/username", { new_username: new_username, api_key: api_key })
38
+ end
39
+
40
+ def update_trust_level(args)
41
+ args = API.params(args)
42
+ .required(:user_id, :level)
43
+ .to_h
44
+ response = put("/admin/users/#{args[:user_id]}/trust_level", args)
45
+ response[:body]
46
+ end
47
+
48
+ def create_user(args)
49
+ args = API.params(args)
50
+ .required(:name, :email, :password, :username)
51
+ .optional(:active, :staged)
52
+ .to_h
53
+ post("/users", args)
54
+ end
55
+
56
+ def log_out(id)
57
+ post("/admin/users/#{id}/log_out")
58
+ end
59
+
60
+ def invite_admin(args={})
61
+ post("/admin/users/invite_admin", args)
62
+ end
63
+
64
+ def list_users(type)
65
+ response = get("admin/users/list/#{type}.json")
66
+ response[:body]
67
+ end
68
+
69
+ def grant_admin(user_id)
70
+ response = put("admin/users/#{user_id}/grant_admin")
71
+ response[:body]
72
+ end
73
+
74
+ def revoke_admin(user_id)
75
+ response = put("admin/users/#{user_id}/revoke_admin")
76
+ response[:body]
77
+ end
78
+
79
+ def by_external_id(external_id)
80
+ response = get("/users/by-external/#{external_id}")
81
+ response[:body]['user']
82
+ end
83
+ end
84
+ end
85
+ end
@@ -1,133 +1,133 @@
1
- require 'faraday'
2
- require 'faraday_middleware'
3
- require 'json'
4
- require 'discourse_api/version'
5
- require 'discourse_api/api/categories'
6
- require 'discourse_api/api/search'
7
- require 'discourse_api/api/sso'
8
- require 'discourse_api/api/tags'
9
- require 'discourse_api/api/topics'
10
- require 'discourse_api/api/posts'
11
- require 'discourse_api/api/users'
12
- require 'discourse_api/api/groups'
13
- require 'discourse_api/api/invite'
14
- require 'discourse_api/api/private_messages'
15
- require 'discourse_api/api/notifications'
16
- require 'discourse_api/api/badges'
17
- require 'discourse_api/api/email'
18
- require 'discourse_api/api/api_key'
19
- require 'discourse_api/api/backups'
20
- require 'discourse_api/api/dashboard'
21
-
22
- module DiscourseApi
23
- class Client
24
- attr_accessor :api_key, :api_username
25
- attr_reader :host
26
-
27
- include DiscourseApi::API::Categories
28
- include DiscourseApi::API::Search
29
- include DiscourseApi::API::SSO
30
- include DiscourseApi::API::Tags
31
- include DiscourseApi::API::Topics
32
- include DiscourseApi::API::Posts
33
- include DiscourseApi::API::Users
34
- include DiscourseApi::API::Groups
35
- include DiscourseApi::API::Invite
36
- include DiscourseApi::API::PrivateMessages
37
- include DiscourseApi::API::Notifications
38
- include DiscourseApi::API::Badges
39
- include DiscourseApi::API::Email
40
- include DiscourseApi::API::ApiKey
41
- include DiscourseApi::API::Backups
42
- include DiscourseApi::API::Dashboard
43
-
44
- def initialize(host, api_key = nil, api_username = nil)
45
- raise ArgumentError, 'host needs to be defined' if host.nil? || host.empty?
46
- @host = host
47
- @api_key = api_key
48
- @api_username = api_username
49
- end
50
-
51
- def connection_options
52
- @connection_options ||= {
53
- url: @host,
54
- headers: {
55
- accept: 'application/json',
56
- user_agent: user_agent,
57
- }
58
- }
59
- end
60
-
61
- def ssl(options)
62
- connection_options[:ssl] = options
63
- end
64
-
65
- def delete(path, params={})
66
- request(:delete, path, params)
67
- end
68
-
69
- def get(path, params={})
70
- request(:get, path, params)
71
- end
72
-
73
- def post(path, params={})
74
- response = request(:post, path, params)
75
- case response.status
76
- when 200
77
- response.body
78
- else
79
- raise DiscourseApi::Error, response.body
80
- end
81
- end
82
-
83
- def put(path, params={})
84
- request(:put, path, params)
85
- end
86
-
87
- def patch(path, params={})
88
- request(:patch, path, params)
89
- end
90
-
91
- def user_agent
92
- @user_agent ||= "DiscourseAPI Ruby Gem #{DiscourseApi::VERSION}"
93
- end
94
-
95
- private
96
-
97
- def connection
98
- @connection ||= Faraday.new connection_options do |conn|
99
- # Follow redirects
100
- conn.use FaradayMiddleware::FollowRedirects, limit: 5
101
- # Convert request params to "www-form-encoded"
102
- conn.request :url_encoded
103
- # Parse responses as JSON
104
- conn.use FaradayMiddleware::ParseJson, content_type: 'application/json'
105
- # Use Faraday's default HTTP adapter
106
- conn.adapter Faraday.default_adapter
107
- #pass api_key and api_username on every request
108
- unless api_username.nil?
109
- conn.params['api_key'] = api_key
110
- conn.params['api_username'] = api_username
111
- end
112
- end
113
- end
114
-
115
- def request(method, path, params={})
116
- unless Hash === params
117
- params = params.to_h if params.respond_to? :to_h
118
- end
119
- response = connection.send(method.to_sym, path, params)
120
- handle_error(response)
121
- response.env
122
- rescue Faraday::Error::ClientError, JSON::ParserError
123
- raise DiscourseApi::Error
124
- end
125
-
126
- def handle_error(response)
127
- case response.status
128
- when 403
129
- raise DiscourseApi::UnauthenticatedError.new(response.env[:body])
130
- end
131
- end
132
- end
133
- end
1
+ require 'faraday'
2
+ require 'faraday_middleware'
3
+ require 'json'
4
+ require 'discourse_api/version'
5
+ require 'discourse_api/api/categories'
6
+ require 'discourse_api/api/search'
7
+ require 'discourse_api/api/sso'
8
+ require 'discourse_api/api/tags'
9
+ require 'discourse_api/api/topics'
10
+ require 'discourse_api/api/posts'
11
+ require 'discourse_api/api/users'
12
+ require 'discourse_api/api/groups'
13
+ require 'discourse_api/api/invite'
14
+ require 'discourse_api/api/private_messages'
15
+ require 'discourse_api/api/notifications'
16
+ require 'discourse_api/api/badges'
17
+ require 'discourse_api/api/email'
18
+ require 'discourse_api/api/api_key'
19
+ require 'discourse_api/api/backups'
20
+ require 'discourse_api/api/dashboard'
21
+
22
+ module DiscourseApi
23
+ class Client
24
+ attr_accessor :api_key, :api_username
25
+ attr_reader :host
26
+
27
+ include DiscourseApi::API::Categories
28
+ include DiscourseApi::API::Search
29
+ include DiscourseApi::API::SSO
30
+ include DiscourseApi::API::Tags
31
+ include DiscourseApi::API::Topics
32
+ include DiscourseApi::API::Posts
33
+ include DiscourseApi::API::Users
34
+ include DiscourseApi::API::Groups
35
+ include DiscourseApi::API::Invite
36
+ include DiscourseApi::API::PrivateMessages
37
+ include DiscourseApi::API::Notifications
38
+ include DiscourseApi::API::Badges
39
+ include DiscourseApi::API::Email
40
+ include DiscourseApi::API::ApiKey
41
+ include DiscourseApi::API::Backups
42
+ include DiscourseApi::API::Dashboard
43
+
44
+ def initialize(host, api_key = nil, api_username = nil)
45
+ raise ArgumentError, 'host needs to be defined' if host.nil? || host.empty?
46
+ @host = host
47
+ @api_key = api_key
48
+ @api_username = api_username
49
+ end
50
+
51
+ def connection_options
52
+ @connection_options ||= {
53
+ url: @host,
54
+ headers: {
55
+ accept: 'application/json',
56
+ user_agent: user_agent,
57
+ }
58
+ }
59
+ end
60
+
61
+ def ssl(options)
62
+ connection_options[:ssl] = options
63
+ end
64
+
65
+ def delete(path, params={})
66
+ request(:delete, path, params)
67
+ end
68
+
69
+ def get(path, params={})
70
+ request(:get, path, params)
71
+ end
72
+
73
+ def post(path, params={})
74
+ response = request(:post, path, params)
75
+ case response.status
76
+ when 200
77
+ response.body
78
+ else
79
+ raise DiscourseApi::Error, response.body
80
+ end
81
+ end
82
+
83
+ def put(path, params={})
84
+ request(:put, path, params)
85
+ end
86
+
87
+ def patch(path, params={})
88
+ request(:patch, path, params)
89
+ end
90
+
91
+ def user_agent
92
+ @user_agent ||= "DiscourseAPI Ruby Gem #{DiscourseApi::VERSION}"
93
+ end
94
+
95
+ private
96
+
97
+ def connection
98
+ @connection ||= Faraday.new connection_options do |conn|
99
+ # Follow redirects
100
+ conn.use FaradayMiddleware::FollowRedirects, limit: 5
101
+ # Convert request params to "www-form-encoded"
102
+ conn.request :url_encoded
103
+ # Parse responses as JSON
104
+ conn.use FaradayMiddleware::ParseJson, content_type: 'application/json'
105
+ # Use Faraday's default HTTP adapter
106
+ conn.adapter Faraday.default_adapter
107
+ #pass api_key and api_username on every request
108
+ unless api_username.nil?
109
+ conn.params['api_key'] = api_key
110
+ conn.params['api_username'] = api_username
111
+ end
112
+ end
113
+ end
114
+
115
+ def request(method, path, params={})
116
+ unless Hash === params
117
+ params = params.to_h if params.respond_to? :to_h
118
+ end
119
+ response = connection.send(method.to_sym, path, params)
120
+ handle_error(response)
121
+ response.env
122
+ rescue Faraday::Error::ClientError, JSON::ParserError
123
+ raise DiscourseApi::Error
124
+ end
125
+
126
+ def handle_error(response)
127
+ case response.status
128
+ when 403
129
+ raise DiscourseApi::UnauthenticatedError.new(response.env[:body])
130
+ end
131
+ end
132
+ end
133
+ end