discourse_api 0.46.0 → 0.48.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +28 -0
- data/examples/invite_users.rb +21 -3
- data/examples/notifications.rb +3 -0
- data/lib/discourse_api/api/dashboard.rb +2 -2
- data/lib/discourse_api/api/groups.rb +15 -4
- data/lib/discourse_api/api/invite.rb +67 -2
- data/lib/discourse_api/api/notifications.rb +5 -2
- data/lib/discourse_api/api/private_messages.rb +10 -3
- data/lib/discourse_api/api/site_settings.rb +3 -3
- data/lib/discourse_api/api/users.rb +4 -0
- data/lib/discourse_api/error.rb +1 -1
- data/lib/discourse_api/single_sign_on.rb +45 -11
- data/lib/discourse_api/version.rb +1 -1
- data/spec/discourse_api/api/groups_spec.rb +29 -0
- data/spec/discourse_api/api/invite_spec.rb +123 -0
- data/spec/discourse_api/api/private_messages_spec.rb +4 -4
- data/spec/discourse_api/api/sso_spec.rb +4 -4
- data/spec/discourse_api/api/topics_spec.rb +3 -3
- data/spec/discourse_api/api/users_spec.rb +14 -0
- data/spec/discourse_api/client_spec.rb +6 -0
- data/spec/fixtures/retrieve_invite.json +116 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80a9809c17206520d47904326a0f42571ffdfccf5af07fee84e517bf52af81bc
|
4
|
+
data.tar.gz: 0d7f9a78732e3a084f272ae4cc1e5c35de8dc938a6326d0f08d052ac38163248
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c6b7abab4c2c7febbe201a2dba4698930d327f77343e4eefec1261a4e87004b8957d4dcb06ee9d94caf57b56b8a8a12c908d292832a252912a898ccc44d96ca
|
7
|
+
data.tar.gz: 9b7490943e570a12cca7a6c69998c4eba8d2fdd06df8e301a5cbc1444524238a7372becd8c58bb6b0c4ee8f7e8323056ebc682994bbaaae9784f18f2705f03d4
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [0.48.1] - 2022-04-13
|
10
|
+
### Added
|
11
|
+
- New attributes for Discourse Connect (aka SSO)
|
12
|
+
|
13
|
+
## [0.48.0] - 2022-01-28
|
14
|
+
### Added
|
15
|
+
- `group_add_owners` method (#239)
|
16
|
+
- `group_remove_owners` method (#239)
|
17
|
+
- `anonymize` method (#241)
|
18
|
+
|
19
|
+
### Changed
|
20
|
+
- `DiscourseApi::Timeout` error now inherits from `DiscourseApi::Error` (#240)
|
21
|
+
- `DiscourseApi::SingleSignOn#groups` now returns an array of strings where each string is a group name, rather than an array with a single string that contains all the groups comma-concatenated (#243)
|
22
|
+
|
23
|
+
## [0.47.0] - 2021-07-19
|
24
|
+
### Added
|
25
|
+
- Update invite method
|
26
|
+
- Retrieve invite method
|
27
|
+
- Destroy all expired invites method
|
28
|
+
- Destroy invite method
|
29
|
+
- Resend all invites method
|
30
|
+
- Resend invite method
|
31
|
+
- Pass params to get notifications API
|
32
|
+
|
33
|
+
### Deprecated
|
34
|
+
- `invite_user_to_topic` has been deprecated, use `invite_to_topic` instead.
|
35
|
+
- `create_private_message` has been deprecated, use `create_pm` instead.
|
36
|
+
|
9
37
|
## [0.46.0] - 2021-04-12
|
10
38
|
### Added
|
11
39
|
- Allow bookmarking topics
|
data/examples/invite_users.rb
CHANGED
@@ -9,10 +9,28 @@ client.api_key = config['api_key'] || "YOUR_API_KEY"
|
|
9
9
|
client.api_username = config['api_username'] || "YOUR_USERNAME"
|
10
10
|
|
11
11
|
# invite user
|
12
|
-
client.invite_user(email: "name@example.com", group_ids: "41,42")
|
12
|
+
invite = client.invite_user(email: "name@example.com", group_ids: "41,42")
|
13
|
+
|
14
|
+
#update invite
|
15
|
+
client.update_invite(invite["id"], email: "namee@example.com")
|
16
|
+
|
17
|
+
# resend invite
|
18
|
+
client.resend_invite("namee@example.com")
|
13
19
|
|
14
20
|
# invite to a topic
|
15
|
-
client.
|
21
|
+
client.invite_to_topic(1, email: "foo@bar.com")
|
16
22
|
|
17
23
|
# if the user is an admin you may invite to a group as well
|
18
|
-
client.
|
24
|
+
client.invite_to_topic(1, email: "foo@bar.com", group_ids: "1,2,3")
|
25
|
+
|
26
|
+
# retrieve invite
|
27
|
+
puts client.retrieve_invite(email: "foo@bar.com")
|
28
|
+
|
29
|
+
# resend all invites
|
30
|
+
client.resend_all_invites
|
31
|
+
|
32
|
+
# destroy invite
|
33
|
+
client.destroy_invite(invite["id"])
|
34
|
+
|
35
|
+
# destroy all expired invites
|
36
|
+
client.destroy_all_expired_invites
|
data/examples/notifications.rb
CHANGED
@@ -38,7 +38,6 @@ module DiscourseApi
|
|
38
38
|
:messageable_level,
|
39
39
|
:name,
|
40
40
|
:automatic_membership_email_domains,
|
41
|
-
:automatic_membership_retroactive,
|
42
41
|
:title,
|
43
42
|
:primary_group,
|
44
43
|
:grant_trust_level,
|
@@ -47,19 +46,31 @@ module DiscourseApi
|
|
47
46
|
:flair_bg_color,
|
48
47
|
:flair_color,
|
49
48
|
:bio_raw,
|
50
|
-
:
|
49
|
+
:visibility_level,
|
51
50
|
:public_admission,
|
52
51
|
:public_exit,
|
53
52
|
:allow_membership_requests,
|
54
53
|
:full_name,
|
55
54
|
:default_notification_level,
|
56
|
-
:usernames,
|
57
|
-
:owner_usernames,
|
58
55
|
:membership_request_template)
|
59
56
|
.to_h
|
60
57
|
put("/groups/#{group_id}", group: args)
|
61
58
|
end
|
62
59
|
|
60
|
+
def group_add_owners(group_id, args)
|
61
|
+
args = API.params(args)
|
62
|
+
.required(:usernames)
|
63
|
+
.to_h
|
64
|
+
put("/admin/groups/#{group_id}/owners.json", group: args)
|
65
|
+
end
|
66
|
+
|
67
|
+
def group_remove_owners(group_id, args)
|
68
|
+
args = API.params(args)
|
69
|
+
.required(:usernames)
|
70
|
+
.to_h
|
71
|
+
delete("/admin/groups/#{group_id}/owners.json", group: args)
|
72
|
+
end
|
73
|
+
|
63
74
|
def groups(args = {})
|
64
75
|
params = API.params(args)
|
65
76
|
.optional(:page)
|
@@ -3,17 +3,82 @@ module DiscourseApi
|
|
3
3
|
module API
|
4
4
|
module Invite
|
5
5
|
def invite_user(params = {})
|
6
|
-
|
6
|
+
args = API.params(params)
|
7
|
+
.optional(
|
8
|
+
:email,
|
9
|
+
:skip_email,
|
10
|
+
:custom_message,
|
11
|
+
:max_redemptions_allowed,
|
12
|
+
:topic_id,
|
13
|
+
:group_ids,
|
14
|
+
:expires_at
|
15
|
+
).to_h
|
16
|
+
|
17
|
+
post("/invites", args)
|
7
18
|
end
|
8
19
|
|
20
|
+
# TODO: Deprecated. Remove after 20220506
|
9
21
|
def invite_user_to_topic(params = {})
|
10
|
-
|
22
|
+
deprecated(__method__, 'invite_to_topic')
|
23
|
+
invite_to_topic(params[:topic_id], params)
|
24
|
+
end
|
25
|
+
|
26
|
+
def invite_to_topic(topic_id, params = {})
|
27
|
+
args = API.params(params)
|
28
|
+
.optional(
|
29
|
+
:email,
|
30
|
+
:user,
|
31
|
+
:group_ids,
|
32
|
+
:custom_message
|
33
|
+
).to_h
|
34
|
+
|
35
|
+
post("/t/#{topic_id}/invite", args)
|
36
|
+
end
|
37
|
+
|
38
|
+
def retrieve_invite(params = {})
|
39
|
+
args = API.params(params).required(:email).to_h
|
40
|
+
|
41
|
+
response = get("invites/retrieve.json", args)
|
42
|
+
|
43
|
+
response.body
|
11
44
|
end
|
12
45
|
|
13
46
|
# requires this plugin => https://github.com/discourse/discourse-invite-tokens
|
14
47
|
def disposable_tokens(params = {})
|
15
48
|
post("/invite-token/generate", params)
|
16
49
|
end
|
50
|
+
|
51
|
+
def update_invite(invite_id, params = {})
|
52
|
+
args = API.params(params)
|
53
|
+
.optional(
|
54
|
+
:topic_id,
|
55
|
+
:group_ids,
|
56
|
+
:group_names,
|
57
|
+
:email,
|
58
|
+
:send_email,
|
59
|
+
:custom_message,
|
60
|
+
:max_redemptions_allowed,
|
61
|
+
:expires_at
|
62
|
+
).to_h
|
63
|
+
|
64
|
+
put("invites/#{invite_id}", args)
|
65
|
+
end
|
66
|
+
|
67
|
+
def destroy_all_expired_invites
|
68
|
+
post("invites/destroy-all-expired")
|
69
|
+
end
|
70
|
+
|
71
|
+
def resend_all_invites
|
72
|
+
post("invites/reinvite-all")
|
73
|
+
end
|
74
|
+
|
75
|
+
def resend_invite(email)
|
76
|
+
post("invites/reinvite", { "email": email })
|
77
|
+
end
|
78
|
+
|
79
|
+
def destroy_invite(invite_id)
|
80
|
+
delete("/invites", { id: invite_id })
|
81
|
+
end
|
17
82
|
end
|
18
83
|
end
|
19
84
|
end
|
@@ -2,8 +2,11 @@
|
|
2
2
|
module DiscourseApi
|
3
3
|
module API
|
4
4
|
module Notifications
|
5
|
-
def notifications
|
6
|
-
|
5
|
+
def notifications(params = {})
|
6
|
+
params = API.params(params)
|
7
|
+
.optional(:username, :recent, :limit, :offset, :filter)
|
8
|
+
|
9
|
+
response = get('/notifications.json', params)
|
7
10
|
response[:body]
|
8
11
|
end
|
9
12
|
end
|
@@ -3,13 +3,20 @@ module DiscourseApi
|
|
3
3
|
module API
|
4
4
|
module PrivateMessages
|
5
5
|
|
6
|
-
# :
|
6
|
+
# TODO: Deprecated. Remove after 20220628
|
7
|
+
def create_private_message(args = {})
|
8
|
+
deprecated(__method__, 'create_pm')
|
9
|
+
args[:target_recipients] = args.delete :target_usernames
|
10
|
+
create_pm(args.to_h)
|
11
|
+
end
|
12
|
+
|
13
|
+
# :target_recipients REQUIRED comma separated list of usernames
|
7
14
|
# :category OPTIONAL name of category, not ID
|
8
15
|
# :created_at OPTIONAL seconds since epoch.
|
9
|
-
def
|
16
|
+
def create_pm(args = {})
|
10
17
|
args[:archetype] = 'private_message'
|
11
18
|
args = API.params(args)
|
12
|
-
.required(:title, :raw, :
|
19
|
+
.required(:title, :raw, :target_recipients, :archetype)
|
13
20
|
.optional(:category, :created_at, :api_username)
|
14
21
|
post("/posts", args.to_h)
|
15
22
|
end
|
@@ -3,10 +3,10 @@ module DiscourseApi
|
|
3
3
|
module API
|
4
4
|
module SiteSettings
|
5
5
|
def site_setting_update(args = {})
|
6
|
-
params = API.params(args)
|
7
|
-
.required(:name, :value).to_h
|
6
|
+
params = API.params(args).required(:name, :value).to_h
|
8
7
|
new_site_setting = { params[:name] => params[:value] }
|
9
|
-
|
8
|
+
|
9
|
+
put("/admin/site_settings/#{params[:name]}", new_site_setting)
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
@@ -102,6 +102,10 @@ module DiscourseApi
|
|
102
102
|
put("/admin/users/#{user_id}/unsuspend")
|
103
103
|
end
|
104
104
|
|
105
|
+
def anonymize(user_id)
|
106
|
+
put("/admin/users/#{user_id}/anonymize")
|
107
|
+
end
|
108
|
+
|
105
109
|
def delete_user(user_id, delete_posts = false)
|
106
110
|
delete("/admin/users/#{user_id}.json?delete_posts=#{delete_posts}")
|
107
111
|
end
|
data/lib/discourse_api/error.rb
CHANGED
@@ -5,18 +5,51 @@ require 'openssl'
|
|
5
5
|
|
6
6
|
module DiscourseApi
|
7
7
|
class SingleSignOn
|
8
|
-
ACCESSORS = [
|
9
|
-
|
10
|
-
|
8
|
+
ACCESSORS = [
|
9
|
+
:add_groups,
|
10
|
+
:admin,
|
11
|
+
:avatar_force_update,
|
12
|
+
:avatar_url,
|
13
|
+
:bio,
|
14
|
+
:card_background_url,
|
15
|
+
:confirmed_2fa,
|
16
|
+
:email,
|
17
|
+
:external_id,
|
18
|
+
:groups,
|
19
|
+
:locale,
|
20
|
+
:locale_force_update,
|
21
|
+
:moderator,
|
22
|
+
:name,
|
23
|
+
:no_2fa_methods,
|
24
|
+
:nonce,
|
25
|
+
:profile_background_url,
|
26
|
+
:remove_groups,
|
27
|
+
:require_2fa,
|
28
|
+
:require_activation,
|
29
|
+
:return_sso_url,
|
30
|
+
:suppress_welcome_message,
|
31
|
+
:title,
|
32
|
+
:username,
|
33
|
+
]
|
34
|
+
|
11
35
|
FIXNUMS = []
|
12
|
-
|
13
|
-
|
36
|
+
|
37
|
+
BOOLS = [
|
38
|
+
:admin,
|
39
|
+
:avatar_force_update,
|
40
|
+
:confirmed_2fa,
|
41
|
+
:locale_force_update,
|
42
|
+
:moderator,
|
43
|
+
:no_2fa_methods,
|
44
|
+
:require_2fa,
|
45
|
+
:require_activation,
|
46
|
+
:suppress_welcome_message,
|
47
|
+
]
|
14
48
|
ARRAYS = [:groups]
|
15
49
|
#NONCE_EXPIRY_TIME = 10.minutes # minutes is a rails method and is causing an error. Is this needed in the api?
|
16
50
|
|
17
51
|
attr_accessor(*ACCESSORS)
|
18
|
-
|
19
|
-
attr_writer :sso_secret, :sso_url
|
52
|
+
attr_writer :custom_fields, :sso_secret, :sso_url
|
20
53
|
|
21
54
|
def self.sso_secret
|
22
55
|
raise RuntimeError, "sso_secret not implemented on class, be sure to set it on instance"
|
@@ -27,7 +60,6 @@ module DiscourseApi
|
|
27
60
|
end
|
28
61
|
|
29
62
|
def self.parse_hash(payload)
|
30
|
-
payload
|
31
63
|
sso = new
|
32
64
|
|
33
65
|
sso.sso_secret = payload.delete(:sso_secret)
|
@@ -40,11 +72,13 @@ module DiscourseApi
|
|
40
72
|
if BOOLS.include? k
|
41
73
|
val = ["true", "false"].include?(val) ? val == "true" : nil
|
42
74
|
end
|
43
|
-
val =
|
75
|
+
val = val.split(",") if ARRAYS.include?(k) && !val.nil?
|
44
76
|
sso.send("#{k}=", val)
|
45
77
|
end
|
78
|
+
|
46
79
|
# Set custom_fields
|
47
80
|
sso.custom_fields = payload[:custom_fields]
|
81
|
+
|
48
82
|
# Add custom_fields (old format)
|
49
83
|
payload.each do |k, v|
|
50
84
|
if field = k[/^custom\.(.+)$/, 1]
|
@@ -79,7 +113,7 @@ module DiscourseApi
|
|
79
113
|
if BOOLS.include? k
|
80
114
|
val = ["true", "false"].include?(val) ? val == "true" : nil
|
81
115
|
end
|
82
|
-
val =
|
116
|
+
val = val.split(",") if ARRAYS.include?(k) && !val.nil?
|
83
117
|
sso.send("#{k}=", val)
|
84
118
|
end
|
85
119
|
|
@@ -127,7 +161,7 @@ module DiscourseApi
|
|
127
161
|
|
128
162
|
ACCESSORS.each do |k|
|
129
163
|
next if (val = send k) == nil
|
130
|
-
|
164
|
+
payload[k] = val
|
131
165
|
end
|
132
166
|
|
133
167
|
if @custom_fields
|
@@ -91,6 +91,35 @@ describe DiscourseApi::API::Groups do
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
+
describe "add owners" do
|
95
|
+
let(:url) { "#{host}/admin/groups/123/owners.json" }
|
96
|
+
|
97
|
+
before do
|
98
|
+
stub_put(url)
|
99
|
+
end
|
100
|
+
|
101
|
+
it "makes the member an owner" do
|
102
|
+
subject.group_add_owners(123, usernames: "sam")
|
103
|
+
params = escape_params("group[usernames]" => "sam")
|
104
|
+
expect(a_request(:put, "#{host}/admin/groups/123/owners.json").
|
105
|
+
with(body: params)
|
106
|
+
).to have_been_made
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "remove owners" do
|
111
|
+
let(:url) { "#{host}/admin/groups/123/owners.json?group%5Busernames%5D=sam" }
|
112
|
+
|
113
|
+
before do
|
114
|
+
stub_delete(url)
|
115
|
+
end
|
116
|
+
|
117
|
+
it "removes the owner role from the group member" do
|
118
|
+
subject.group_remove_owners(123, usernames: "sam")
|
119
|
+
expect(a_delete(url)).to have_been_made
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
94
123
|
describe "group members" do
|
95
124
|
it "list members" do
|
96
125
|
stub_get("#{host}/groups/mygroup/members.json?limit=100&offset=0").to_return(body: fixture("members_0.json"), headers: { content_type: "application/json" })
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe DiscourseApi::API::Invite do
|
5
|
+
subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user") }
|
6
|
+
|
7
|
+
describe "#invite_user" do
|
8
|
+
before do
|
9
|
+
stub_post("#{host}/invites").to_return(body: fixture("topic_invite_user.json"), headers: { content_type: "application/json" })
|
10
|
+
end
|
11
|
+
|
12
|
+
it "requests the correct resource" do
|
13
|
+
subject.invite_user(email: "fake_user@example.com", group_ids: "41,42")
|
14
|
+
expect(a_post("#{host}/invites")).to have_been_made
|
15
|
+
end
|
16
|
+
|
17
|
+
it "returns success" do
|
18
|
+
response = subject.invite_user(email: "fake_user@example.com", group_ids: "41,42")
|
19
|
+
expect(response).to be_a Hash
|
20
|
+
expect(response['success']).to be_truthy
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#update_invite" do
|
25
|
+
before do
|
26
|
+
stub_put("#{host}/invites/27").to_return(body: fixture("topic_invite_user.json"), headers: { content_type: "application/json" })
|
27
|
+
end
|
28
|
+
|
29
|
+
it "updates invite" do
|
30
|
+
subject.update_invite(27, email: "namee@example.com")
|
31
|
+
expect(a_put("#{host}/invites/27")).to have_been_made
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#retrieve_invite" do
|
36
|
+
before do
|
37
|
+
stub_get("#{host}/invites/retrieve.json?email=foo@bar.com").to_return(body: fixture("retrieve_invite.json"), headers: { content_type: "application/json" })
|
38
|
+
end
|
39
|
+
|
40
|
+
it "requests the correct resource" do
|
41
|
+
subject.retrieve_invite(email: "foo@bar.com")
|
42
|
+
expect(a_get("#{host}/invites/retrieve.json?email=foo@bar.com")).to have_been_made
|
43
|
+
end
|
44
|
+
|
45
|
+
it "returns the requested topics" do
|
46
|
+
invites = subject.retrieve_invite(email: "foo@bar.com")
|
47
|
+
expect(invites).to be_an Hash
|
48
|
+
end
|
49
|
+
|
50
|
+
it "returns the requested invite" do
|
51
|
+
invites = subject.retrieve_invite(email: "foo@bar.com")
|
52
|
+
expect(invites["email"]).to eq("foo@bar.com")
|
53
|
+
expect(invites).to have_key("invite_key")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#destroy_all_expired_invites" do
|
58
|
+
let(:url) { "#{host}/invites/destroy-all-expired" }
|
59
|
+
|
60
|
+
before do
|
61
|
+
stub_post(url)
|
62
|
+
.to_return(
|
63
|
+
body: '{"success": "OK"}',
|
64
|
+
headers: { content_type: "application/json" }
|
65
|
+
)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "destroys all expired invites" do
|
69
|
+
subject.destroy_all_expired_invites
|
70
|
+
expect(a_post(url)).to have_been_made
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "#resend_all_invites" do
|
75
|
+
let(:url) { "#{host}/invites/reinvite-all" }
|
76
|
+
|
77
|
+
before do
|
78
|
+
stub_post(url)
|
79
|
+
.to_return(
|
80
|
+
body: '{"success": "OK"}',
|
81
|
+
headers: { content_type: "application/json" }
|
82
|
+
)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "resends all invites" do
|
86
|
+
subject.resend_all_invites
|
87
|
+
expect(a_post(url)).to have_been_made
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "#resend_invite" do
|
92
|
+
let(:url) { "#{host}/invites/reinvite" }
|
93
|
+
|
94
|
+
before do
|
95
|
+
stub_post(url)
|
96
|
+
.to_return(
|
97
|
+
body: '{"success": "OK"}',
|
98
|
+
headers: { content_type: "application/json" }
|
99
|
+
)
|
100
|
+
end
|
101
|
+
|
102
|
+
it "resends invite" do
|
103
|
+
subject.resend_invite("foo@bar.com")
|
104
|
+
expect(a_post(url)).to have_been_made
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
describe "#destroy_invite" do
|
109
|
+
let(:url) { "#{host}/invites?id=27" }
|
110
|
+
|
111
|
+
before do
|
112
|
+
stub_delete(url).to_return(
|
113
|
+
body: '{"success": "OK"}',
|
114
|
+
headers: { content_type: "application/json" }
|
115
|
+
)
|
116
|
+
end
|
117
|
+
|
118
|
+
it "destroys the invite" do
|
119
|
+
subject.destroy_invite(27)
|
120
|
+
expect(a_delete(url)).to have_been_made
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -36,19 +36,19 @@ describe DiscourseApi::API::PrivateMessages do
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
describe '#
|
39
|
+
describe '#create_pm' do
|
40
40
|
before do
|
41
41
|
stub_post("#{host}/posts")
|
42
|
-
subject.
|
42
|
+
subject.create_pm(
|
43
43
|
title: "Confidential: Hello World!",
|
44
44
|
raw: "This is the raw markdown for my private message",
|
45
|
-
|
45
|
+
target_recipients: "user1,user2"
|
46
46
|
)
|
47
47
|
end
|
48
48
|
|
49
49
|
it "makes a create private message request" do
|
50
50
|
expect(a_post("#{host}/posts").with(body:
|
51
|
-
'archetype=private_message&raw=This+is+the+raw+markdown+for+my+private+message&
|
51
|
+
'archetype=private_message&raw=This+is+the+raw+markdown+for+my+private+message&target_recipients=user1%2Cuser2&title=Confidential%3A+Hello+World%21')
|
52
52
|
).to have_been_made
|
53
53
|
end
|
54
54
|
end
|
@@ -27,10 +27,10 @@ describe DiscourseApi::API::SSO do
|
|
27
27
|
}
|
28
28
|
end
|
29
29
|
let(:expected_unsigned_payload) do
|
30
|
-
'
|
31
|
-
'
|
32
|
-
'&
|
33
|
-
'custom.custom.field_1=tomato'
|
30
|
+
'add_groups=a&add_groups=b&avatar_url=https%3A%2F%2Fwww.website.com'\
|
31
|
+
'&email=some%40email.com&external_id=abc&name=Some+User&remove_groups=c'\
|
32
|
+
'&remove_groups=d&title=ruby&username=some_user&custom.field_2=potato'\
|
33
|
+
'&custom.custom.field_1=tomato'
|
34
34
|
end
|
35
35
|
let(:sso_double) { DiscourseApi::SingleSignOn.parse_hash(params) }
|
36
36
|
|
@@ -15,18 +15,18 @@ describe DiscourseApi::API::Topics do
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
describe "#
|
18
|
+
describe "#invite_to_topic" do
|
19
19
|
before do
|
20
20
|
stub_post("#{host}/t/12/invite").to_return(body: fixture("topic_invite_user.json"), headers: { content_type: "application/json" })
|
21
21
|
end
|
22
22
|
|
23
23
|
it "requests the correct resource" do
|
24
|
-
subject.
|
24
|
+
subject.invite_to_topic(12, email: "fake_user@example.com")
|
25
25
|
expect(a_post("#{host}/t/12/invite")).to have_been_made
|
26
26
|
end
|
27
27
|
|
28
28
|
it "returns success" do
|
29
|
-
response = subject.
|
29
|
+
response = subject.invite_to_topic(12, email: "fake_user@example.com")
|
30
30
|
expect(response).to be_a Hash
|
31
31
|
expect(response['success']).to be_truthy
|
32
32
|
end
|
@@ -306,6 +306,20 @@ describe DiscourseApi::API::Users do
|
|
306
306
|
end
|
307
307
|
end
|
308
308
|
|
309
|
+
describe "#anonymize" do
|
310
|
+
before do
|
311
|
+
url = "#{host}/admin/users/11/anonymize"
|
312
|
+
stub_put(url).to_return(body: '', status: 200)
|
313
|
+
end
|
314
|
+
|
315
|
+
it "makes the correct put request" do
|
316
|
+
result = subject.anonymize(11)
|
317
|
+
url = "#{host}/admin/users/11/anonymize"
|
318
|
+
expect(a_put(url)).to have_been_made
|
319
|
+
expect(result.status).to eq(200)
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
309
323
|
describe "#delete_user" do
|
310
324
|
before do
|
311
325
|
url = "#{host}/admin/users/11.json?delete_posts=true"
|
@@ -41,6 +41,12 @@ describe DiscourseApi::Client do
|
|
41
41
|
expect(subject.send(:connection).options.timeout).to eq(25)
|
42
42
|
end
|
43
43
|
end
|
44
|
+
|
45
|
+
it "raises DiscourseApi::Timeout" do
|
46
|
+
stub_get("#{host}/t/1.json").to_timeout
|
47
|
+
|
48
|
+
expect { subject.topic(1) }.to raise_error(DiscourseApi::Timeout)
|
49
|
+
end
|
44
50
|
end
|
45
51
|
|
46
52
|
describe "#api_key" do
|
@@ -0,0 +1,116 @@
|
|
1
|
+
{
|
2
|
+
"id": 26,
|
3
|
+
"invite_key": "CGUHjNC4Na",
|
4
|
+
"link": "http://localhost:3000/invites/CGUHjNC4Na",
|
5
|
+
"email": "foo@bar.com",
|
6
|
+
"emailed": true,
|
7
|
+
"custom_message": null,
|
8
|
+
"created_at": "2021-05-07T20:48:14.278Z",
|
9
|
+
"updated_at": "2021-05-07T20:48:14.278Z",
|
10
|
+
"expires_at": "2021-06-06T20:48:14.278Z",
|
11
|
+
"expired": false,
|
12
|
+
"topics": [
|
13
|
+
{
|
14
|
+
"id": 1,
|
15
|
+
"title": "About the Site Feedback category",
|
16
|
+
"fancy_title": "About the Site Feedback category",
|
17
|
+
"slug": "about-the-site-feedback-category",
|
18
|
+
"posts_count": 1
|
19
|
+
}
|
20
|
+
],
|
21
|
+
"groups": [
|
22
|
+
{
|
23
|
+
"id": 1,
|
24
|
+
"automatic": true,
|
25
|
+
"name": "admins",
|
26
|
+
"display_name": "admins",
|
27
|
+
"user_count": 1,
|
28
|
+
"mentionable_level": 0,
|
29
|
+
"messageable_level": 0,
|
30
|
+
"visibility_level": 1,
|
31
|
+
"primary_group": false,
|
32
|
+
"title": null,
|
33
|
+
"grant_trust_level": null,
|
34
|
+
"incoming_email": null,
|
35
|
+
"has_messages": true,
|
36
|
+
"flair_url": null,
|
37
|
+
"flair_bg_color": null,
|
38
|
+
"flair_color": null,
|
39
|
+
"bio_raw": "",
|
40
|
+
"bio_cooked": null,
|
41
|
+
"bio_excerpt": null,
|
42
|
+
"public_admission": false,
|
43
|
+
"public_exit": false,
|
44
|
+
"allow_membership_requests": false,
|
45
|
+
"full_name": null,
|
46
|
+
"default_notification_level": 3,
|
47
|
+
"membership_request_template": null,
|
48
|
+
"members_visibility_level": 0,
|
49
|
+
"can_see_members": true,
|
50
|
+
"can_admin_group": true,
|
51
|
+
"publish_read_state": false
|
52
|
+
},
|
53
|
+
{
|
54
|
+
"id": 2,
|
55
|
+
"automatic": true,
|
56
|
+
"name": "moderators",
|
57
|
+
"display_name": "moderators",
|
58
|
+
"user_count": 1,
|
59
|
+
"mentionable_level": 0,
|
60
|
+
"messageable_level": 99,
|
61
|
+
"visibility_level": 1,
|
62
|
+
"primary_group": false,
|
63
|
+
"title": null,
|
64
|
+
"grant_trust_level": null,
|
65
|
+
"incoming_email": null,
|
66
|
+
"has_messages": true,
|
67
|
+
"flair_url": null,
|
68
|
+
"flair_bg_color": null,
|
69
|
+
"flair_color": null,
|
70
|
+
"bio_raw": null,
|
71
|
+
"bio_cooked": null,
|
72
|
+
"bio_excerpt": null,
|
73
|
+
"public_admission": false,
|
74
|
+
"public_exit": false,
|
75
|
+
"allow_membership_requests": false,
|
76
|
+
"full_name": null,
|
77
|
+
"default_notification_level": 2,
|
78
|
+
"membership_request_template": null,
|
79
|
+
"members_visibility_level": 0,
|
80
|
+
"can_see_members": true,
|
81
|
+
"can_admin_group": true,
|
82
|
+
"publish_read_state": false
|
83
|
+
},
|
84
|
+
{
|
85
|
+
"id": 3,
|
86
|
+
"automatic": true,
|
87
|
+
"name": "staff",
|
88
|
+
"display_name": "staff",
|
89
|
+
"user_count": 2,
|
90
|
+
"mentionable_level": 0,
|
91
|
+
"messageable_level": 0,
|
92
|
+
"visibility_level": 1,
|
93
|
+
"primary_group": false,
|
94
|
+
"title": null,
|
95
|
+
"grant_trust_level": null,
|
96
|
+
"incoming_email": null,
|
97
|
+
"has_messages": false,
|
98
|
+
"flair_url": null,
|
99
|
+
"flair_bg_color": null,
|
100
|
+
"flair_color": null,
|
101
|
+
"bio_raw": null,
|
102
|
+
"bio_cooked": null,
|
103
|
+
"bio_excerpt": null,
|
104
|
+
"public_admission": false,
|
105
|
+
"public_exit": false,
|
106
|
+
"allow_membership_requests": false,
|
107
|
+
"full_name": null,
|
108
|
+
"default_notification_level": 3,
|
109
|
+
"membership_request_template": null,
|
110
|
+
"members_visibility_level": 0,
|
111
|
+
"can_see_members": true,
|
112
|
+
"can_admin_group": true,
|
113
|
+
"publish_read_state": false
|
114
|
+
}
|
115
|
+
]
|
116
|
+
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: discourse_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.48.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2022-04-13 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: faraday
|
@@ -260,6 +260,7 @@ files:
|
|
260
260
|
- spec/discourse_api/api/categories_spec.rb
|
261
261
|
- spec/discourse_api/api/email_spec.rb
|
262
262
|
- spec/discourse_api/api/groups_spec.rb
|
263
|
+
- spec/discourse_api/api/invite_spec.rb
|
263
264
|
- spec/discourse_api/api/notifications_spec.rb
|
264
265
|
- spec/discourse_api/api/params_spec.rb
|
265
266
|
- spec/discourse_api/api/polls_spec.rb
|
@@ -305,6 +306,7 @@ files:
|
|
305
306
|
- spec/fixtures/regenerate_api_key.json
|
306
307
|
- spec/fixtures/replies.json
|
307
308
|
- spec/fixtures/replies_and_topics.json
|
309
|
+
- spec/fixtures/retrieve_invite.json
|
308
310
|
- spec/fixtures/search.json
|
309
311
|
- spec/fixtures/top.json
|
310
312
|
- spec/fixtures/topic.json
|
@@ -356,6 +358,7 @@ test_files:
|
|
356
358
|
- spec/discourse_api/api/categories_spec.rb
|
357
359
|
- spec/discourse_api/api/email_spec.rb
|
358
360
|
- spec/discourse_api/api/groups_spec.rb
|
361
|
+
- spec/discourse_api/api/invite_spec.rb
|
359
362
|
- spec/discourse_api/api/notifications_spec.rb
|
360
363
|
- spec/discourse_api/api/params_spec.rb
|
361
364
|
- spec/discourse_api/api/polls_spec.rb
|
@@ -401,6 +404,7 @@ test_files:
|
|
401
404
|
- spec/fixtures/regenerate_api_key.json
|
402
405
|
- spec/fixtures/replies.json
|
403
406
|
- spec/fixtures/replies_and_topics.json
|
407
|
+
- spec/fixtures/retrieve_invite.json
|
404
408
|
- spec/fixtures/search.json
|
405
409
|
- spec/fixtures/top.json
|
406
410
|
- spec/fixtures/topic.json
|