discourse_api 0.10.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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