discourse_api 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/examples/groups.rb +7 -4
- data/lib/discourse_api/api/api_key.rb +31 -0
- data/lib/discourse_api/api/categories.rb +10 -0
- data/lib/discourse_api/api/groups.rb +18 -5
- data/lib/discourse_api/api/users.rb +10 -0
- data/lib/discourse_api/client.rb +10 -2
- data/lib/discourse_api/error.rb +3 -0
- data/lib/discourse_api/version.rb +1 -1
- data/spec/discourse_api/api/api_key_spec.rb +121 -0
- data/spec/discourse_api/api/categories_spec.rb +30 -0
- data/spec/discourse_api/api/groups_spec.rb +45 -13
- data/spec/discourse_api/api/users_spec.rb +21 -1
- data/spec/fixtures/category_topics.json +92 -0
- data/spec/fixtures/generate_master_key.json +7 -0
- data/spec/fixtures/regenerate_api_key.json +7 -0
- data/spec/fixtures/user_grant_admin.json +37 -0
- metadata +13 -5
- data/lib/discourse_api/api/api_admin.rb +0 -18
- data/spec/discourse_api/api/api_admin_spec.rb +0 -63
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8330a94a826de63e8b485e79b0ee6e43dfc0cbe2
|
4
|
+
data.tar.gz: d8145df00cfb45f265fe8fc2e3af9e1d0e35e230
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9ea65210238643e2233e73f28ea1945a877472c4581794c93cf208a99232b135669fa476a400f69ac43c39b6fdf47a0dd33189c67009da65a8137b23bfbdca6
|
7
|
+
data.tar.gz: f0753dc07dc1c480e2ee6e78a8565b96cf5605ea40bee94a5c3eed2022fb10b6c848cf9ff58f1eafb306e2a319ca0b181f9b3517f3e0a5424285de90985432bf
|
data/examples/groups.rb
CHANGED
@@ -7,8 +7,11 @@ client = DiscourseApi::Client.new
|
|
7
7
|
response = client.create_group(name: "engineering_team")
|
8
8
|
group_id = response["basic_group"]["id"]
|
9
9
|
|
10
|
-
client.group_add(group_id, "sam")
|
11
|
-
client.group_add(group_id, "jeff")
|
12
|
-
client.group_add(group_id, "neil")
|
10
|
+
client.group_add(group_id, username: "sam")
|
11
|
+
client.group_add(group_id, username: "jeff")
|
12
|
+
client.group_add(group_id, usernames: ["neil", "dan"])
|
13
|
+
client.group_add(group_id, user_id: 123)
|
14
|
+
client.group_add(group_id, user_ids: [123, 456])
|
13
15
|
|
14
|
-
client.group_remove(group_id, "neil")
|
16
|
+
client.group_remove(group_id, username: "neil")
|
17
|
+
client.group_remove(group_id, user_id: 123)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module DiscourseApi
|
2
|
+
module API
|
3
|
+
module ApiKey
|
4
|
+
def api
|
5
|
+
response = get("/admin/api.json")
|
6
|
+
response.body
|
7
|
+
end
|
8
|
+
|
9
|
+
def generate_user_api_key(user_id)
|
10
|
+
response = post("/admin/users/#{user_id}/generate_api_key.json")
|
11
|
+
end
|
12
|
+
|
13
|
+
def revoke_user_api_key(user_id)
|
14
|
+
response = delete("/admin/users/#{user_id}/revoke_api_key.json")
|
15
|
+
end
|
16
|
+
|
17
|
+
def generate_master_key
|
18
|
+
response = post("/admin/api/key")
|
19
|
+
end
|
20
|
+
|
21
|
+
def revoke_api_key(id)
|
22
|
+
response = delete("/admin/api/key", {id: id})
|
23
|
+
end
|
24
|
+
|
25
|
+
def regenerate_api_key(id)
|
26
|
+
response = put("/admin/api/key", {id: id})
|
27
|
+
response.body
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -21,6 +21,16 @@ module DiscourseApi
|
|
21
21
|
response[:body]['topic_list']['topics']
|
22
22
|
end
|
23
23
|
|
24
|
+
def category_top_topics(category_slug)
|
25
|
+
response = get("/category/#{category_slug}/l/top.json")
|
26
|
+
response[:body]['topic_list']['topics']
|
27
|
+
end
|
28
|
+
|
29
|
+
def category_new_topics(category_slug)
|
30
|
+
response = get("/category/#{category_slug}/l/new.json")
|
31
|
+
response[:body]['topic_list']['topics']
|
32
|
+
end
|
33
|
+
|
24
34
|
def category(id)
|
25
35
|
response = get("/c/#{id}/show")
|
26
36
|
response.body['category']
|
@@ -6,7 +6,7 @@ module DiscourseApi
|
|
6
6
|
.required(:name)
|
7
7
|
.default(visible: true)
|
8
8
|
.to_h
|
9
|
-
post("/admin/groups",
|
9
|
+
post("/admin/groups", args)
|
10
10
|
end
|
11
11
|
|
12
12
|
def groups
|
@@ -14,12 +14,25 @@ module DiscourseApi
|
|
14
14
|
response.body
|
15
15
|
end
|
16
16
|
|
17
|
-
def group_add(group_id,
|
18
|
-
|
17
|
+
def group_add(group_id, users)
|
18
|
+
users.keys.each do |key|
|
19
|
+
# Accept arrays and convert to comma-delimited string.
|
20
|
+
if users[key].respond_to? :join
|
21
|
+
users[key] = users[key].join(",")
|
22
|
+
end
|
23
|
+
|
24
|
+
# Accept non-plural user_id or username, but send pluralized version in the request.
|
25
|
+
if key.to_s[-1] != 's'
|
26
|
+
users["#{key}s"] = users[key]
|
27
|
+
users.delete(key)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
put("/admin/groups/#{group_id}/members.json", users)
|
19
32
|
end
|
20
33
|
|
21
|
-
def group_remove(group_id,
|
22
|
-
|
34
|
+
def group_remove(group_id, user)
|
35
|
+
delete("/admin/groups/#{group_id}/members.json", user)
|
23
36
|
end
|
24
37
|
end
|
25
38
|
end
|
@@ -59,6 +59,16 @@ module DiscourseApi
|
|
59
59
|
response = get("admin/users/list/#{type}.json")
|
60
60
|
response[:body]
|
61
61
|
end
|
62
|
+
|
63
|
+
def grant_admin(user_id)
|
64
|
+
response = put("admin/users/#{user_id}/grant_admin")
|
65
|
+
response[:body]
|
66
|
+
end
|
67
|
+
|
68
|
+
def revoke_admin(user_id)
|
69
|
+
response = put("admin/users/#{user_id}/revoke_admin")
|
70
|
+
response[:body]
|
71
|
+
end
|
62
72
|
end
|
63
73
|
end
|
64
74
|
end
|
data/lib/discourse_api/client.rb
CHANGED
@@ -15,7 +15,7 @@ require 'discourse_api/api/private_messages'
|
|
15
15
|
require 'discourse_api/api/notifications'
|
16
16
|
require 'discourse_api/api/badges'
|
17
17
|
require 'discourse_api/api/email'
|
18
|
-
require 'discourse_api/api/
|
18
|
+
require 'discourse_api/api/api_key'
|
19
19
|
require 'discourse_api/api/backups'
|
20
20
|
|
21
21
|
module DiscourseApi
|
@@ -35,7 +35,7 @@ module DiscourseApi
|
|
35
35
|
include DiscourseApi::API::Notifications
|
36
36
|
include DiscourseApi::API::Badges
|
37
37
|
include DiscourseApi::API::Email
|
38
|
-
include DiscourseApi::API::
|
38
|
+
include DiscourseApi::API::ApiKey
|
39
39
|
include DiscourseApi::API::Backups
|
40
40
|
|
41
41
|
def initialize(host = ENV["DISCOURSE_URL"],
|
@@ -114,9 +114,17 @@ module DiscourseApi
|
|
114
114
|
params = params.to_h if params.respond_to? :to_h
|
115
115
|
end
|
116
116
|
response = connection.send(method.to_sym, path, params)
|
117
|
+
handle_error(response)
|
117
118
|
response.env
|
118
119
|
rescue Faraday::Error::ClientError, JSON::ParserError
|
119
120
|
raise DiscourseApi::Error
|
120
121
|
end
|
122
|
+
|
123
|
+
def handle_error(response)
|
124
|
+
case response.status
|
125
|
+
when 403
|
126
|
+
raise DiscourseApi::UnauthenticatedError.new(response.env[:body])
|
127
|
+
end
|
128
|
+
end
|
121
129
|
end
|
122
130
|
end
|
data/lib/discourse_api/error.rb
CHANGED
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DiscourseApi::API::ApiKey do
|
4
|
+
subject {
|
5
|
+
DiscourseApi::Client.new(
|
6
|
+
"http://localhost:3000",
|
7
|
+
"test_d7fd0429940",
|
8
|
+
"test_user"
|
9
|
+
)
|
10
|
+
}
|
11
|
+
|
12
|
+
describe "#api" do
|
13
|
+
before do
|
14
|
+
url = "http://localhost:3000/admin/api.json" +
|
15
|
+
"?api_key=test_d7fd0429940&api_username=test_user"
|
16
|
+
stub_get(url).to_return(body: fixture("api.json"),
|
17
|
+
headers: { content_type: "application/json" })
|
18
|
+
end
|
19
|
+
|
20
|
+
it "requests the correct resource" do
|
21
|
+
subject.api
|
22
|
+
url = "http://localhost:3000/admin/api.json" +
|
23
|
+
"?api_key=test_d7fd0429940&api_username=test_user"
|
24
|
+
expect(a_get(url)).to have_been_made
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns the requested api keys" do
|
28
|
+
api = subject.api
|
29
|
+
expect(api).to be_an Array
|
30
|
+
expect(api.first).to be_a Hash
|
31
|
+
expect(api.first).to have_key('key')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#generate_user_api_key" do
|
36
|
+
before do
|
37
|
+
url = "http://localhost:3000/admin/users/2/generate_api_key.json" +
|
38
|
+
"?api_key=test_d7fd0429940&api_username=test_user"
|
39
|
+
stub_post(url).to_return(body: fixture("generate_api_key.json"),
|
40
|
+
headers: { content_type: "application/json" })
|
41
|
+
end
|
42
|
+
|
43
|
+
it "returns the generated api key" do
|
44
|
+
api_key = subject.generate_user_api_key(2)
|
45
|
+
expect(api_key).to be_a Hash
|
46
|
+
expect(api_key['api_key']).to have_key('key')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#revoke_user_api_key" do
|
51
|
+
before do
|
52
|
+
url = "http://localhost:3000/admin/users/2/revoke_api_key.json" +
|
53
|
+
"?api_key=test_d7fd0429940&api_username=test_user"
|
54
|
+
stub_delete(url).to_return(body: "",
|
55
|
+
headers: { content_type: "application/json" })
|
56
|
+
end
|
57
|
+
|
58
|
+
it "returns 200" do
|
59
|
+
response = subject.revoke_user_api_key(2)
|
60
|
+
expect(response['status']).to eq(200)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "#generate_master_key" do
|
65
|
+
before do
|
66
|
+
url = "http://localhost:3000/admin/api/key" +
|
67
|
+
"?api_key=test_d7fd0429940&api_username=test_user"
|
68
|
+
stub_post(url).to_return(body: fixture("generate_master_key.json"),
|
69
|
+
headers: { content_type: "application/json" })
|
70
|
+
end
|
71
|
+
|
72
|
+
it "returns the generated master key" do
|
73
|
+
master_key = subject.generate_master_key
|
74
|
+
expect(master_key).to be_a Hash
|
75
|
+
expect(master_key['api_key']).to have_key('key')
|
76
|
+
expect(master_key['api_key']['user']).to eq(nil)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "#revoke_api_key" do
|
81
|
+
before do
|
82
|
+
url = "http://localhost:3000/admin/api/key" +
|
83
|
+
"?api_key=test_d7fd0429940&api_username=test_user&id=10"
|
84
|
+
stub_delete(url).to_return(body: "",
|
85
|
+
headers: { content_type: "application/json" })
|
86
|
+
end
|
87
|
+
|
88
|
+
it "requests the correct resource" do
|
89
|
+
subject.revoke_api_key(10)
|
90
|
+
url = "http://localhost:3000/admin/api/key" +
|
91
|
+
"?api_key=test_d7fd0429940&api_username=test_user&id=10"
|
92
|
+
expect(a_delete(url)).to have_been_made
|
93
|
+
end
|
94
|
+
|
95
|
+
it "returns 200" do
|
96
|
+
response = subject.revoke_api_key(10)
|
97
|
+
expect(response['status']).to eq(200)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe "#regenerate_api_key" do
|
102
|
+
before do
|
103
|
+
url = "http://localhost:3000/admin/api/key" +
|
104
|
+
"?api_key=test_d7fd0429940&api_username=test_user"
|
105
|
+
stub_put(url).to_return(body: fixture("regenerate_api_key.json"),
|
106
|
+
headers: { content_type: "application/json" })
|
107
|
+
end
|
108
|
+
|
109
|
+
it "requests the correct resource" do
|
110
|
+
subject.regenerate_api_key(10)
|
111
|
+
url = "http://localhost:3000/admin/api/key" +
|
112
|
+
"?api_key=test_d7fd0429940&api_username=test_user"
|
113
|
+
expect(a_put(url)).to have_been_made
|
114
|
+
end
|
115
|
+
|
116
|
+
it "returns the regenerated api key" do
|
117
|
+
key = subject.regenerate_api_key(10)
|
118
|
+
expect(key['api_key']).to have_key('key')
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -36,4 +36,34 @@ describe DiscourseApi::API::Categories do
|
|
36
36
|
expect(latest_topics).to be_an Array
|
37
37
|
end
|
38
38
|
end
|
39
|
+
|
40
|
+
describe '#category_top_topics' do
|
41
|
+
before do
|
42
|
+
stub_get("http://localhost:3000/category/category-slug/l/top.json?api_key=test_d7fd0429940&api_username=test_user")
|
43
|
+
.to_return(
|
44
|
+
body: fixture("category_topics.json"),
|
45
|
+
headers: { content_type: "application/json" }
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "returns the top topics in a category" do
|
50
|
+
topics = subject.category_top_topics('category-slug')
|
51
|
+
expect(topics).to be_an Array
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '#category_new_topics' do
|
56
|
+
before do
|
57
|
+
stub_get("http://localhost:3000/category/category-slug/l/new.json?api_key=test_d7fd0429940&api_username=test_user")
|
58
|
+
.to_return(
|
59
|
+
body: fixture("category_topics.json"),
|
60
|
+
headers: { content_type: "application/json" }
|
61
|
+
)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "returns the new topics in a category" do
|
65
|
+
topics = subject.category_new_topics('category-slug')
|
66
|
+
expect(topics).to be_an Array
|
67
|
+
end
|
68
|
+
end
|
39
69
|
end
|
@@ -23,24 +23,56 @@ describe DiscourseApi::API::Groups do
|
|
23
23
|
stub_post("http://localhost:3000/admin/groups?api_key=test_d7fd0429940&api_username=test_user")
|
24
24
|
subject.create_group(name: "test_group")
|
25
25
|
expect(a_post("http://localhost:3000/admin/groups?api_key=test_d7fd0429940&api_username=test_user").
|
26
|
-
with(body: {
|
26
|
+
with(body: {name: "test_group", visible: "true"})
|
27
27
|
).to have_been_made
|
28
28
|
end
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
30
|
+
describe "add members" do
|
31
|
+
before do
|
32
|
+
stub_request(:put, "http://localhost:3000/admin/groups/123/members.json?api_key=test_d7fd0429940&api_username=test_user")
|
33
|
+
end
|
34
|
+
|
35
|
+
it "adds a single member by username" do
|
36
|
+
subject.group_add(123, username: "sam")
|
37
|
+
expect(a_request(:put, "http://localhost:3000/admin/groups/123/members.json?api_key=test_d7fd0429940&api_username=test_user").
|
38
|
+
with(body: {usernames: "sam"})
|
39
|
+
).to have_been_made
|
40
|
+
end
|
41
|
+
|
42
|
+
it "adds an array of members by username" do
|
43
|
+
subject.group_add(123, usernames: ["sam", "jeff"])
|
44
|
+
expect(a_request(:put, "http://localhost:3000/admin/groups/123/members.json?api_key=test_d7fd0429940&api_username=test_user").
|
45
|
+
with(body: {usernames: "sam,jeff"})
|
46
|
+
).to have_been_made
|
47
|
+
end
|
48
|
+
|
49
|
+
it "adds a single member by user_id" do
|
50
|
+
subject.group_add(123, user_id: 456)
|
51
|
+
expect(a_request(:put, "http://localhost:3000/admin/groups/123/members.json?api_key=test_d7fd0429940&api_username=test_user").
|
52
|
+
with(body: {user_ids: "456"})
|
53
|
+
).to have_been_made
|
54
|
+
end
|
55
|
+
|
56
|
+
it "adds an array of members by user_id" do
|
57
|
+
subject.group_add(123, user_id: [123, 456])
|
58
|
+
expect(a_request(:put, "http://localhost:3000/admin/groups/123/members.json?api_key=test_d7fd0429940&api_username=test_user").
|
59
|
+
with(body: {user_ids: "123,456"})
|
60
|
+
).to have_been_made
|
61
|
+
end
|
36
62
|
end
|
37
63
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
64
|
+
describe "remove members" do
|
65
|
+
before do
|
66
|
+
url = "http://localhost:3000/admin/groups/123/members.json?api_key=test_d7fd0429940&api_username=test_user&username=sam"
|
67
|
+
stub_delete(url)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "removes member" do
|
71
|
+
subject.group_remove(123, username: "sam")
|
72
|
+
expect(a_delete("http://localhost:3000/admin/groups/123/members.json?api_key=test_d7fd0429940&api_username=test_user&username=sam")).to have_been_made
|
73
|
+
end
|
44
74
|
end
|
75
|
+
|
76
|
+
|
45
77
|
end
|
46
78
|
end
|
@@ -170,7 +170,7 @@ describe DiscourseApi::API::Users do
|
|
170
170
|
describe "#update_trust_level" do
|
171
171
|
before do
|
172
172
|
url = "http://localhost:3000/admin/users/2/trust_level?api_key=test_d7fd0429940&api_username=test_user"
|
173
|
-
|
173
|
+
stub_put(url).to_return(body: fixture("update_trust_level.json"),
|
174
174
|
headers: { content_type: "application/json" })
|
175
175
|
end
|
176
176
|
|
@@ -188,4 +188,24 @@ describe DiscourseApi::API::Users do
|
|
188
188
|
expect(admin_user['admin_user']).to have_key('trust_level')
|
189
189
|
end
|
190
190
|
end
|
191
|
+
|
192
|
+
describe "#grant admin" do
|
193
|
+
before do
|
194
|
+
url = "http://localhost:3000/admin/users/11/grant_admin?api_key=test_d7fd0429940&api_username=test_user"
|
195
|
+
stub_put(url).to_return(body: fixture("user_grant_admin.json"),
|
196
|
+
headers: { content_type: "application/json" })
|
197
|
+
end
|
198
|
+
|
199
|
+
it "makes the correct put request" do
|
200
|
+
result = subject.grant_admin(11)
|
201
|
+
url = "http://localhost:3000/admin/users/11/grant_admin?api_key=test_d7fd0429940&api_username=test_user"
|
202
|
+
expect(a_put(url)).to have_been_made
|
203
|
+
end
|
204
|
+
|
205
|
+
it "makes the user an admin" do
|
206
|
+
result = subject.grant_admin(11)
|
207
|
+
expect(result).to be_a Hash
|
208
|
+
expect(result['admin_user']['admin']).to eq(true)
|
209
|
+
end
|
210
|
+
end
|
191
211
|
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
{
|
2
|
+
"users": [
|
3
|
+
{
|
4
|
+
"id": 3,
|
5
|
+
"username": "fuzzy",
|
6
|
+
"avatar_template": "//www.gravatar.com/avatar/c0c59575e86a794d733db4ee29b2baf4.png?s={size}&r=pg&d=identicon"
|
7
|
+
}
|
8
|
+
],
|
9
|
+
"topic_list": {
|
10
|
+
"can_create_topic": true,
|
11
|
+
"draft": null,
|
12
|
+
"draft_key": "new_topic",
|
13
|
+
"draft_sequence": 2,
|
14
|
+
"topics": [
|
15
|
+
{
|
16
|
+
"id": 5,
|
17
|
+
"title": "About the category",
|
18
|
+
"fancy_title": "About the category",
|
19
|
+
"slug": "about-the-category",
|
20
|
+
"posts_count": 2,
|
21
|
+
"reply_count": 0,
|
22
|
+
"highest_post_number": 2,
|
23
|
+
"image_url": null,
|
24
|
+
"created_at": "2014-04-16T14:10:50.950-04:00",
|
25
|
+
"last_posted_at": "2014-04-16T14:31:10.406-04:00",
|
26
|
+
"bumped": true,
|
27
|
+
"bumped_at": "2014-04-17T13:35:01.102-04:00",
|
28
|
+
"unseen": false,
|
29
|
+
"last_read_post_number": 2,
|
30
|
+
"unread": 0,
|
31
|
+
"new_posts": 0,
|
32
|
+
"pinned": true,
|
33
|
+
"unpinned": null,
|
34
|
+
"excerpt": null,
|
35
|
+
"visible ": true,
|
36
|
+
"closed": false,
|
37
|
+
"archived": false,
|
38
|
+
"views": 0,
|
39
|
+
"like_count": 0,
|
40
|
+
"starred": false,
|
41
|
+
"has_summary": false,
|
42
|
+
"archetype": "regular",
|
43
|
+
"last_poster_username": "fuzzy",
|
44
|
+
"category_id": 2,
|
45
|
+
"posters": [
|
46
|
+
{
|
47
|
+
"extras": "latest",
|
48
|
+
"description": "Original Poster, Most Recent Poster",
|
49
|
+
"user_id": 3
|
50
|
+
}
|
51
|
+
]
|
52
|
+
},
|
53
|
+
{
|
54
|
+
"id": 4,
|
55
|
+
"title": "This is a markdown post",
|
56
|
+
"fancy_title": "This is a markdown post",
|
57
|
+
"slug": "this-is-a-markdown-post",
|
58
|
+
"posts_count": 2,
|
59
|
+
"reply_count": 0,
|
60
|
+
"highest_post_number": 2,
|
61
|
+
"image_url": null,
|
62
|
+
"created_at": "2014-04-16T13:52:58.777-04:00",
|
63
|
+
"last_posted_at": "2014-04-16T14:31:37.371-04:00",
|
64
|
+
"bumped": true,
|
65
|
+
"bumped_at": "2014-04-16T14:31:37.371-04:00",
|
66
|
+
"unseen": false,
|
67
|
+
"last_read_post_number": 2,
|
68
|
+
"unread": 0,
|
69
|
+
"new_posts": 0,
|
70
|
+
"pinned": false,
|
71
|
+
"unpinned ": null,
|
72
|
+
"visible": true,
|
73
|
+
"closed": false,
|
74
|
+
"archived": false,
|
75
|
+
"views": 0,
|
76
|
+
"like_count": 0,
|
77
|
+
"starred": false,
|
78
|
+
"has_summary": false,
|
79
|
+
"archetype": "regular",
|
80
|
+
"last_poster_username": "fuzzy",
|
81
|
+
"category_id": 2,
|
82
|
+
"posters": [
|
83
|
+
{
|
84
|
+
"extras": "latest",
|
85
|
+
"description": "Original Poster, Most Recent Poster",
|
86
|
+
"user_id": 3
|
87
|
+
}
|
88
|
+
]
|
89
|
+
}
|
90
|
+
]
|
91
|
+
}
|
92
|
+
}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
{
|
2
|
+
"admin_user": {
|
3
|
+
"id": 11,
|
4
|
+
"username": "dave4",
|
5
|
+
"uploaded_avatar_id": null,
|
6
|
+
"avatar_template": "/letter_avatar/dave4/{size}/2.png",
|
7
|
+
"active": true,
|
8
|
+
"admin": true,
|
9
|
+
"moderator": false,
|
10
|
+
"last_seen_at": null,
|
11
|
+
"last_emailed_at": "2014-12-31T17:11:51.189Z",
|
12
|
+
"created_at": "2014-12-08T14:32:29.906Z",
|
13
|
+
"last_seen_age": null,
|
14
|
+
"last_emailed_age": "20d",
|
15
|
+
"created_at_age": "43d",
|
16
|
+
"username_lower": "dave4",
|
17
|
+
"trust_level": 0,
|
18
|
+
"trust_level_locked": false,
|
19
|
+
"flag_level": 0,
|
20
|
+
"title": null,
|
21
|
+
"suspended_at": null,
|
22
|
+
"suspended_till": null,
|
23
|
+
"suspended": null,
|
24
|
+
"blocked": false,
|
25
|
+
"time_read": "< 1m",
|
26
|
+
"days_visited": 0,
|
27
|
+
"posts_read_count": 0,
|
28
|
+
"topics_entered": 0,
|
29
|
+
"post_count": 0,
|
30
|
+
"can_send_activation_email": true,
|
31
|
+
"can_activate": false,
|
32
|
+
"can_deactivate": false,
|
33
|
+
"ip_address": "127.0.0.1",
|
34
|
+
"registration_ip_address": "127.0.0.1",
|
35
|
+
"single_sign_on_record": null
|
36
|
+
}
|
37
|
+
}
|
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.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-
|
13
|
+
date: 2015-04-14 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: faraday
|
@@ -208,7 +208,7 @@ files:
|
|
208
208
|
- examples/topic_lists.rb
|
209
209
|
- examples/update_user.rb
|
210
210
|
- lib/discourse_api.rb
|
211
|
-
- lib/discourse_api/api/
|
211
|
+
- lib/discourse_api/api/api_key.rb
|
212
212
|
- lib/discourse_api/api/backups.rb
|
213
213
|
- lib/discourse_api/api/badges.rb
|
214
214
|
- lib/discourse_api/api/categories.rb
|
@@ -228,7 +228,7 @@ files:
|
|
228
228
|
- lib/discourse_api/single_sign_on.rb
|
229
229
|
- lib/discourse_api/version.rb
|
230
230
|
- routes.txt
|
231
|
-
- spec/discourse_api/api/
|
231
|
+
- spec/discourse_api/api/api_key_spec.rb
|
232
232
|
- spec/discourse_api/api/backups_spec.rb
|
233
233
|
- spec/discourse_api/api/badges_spec.rb
|
234
234
|
- spec/discourse_api/api/categories_spec.rb
|
@@ -247,9 +247,11 @@ files:
|
|
247
247
|
- spec/fixtures/badges.json
|
248
248
|
- spec/fixtures/categories.json
|
249
249
|
- spec/fixtures/category_latest_topics.json
|
250
|
+
- spec/fixtures/category_topics.json
|
250
251
|
- spec/fixtures/email_list_all.json
|
251
252
|
- spec/fixtures/email_settings.json
|
252
253
|
- spec/fixtures/generate_api_key.json
|
254
|
+
- spec/fixtures/generate_master_key.json
|
253
255
|
- spec/fixtures/groups.json
|
254
256
|
- spec/fixtures/hot.json
|
255
257
|
- spec/fixtures/latest.json
|
@@ -257,6 +259,7 @@ files:
|
|
257
259
|
- spec/fixtures/notifications.json
|
258
260
|
- spec/fixtures/post.json
|
259
261
|
- spec/fixtures/private_messages.json
|
262
|
+
- spec/fixtures/regenerate_api_key.json
|
260
263
|
- spec/fixtures/search.json
|
261
264
|
- spec/fixtures/topic.json
|
262
265
|
- spec/fixtures/topic_invite_user.json
|
@@ -266,6 +269,7 @@ files:
|
|
266
269
|
- spec/fixtures/user_activate_success.json
|
267
270
|
- spec/fixtures/user_badges.json
|
268
271
|
- spec/fixtures/user_create_success.json
|
272
|
+
- spec/fixtures/user_grant_admin.json
|
269
273
|
- spec/fixtures/user_list.json
|
270
274
|
- spec/fixtures/user_log_out_success.json
|
271
275
|
- spec/fixtures/user_update_avatar_success.json
|
@@ -297,7 +301,7 @@ signing_key:
|
|
297
301
|
specification_version: 4
|
298
302
|
summary: Allows access to the Discourse API
|
299
303
|
test_files:
|
300
|
-
- spec/discourse_api/api/
|
304
|
+
- spec/discourse_api/api/api_key_spec.rb
|
301
305
|
- spec/discourse_api/api/backups_spec.rb
|
302
306
|
- spec/discourse_api/api/badges_spec.rb
|
303
307
|
- spec/discourse_api/api/categories_spec.rb
|
@@ -316,9 +320,11 @@ test_files:
|
|
316
320
|
- spec/fixtures/badges.json
|
317
321
|
- spec/fixtures/categories.json
|
318
322
|
- spec/fixtures/category_latest_topics.json
|
323
|
+
- spec/fixtures/category_topics.json
|
319
324
|
- spec/fixtures/email_list_all.json
|
320
325
|
- spec/fixtures/email_settings.json
|
321
326
|
- spec/fixtures/generate_api_key.json
|
327
|
+
- spec/fixtures/generate_master_key.json
|
322
328
|
- spec/fixtures/groups.json
|
323
329
|
- spec/fixtures/hot.json
|
324
330
|
- spec/fixtures/latest.json
|
@@ -326,6 +332,7 @@ test_files:
|
|
326
332
|
- spec/fixtures/notifications.json
|
327
333
|
- spec/fixtures/post.json
|
328
334
|
- spec/fixtures/private_messages.json
|
335
|
+
- spec/fixtures/regenerate_api_key.json
|
329
336
|
- spec/fixtures/search.json
|
330
337
|
- spec/fixtures/topic.json
|
331
338
|
- spec/fixtures/topic_invite_user.json
|
@@ -335,6 +342,7 @@ test_files:
|
|
335
342
|
- spec/fixtures/user_activate_success.json
|
336
343
|
- spec/fixtures/user_badges.json
|
337
344
|
- spec/fixtures/user_create_success.json
|
345
|
+
- spec/fixtures/user_grant_admin.json
|
338
346
|
- spec/fixtures/user_list.json
|
339
347
|
- spec/fixtures/user_log_out_success.json
|
340
348
|
- spec/fixtures/user_update_avatar_success.json
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module DiscourseApi
|
2
|
-
module API
|
3
|
-
module ApiAdmin
|
4
|
-
def api
|
5
|
-
response = get("/admin/api.json")
|
6
|
-
response.body
|
7
|
-
end
|
8
|
-
|
9
|
-
def generate_api_key(user_id)
|
10
|
-
response = post("/admin/users/#{user_id}/generate_api_key.json")
|
11
|
-
end
|
12
|
-
|
13
|
-
def revoke_api_key(user_id)
|
14
|
-
response = delete("/admin/users/#{user_id}/revoke_api_key.json")
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe DiscourseApi::API::ApiAdmin do
|
4
|
-
subject {
|
5
|
-
DiscourseApi::Client.new(
|
6
|
-
"http://localhost:3000",
|
7
|
-
"test_d7fd0429940",
|
8
|
-
"test_user"
|
9
|
-
)
|
10
|
-
}
|
11
|
-
|
12
|
-
describe "#api" do
|
13
|
-
before do
|
14
|
-
url = "http://localhost:3000/admin/api.json?" +
|
15
|
-
"api_key=test_d7fd0429940&api_username=test_user"
|
16
|
-
stub_get(url).to_return(body: fixture("api.json"),
|
17
|
-
headers: { content_type: "application/json" })
|
18
|
-
end
|
19
|
-
|
20
|
-
it "requests the correct resource" do
|
21
|
-
subject.api
|
22
|
-
url = "http://localhost:3000/admin/api.json?" +
|
23
|
-
"api_key=test_d7fd0429940&api_username=test_user"
|
24
|
-
expect(a_get(url)).to have_been_made
|
25
|
-
end
|
26
|
-
|
27
|
-
it "returns the requested api keys" do
|
28
|
-
api = subject.api
|
29
|
-
expect(api).to be_an Array
|
30
|
-
expect(api.first).to be_a Hash
|
31
|
-
expect(api.first).to have_key('key')
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
describe "#generate_api_key" do
|
36
|
-
before do
|
37
|
-
url = "http://localhost:3000/admin/users/2/generate_api_key.json?" +
|
38
|
-
"api_key=test_d7fd0429940&api_username=test_user"
|
39
|
-
stub_post(url).to_return(body: fixture("generate_api_key.json"),
|
40
|
-
headers: { content_type: "application/json" })
|
41
|
-
end
|
42
|
-
|
43
|
-
it "returns the generated api key" do
|
44
|
-
api_key = subject.generate_api_key(2)
|
45
|
-
expect(api_key).to be_a Hash
|
46
|
-
expect(api_key['api_key']).to have_key('key')
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
describe "#revoke_api_key" do
|
51
|
-
before do
|
52
|
-
url = "http://localhost:3000/admin/users/2/revoke_api_key.json?" +
|
53
|
-
"api_key=test_d7fd0429940&api_username=test_user"
|
54
|
-
stub_post(url).to_return(body: "",
|
55
|
-
headers: { content_type: "application/json" })
|
56
|
-
end
|
57
|
-
|
58
|
-
it "returns 200" do
|
59
|
-
response = subject.revoke_api_key(2)
|
60
|
-
expect(response['status']).to eq(200)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|