discourse_api 0.46.0 → 0.48.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|