discourse_api 0.11.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +21 -21
  3. data/.travis.yml +5 -5
  4. data/CHANGELOG.md +105 -99
  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 -35
  11. data/examples/backups.rb +18 -18
  12. data/examples/category.rb +21 -21
  13. data/examples/change_topic_status.rb +33 -33
  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 -41
  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 -78
  43. data/lib/discourse_api/api/users.rb +93 -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 -41
  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 +255 -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 -18
  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 +2 -2
@@ -1,115 +1,115 @@
1
- require 'spec_helper'
2
-
3
- describe DiscourseApi::Client do
4
- subject { DiscourseApi::Client.new('http://localhost:3000') }
5
-
6
- describe ".new" do
7
- it "requires a host argument" do
8
- expect { DiscourseApi::Client.new }.to raise_error ArgumentError
9
- end
10
-
11
- it "defaults api key to nil" do
12
- expect(subject.api_key).to be_nil
13
- end
14
-
15
- it "defaults api username to nil" do
16
- expect(subject.api_username).to be_nil
17
- end
18
-
19
- it "accepts an api key argument" do
20
- client = DiscourseApi::Client.new('http://localhost:3000', 'test')
21
- expect(client.api_key).to eq('test')
22
- end
23
-
24
- it "accepts an api username argument" do
25
- client = DiscourseApi::Client.new('http://localhost:3000', 'test', 'test_user')
26
- expect(client.api_username).to eq('test_user')
27
- end
28
- end
29
-
30
- describe "#api_key" do
31
- it "is publically accessible" do
32
- subject.api_key = "test_d7fd0429940"
33
- expect(subject.api_key).to eq("test_d7fd0429940")
34
- end
35
- end
36
-
37
- describe "#api_username" do
38
- it "is publically accessible" do
39
- subject.api_username = "test_user"
40
- expect(subject.api_username).to eq("test_user")
41
- end
42
- end
43
-
44
- describe "#host" do
45
- it "is publically readable" do
46
- expect(subject.host).to eq("http://localhost:3000")
47
- end
48
-
49
- it "is not publically writeable" do
50
- expect(subject).not_to respond_to(:host=)
51
- end
52
- end
53
-
54
- describe "#connection" do
55
- it "looks like a Faraday connection" do
56
- expect(subject.send(:connection)).to respond_to :run_request
57
- end
58
-
59
- it "memorizes the connection" do
60
- c1, c2 = subject.send(:connection), subject.send(:connection)
61
- expect(c1.object_id).to eq(c2.object_id)
62
- end
63
- end
64
-
65
- describe "#delete" do
66
- before do
67
- stub_delete("http://localhost:3000/test/delete?api_key=test_d7fd0429940&api_username=test_user").with(query: { deleted: "object" })
68
- end
69
-
70
- it "allows custom delete requests" do
71
- subject.api_key = 'test_d7fd0429940'
72
- subject.api_username = 'test_user'
73
- subject.delete("/test/delete", { deleted: "object" })
74
- expect(a_delete("http://localhost:3000/test/delete?api_key=test_d7fd0429940&api_username=test_user").with(query: { deleted: "object" })).to have_been_made
75
- end
76
- end
77
-
78
- describe "#post" do
79
- before do
80
- stub_post("http://localhost:3000/test/post?api_key=test_d7fd0429940&api_username=test_user").with(body: { created: "object"})
81
- end
82
-
83
- it "allows custom post requests" do
84
- subject.api_key = 'test_d7fd0429940'
85
- subject.api_username = 'test_user'
86
- subject.post("/test/post", { created: "object" })
87
- expect(a_post("http://localhost:3000/test/post?api_key=test_d7fd0429940&api_username=test_user").with(body: { created: "object"})).to have_been_made
88
- end
89
- end
90
-
91
- describe "#put" do
92
- before do
93
- stub_put("http://localhost:3000/test/put?api_key=test_d7fd0429940&api_username=test_user").with(body: { updated: "object" })
94
- end
95
-
96
- it "allows custom put requests" do
97
- subject.api_key = 'test_d7fd0429940'
98
- subject.api_username = 'test_user'
99
- subject.put("/test/put", { updated: "object" })
100
- expect(a_put("http://localhost:3000/test/put?api_key=test_d7fd0429940&api_username=test_user").with(body: { updated: "object" })).to have_been_made
101
- end
102
- end
103
-
104
- describe "#request" do
105
- it "catches Faraday errors" do
106
- allow(subject).to receive(:connection).and_raise(Faraday::Error::ClientError.new("BOOM!"))
107
- expect{subject.send(:request, :get, "/test")}.to raise_error DiscourseApi::Error
108
- end
109
-
110
- it "catches JSON::ParserError errors" do
111
- allow(subject).to receive(:connection).and_raise(JSON::ParserError.new("unexpected token"))
112
- expect{subject.send(:request, :get, "/test")}.to raise_error DiscourseApi::Error
113
- end
114
- end
115
- end
1
+ require 'spec_helper'
2
+
3
+ describe DiscourseApi::Client do
4
+ subject { DiscourseApi::Client.new('http://localhost:3000') }
5
+
6
+ describe ".new" do
7
+ it "requires a host argument" do
8
+ expect { DiscourseApi::Client.new }.to raise_error ArgumentError
9
+ end
10
+
11
+ it "defaults api key to nil" do
12
+ expect(subject.api_key).to be_nil
13
+ end
14
+
15
+ it "defaults api username to nil" do
16
+ expect(subject.api_username).to be_nil
17
+ end
18
+
19
+ it "accepts an api key argument" do
20
+ client = DiscourseApi::Client.new('http://localhost:3000', 'test')
21
+ expect(client.api_key).to eq('test')
22
+ end
23
+
24
+ it "accepts an api username argument" do
25
+ client = DiscourseApi::Client.new('http://localhost:3000', 'test', 'test_user')
26
+ expect(client.api_username).to eq('test_user')
27
+ end
28
+ end
29
+
30
+ describe "#api_key" do
31
+ it "is publically accessible" do
32
+ subject.api_key = "test_d7fd0429940"
33
+ expect(subject.api_key).to eq("test_d7fd0429940")
34
+ end
35
+ end
36
+
37
+ describe "#api_username" do
38
+ it "is publically accessible" do
39
+ subject.api_username = "test_user"
40
+ expect(subject.api_username).to eq("test_user")
41
+ end
42
+ end
43
+
44
+ describe "#host" do
45
+ it "is publically readable" do
46
+ expect(subject.host).to eq("http://localhost:3000")
47
+ end
48
+
49
+ it "is not publically writeable" do
50
+ expect(subject).not_to respond_to(:host=)
51
+ end
52
+ end
53
+
54
+ describe "#connection" do
55
+ it "looks like a Faraday connection" do
56
+ expect(subject.send(:connection)).to respond_to :run_request
57
+ end
58
+
59
+ it "memorizes the connection" do
60
+ c1, c2 = subject.send(:connection), subject.send(:connection)
61
+ expect(c1.object_id).to eq(c2.object_id)
62
+ end
63
+ end
64
+
65
+ describe "#delete" do
66
+ before do
67
+ stub_delete("http://localhost:3000/test/delete?api_key=test_d7fd0429940&api_username=test_user").with(query: { deleted: "object" })
68
+ end
69
+
70
+ it "allows custom delete requests" do
71
+ subject.api_key = 'test_d7fd0429940'
72
+ subject.api_username = 'test_user'
73
+ subject.delete("/test/delete", { deleted: "object" })
74
+ expect(a_delete("http://localhost:3000/test/delete?api_key=test_d7fd0429940&api_username=test_user").with(query: { deleted: "object" })).to have_been_made
75
+ end
76
+ end
77
+
78
+ describe "#post" do
79
+ before do
80
+ stub_post("http://localhost:3000/test/post?api_key=test_d7fd0429940&api_username=test_user").with(body: { created: "object"})
81
+ end
82
+
83
+ it "allows custom post requests" do
84
+ subject.api_key = 'test_d7fd0429940'
85
+ subject.api_username = 'test_user'
86
+ subject.post("/test/post", { created: "object" })
87
+ expect(a_post("http://localhost:3000/test/post?api_key=test_d7fd0429940&api_username=test_user").with(body: { created: "object"})).to have_been_made
88
+ end
89
+ end
90
+
91
+ describe "#put" do
92
+ before do
93
+ stub_put("http://localhost:3000/test/put?api_key=test_d7fd0429940&api_username=test_user").with(body: { updated: "object" })
94
+ end
95
+
96
+ it "allows custom put requests" do
97
+ subject.api_key = 'test_d7fd0429940'
98
+ subject.api_username = 'test_user'
99
+ subject.put("/test/put", { updated: "object" })
100
+ expect(a_put("http://localhost:3000/test/put?api_key=test_d7fd0429940&api_username=test_user").with(body: { updated: "object" })).to have_been_made
101
+ end
102
+ end
103
+
104
+ describe "#request" do
105
+ it "catches Faraday errors" do
106
+ allow(subject).to receive(:connection).and_raise(Faraday::Error::ClientError.new("BOOM!"))
107
+ expect{subject.send(:request, :get, "/test")}.to raise_error DiscourseApi::Error
108
+ end
109
+
110
+ it "catches JSON::ParserError errors" do
111
+ allow(subject).to receive(:connection).and_raise(JSON::ParserError.new("unexpected token"))
112
+ expect{subject.send(:request, :get, "/test")}.to raise_error DiscourseApi::Error
113
+ end
114
+ end
115
+ end
@@ -1,12 +1,12 @@
1
- [
2
- {
3
- "id": 1,
4
- "key": "test_d7fd0429940",
5
- "user": {
6
- "id": 1,
7
- "username": "test_user",
8
- "uploaded_avatar_id": 7,
9
- "avatar_template": "/user_avatar/localhost/test_user/{size}/7.png"
10
- }
11
- }
12
- ]
1
+ [
2
+ {
3
+ "id": 1,
4
+ "key": "test_d7fd0429940",
5
+ "user": {
6
+ "id": 1,
7
+ "username": "test_user",
8
+ "uploaded_avatar_id": 7,
9
+ "avatar_template": "/user_avatar/localhost/test_user/{size}/7.png"
10
+ }
11
+ }
12
+ ]
@@ -1,12 +1,12 @@
1
- [
2
- {
3
- "filename": "discourse-2015-01-10-065015.tar.gz",
4
- "size": 557075,
5
- "link": "//localhost:3000/admin/backups/discourse-2015-01-10-065015.tar.gz"
6
- },
7
- {
8
- "filename": "2014-02-10-065935.tar.gz",
9
- "size": 5,
10
- "link": "//localhost:3000/admin/backups/2014-02-10-065935.tar.gz"
11
- }
12
- ]
1
+ [
2
+ {
3
+ "filename": "discourse-2015-01-10-065015.tar.gz",
4
+ "size": 557075,
5
+ "link": "//localhost:3000/admin/backups/discourse-2015-01-10-065015.tar.gz"
6
+ },
7
+ {
8
+ "filename": "2014-02-10-065935.tar.gz",
9
+ "size": 5,
10
+ "link": "//localhost:3000/admin/backups/2014-02-10-065935.tar.gz"
11
+ }
12
+ ]
@@ -1,569 +1,569 @@
1
- {
2
- "badges": [
3
- {
4
- "id": 9,
5
- "name": "Autobiographer",
6
- "description": null,
7
- "grant_count": 0,
8
- "allow_title": false,
9
- "multiple_grant": false,
10
- "icon": "fa-certificate",
11
- "image": null,
12
- "listable": true,
13
- "enabled": true,
14
- "badge_grouping_id": 1,
15
- "system": true,
16
- "query": " SELECT u.id user_id, current_timestamp granted_at\n FROM users u\n JOIN user_profiles up on u.id = up.user_id\n WHERE bio_raw IS NOT NULL AND LENGTH(TRIM(bio_raw)) > 10 AND\n uploaded_avatar_id IS NOT NULL AND\n (:backfill OR u.id IN (:user_ids) )\n",
17
- "trigger": 8,
18
- "target_posts": false,
19
- "auto_revoke": true,
20
- "show_posts": false,
21
- "badge_type_id": 3
22
- },
23
- {
24
- "id": 11,
25
- "name": "First Like",
26
- "description": null,
27
- "grant_count": 1,
28
- "allow_title": false,
29
- "multiple_grant": false,
30
- "icon": "fa-certificate",
31
- "image": null,
32
- "listable": true,
33
- "enabled": true,
34
- "badge_grouping_id": 1,
35
- "system": true,
36
- "query": " SELECT pa1.user_id, pa1.created_at granted_at, pa1.post_id\n FROM (\n SELECT pa.user_id, min(pa.id) id\n FROM post_actions pa\n JOIN badge_posts p on p.id = pa.post_id\n WHERE post_action_type_id = 2 AND\n (:backfill OR pa.post_id IN (:post_ids) )\n GROUP BY pa.user_id\n ) x\n JOIN post_actions pa1 on pa1.id = x.id\n",
37
- "trigger": 1,
38
- "target_posts": true,
39
- "auto_revoke": true,
40
- "show_posts": true,
41
- "badge_type_id": 3
42
- },
43
- {
44
- "id": 14,
45
- "name": "First Link",
46
- "description": null,
47
- "grant_count": 0,
48
- "allow_title": false,
49
- "multiple_grant": false,
50
- "icon": "fa-certificate",
51
- "image": null,
52
- "listable": true,
53
- "enabled": true,
54
- "badge_grouping_id": 1,
55
- "system": true,
56
- "query": " SELECT l.user_id, l.post_id, l.created_at granted_at\n FROM\n (\n SELECT MIN(l1.id) id\n FROM topic_links l1\n JOIN badge_posts p1 ON p1.id = l1.post_id\n JOIN badge_posts p2 ON p2.id = l1.link_post_id\n WHERE NOT reflection AND p1.topic_id <> p2.topic_id AND not quote AND\n (:backfill OR ( p1.id in (:post_ids) ))\n GROUP BY l1.user_id\n ) ids\n JOIN topic_links l ON l.id = ids.id\n",
57
- "trigger": 2,
58
- "target_posts": true,
59
- "auto_revoke": true,
60
- "show_posts": true,
61
- "badge_type_id": 3
62
- },
63
- {
64
- "id": 15,
65
- "name": "First Quote",
66
- "description": null,
67
- "grant_count": 0,
68
- "allow_title": false,
69
- "multiple_grant": false,
70
- "icon": "fa-certificate",
71
- "image": null,
72
- "listable": true,
73
- "enabled": true,
74
- "badge_grouping_id": 1,
75
- "system": true,
76
- "query": " SELECT ids.user_id, q.post_id, q.created_at granted_at\n FROM\n (\n SELECT p1.user_id, MIN(q1.id) id\n FROM quoted_posts q1\n JOIN badge_posts p1 ON p1.id = q1.post_id\n JOIN badge_posts p2 ON p2.id = q1.quoted_post_id\n WHERE (:backfill OR ( p1.id IN (:post_ids) ))\n GROUP BY p1.user_id\n ) ids\n JOIN quoted_posts q ON q.id = ids.id\n",
77
- "trigger": 2,
78
- "target_posts": true,
79
- "auto_revoke": true,
80
- "show_posts": true,
81
- "badge_type_id": 3
82
- },
83
- {
84
- "id": 12,
85
- "name": "First Share",
86
- "description": null,
87
- "grant_count": 0,
88
- "allow_title": false,
89
- "multiple_grant": false,
90
- "icon": "fa-certificate",
91
- "image": null,
92
- "listable": true,
93
- "enabled": true,
94
- "badge_grouping_id": 1,
95
- "system": true,
96
- "query": " SELECT views.user_id, i2.post_id, i2.created_at granted_at\n FROM\n (\n SELECT i.user_id, MIN(i.id) i_id\n FROM incoming_links i\n JOIN badge_posts p on p.id = i.post_id\n WHERE i.user_id IS NOT NULL\n GROUP BY i.user_id\n ) as views\n JOIN incoming_links i2 ON i2.id = views.i_id\n",
97
- "trigger": 0,
98
- "target_posts": true,
99
- "auto_revoke": true,
100
- "show_posts": true,
101
- "badge_type_id": 3
102
- },
103
- {
104
- "id": 16,
105
- "name": "Read Guidelines",
106
- "description": null,
107
- "grant_count": 0,
108
- "allow_title": false,
109
- "multiple_grant": false,
110
- "icon": "fa-certificate",
111
- "image": null,
112
- "listable": true,
113
- "enabled": true,
114
- "badge_grouping_id": 1,
115
- "system": true,
116
- "query": " SELECT user_id, read_faq granted_at\n FROM user_stats\n WHERE read_faq IS NOT NULL AND (user_id IN (:user_ids) OR :backfill)\n",
117
- "trigger": 8,
118
- "target_posts": false,
119
- "auto_revoke": true,
120
- "show_posts": false,
121
- "badge_type_id": 3
122
- },
123
- {
124
- "id": 17,
125
- "name": "Reader",
126
- "description": null,
127
- "grant_count": 0,
128
- "allow_title": false,
129
- "multiple_grant": false,
130
- "icon": "fa-certificate",
131
- "image": null,
132
- "listable": true,
133
- "enabled": true,
134
- "badge_grouping_id": 1,
135
- "system": true,
136
- "query": " SELECT id user_id, current_timestamp granted_at\n FROM users\n WHERE id IN\n (\n SELECT pt.user_id\n FROM post_timings pt\n JOIN badge_posts b ON b.post_number = pt.post_number AND\n b.topic_id = pt.topic_id\n JOIN topics t ON t.id = pt.topic_id\n LEFT JOIN user_badges ub ON ub.badge_id = 17 AND ub.user_id = pt.user_id\n WHERE ub.id IS NULL AND t.posts_count > 100\n GROUP BY pt.user_id, pt.topic_id, t.posts_count\n HAVING count(*) >= t.posts_count\n )\n",
137
- "trigger": null,
138
- "target_posts": false,
139
- "auto_revoke": false,
140
- "show_posts": false,
141
- "badge_type_id": 3
142
- },
143
- {
144
- "id": 23,
145
- "name": "Great Share",
146
- "description": null,
147
- "grant_count": 0,
148
- "allow_title": false,
149
- "multiple_grant": true,
150
- "icon": "fa-certificate",
151
- "image": null,
152
- "listable": true,
153
- "enabled": true,
154
- "badge_grouping_id": 2,
155
- "system": true,
156
- "query": " SELECT views.user_id, i2.post_id, i2.created_at granted_at\n FROM\n (\n SELECT i.user_id, MIN(i.id) i_id\n FROM incoming_links i\n JOIN badge_posts p on p.id = i.post_id\n WHERE i.user_id IS NOT NULL\n GROUP BY i.user_id,i.post_id\n HAVING COUNT(*) > 1000\n ) as views\n JOIN incoming_links i2 ON i2.id = views.i_id\n",
157
- "trigger": 0,
158
- "target_posts": true,
159
- "auto_revoke": true,
160
- "show_posts": true,
161
- "badge_type_id": 1
162
- },
163
- {
164
- "id": 22,
165
- "name": "Good Share",
166
- "description": null,
167
- "grant_count": 0,
168
- "allow_title": false,
169
- "multiple_grant": true,
170
- "icon": "fa-certificate",
171
- "image": null,
172
- "listable": true,
173
- "enabled": true,
174
- "badge_grouping_id": 2,
175
- "system": true,
176
- "query": " SELECT views.user_id, i2.post_id, i2.created_at granted_at\n FROM\n (\n SELECT i.user_id, MIN(i.id) i_id\n FROM incoming_links i\n JOIN badge_posts p on p.id = i.post_id\n WHERE i.user_id IS NOT NULL\n GROUP BY i.user_id,i.post_id\n HAVING COUNT(*) > 300\n ) as views\n JOIN incoming_links i2 ON i2.id = views.i_id\n",
177
- "trigger": 0,
178
- "target_posts": true,
179
- "auto_revoke": true,
180
- "show_posts": true,
181
- "badge_type_id": 2
182
- },
183
- {
184
- "id": 10,
185
- "name": "Editor",
186
- "description": null,
187
- "grant_count": 1,
188
- "allow_title": false,
189
- "multiple_grant": false,
190
- "icon": "fa-certificate",
191
- "image": null,
192
- "listable": true,
193
- "enabled": true,
194
- "badge_grouping_id": 2,
195
- "system": true,
196
- "query": " SELECT p.user_id, min(p.id) post_id, min(p.created_at) granted_at\n FROM badge_posts p\n WHERE p.self_edits > 0 AND\n (:backfill OR p.id IN (:post_ids) )\n GROUP BY p.user_id\n",
197
- "trigger": 2,
198
- "target_posts": false,
199
- "auto_revoke": true,
200
- "show_posts": false,
201
- "badge_type_id": 3
202
- },
203
- {
204
- "id": 13,
205
- "name": "First Flag",
206
- "description": null,
207
- "grant_count": 0,
208
- "allow_title": false,
209
- "multiple_grant": false,
210
- "icon": "fa-certificate",
211
- "image": null,
212
- "listable": true,
213
- "enabled": true,
214
- "badge_grouping_id": 2,
215
- "system": true,
216
- "query": " SELECT pa1.user_id, pa1.created_at granted_at, pa1.post_id\n FROM (\n SELECT pa.user_id, min(pa.id) id\n FROM post_actions pa\n JOIN badge_posts p on p.id = pa.post_id\n WHERE post_action_type_id IN (3,4,7,8) AND\n (:backfill OR pa.post_id IN (:post_ids) )\n GROUP BY pa.user_id\n ) x\n JOIN post_actions pa1 on pa1.id = x.id\n",
217
- "trigger": 1,
218
- "target_posts": true,
219
- "auto_revoke": false,
220
- "show_posts": false,
221
- "badge_type_id": 3
222
- },
223
- {
224
- "id": 21,
225
- "name": "Nice Share",
226
- "description": null,
227
- "grant_count": 0,
228
- "allow_title": false,
229
- "multiple_grant": true,
230
- "icon": "fa-certificate",
231
- "image": null,
232
- "listable": true,
233
- "enabled": true,
234
- "badge_grouping_id": 2,
235
- "system": true,
236
- "query": " SELECT views.user_id, i2.post_id, i2.created_at granted_at\n FROM\n (\n SELECT i.user_id, MIN(i.id) i_id\n FROM incoming_links i\n JOIN badge_posts p on p.id = i.post_id\n WHERE i.user_id IS NOT NULL\n GROUP BY i.user_id,i.post_id\n HAVING COUNT(*) > 25\n ) as views\n JOIN incoming_links i2 ON i2.id = views.i_id\n",
237
- "trigger": 0,
238
- "target_posts": true,
239
- "auto_revoke": true,
240
- "show_posts": true,
241
- "badge_type_id": 3
242
- },
243
- {
244
- "id": 5,
245
- "name": "Welcome",
246
- "description": null,
247
- "grant_count": 1,
248
- "allow_title": false,
249
- "multiple_grant": false,
250
- "icon": "fa-certificate",
251
- "image": null,
252
- "listable": true,
253
- "enabled": true,
254
- "badge_grouping_id": 2,
255
- "system": true,
256
- "query": " SELECT p.user_id, min(post_id) post_id, min(pa.created_at) granted_at\n FROM post_actions pa\n JOIN badge_posts p on p.id = pa.post_id\n WHERE post_action_type_id = 2 AND\n (:backfill OR pa.post_id IN (:post_ids) )\n GROUP BY p.user_id\n",
257
- "trigger": 1,
258
- "target_posts": true,
259
- "auto_revoke": true,
260
- "show_posts": true,
261
- "badge_type_id": 3
262
- },
263
- {
264
- "id": 8,
265
- "name": "Great Post",
266
- "description": null,
267
- "grant_count": 0,
268
- "allow_title": false,
269
- "multiple_grant": true,
270
- "icon": "fa-certificate",
271
- "image": null,
272
- "listable": true,
273
- "enabled": true,
274
- "badge_grouping_id": 3,
275
- "system": true,
276
- "query": "\n SELECT p.user_id, p.id post_id, p.updated_at granted_at\n FROM badge_posts p\n WHERE p.post_number > 1 AND p.like_count >= 50 AND\n (:backfill OR p.id IN (:post_ids) )\n",
277
- "trigger": 1,
278
- "target_posts": true,
279
- "auto_revoke": true,
280
- "show_posts": true,
281
- "badge_type_id": 1
282
- },
283
- {
284
- "id": 20,
285
- "name": "Great Topic",
286
- "description": null,
287
- "grant_count": 0,
288
- "allow_title": false,
289
- "multiple_grant": true,
290
- "icon": "fa-certificate",
291
- "image": null,
292
- "listable": true,
293
- "enabled": true,
294
- "badge_grouping_id": 3,
295
- "system": true,
296
- "query": "\n SELECT p.user_id, p.id post_id, p.updated_at granted_at\n FROM badge_posts p\n WHERE p.post_number = 1 AND p.like_count >= 50 AND\n (:backfill OR p.id IN (:post_ids) )\n",
297
- "trigger": 1,
298
- "target_posts": true,
299
- "auto_revoke": true,
300
- "show_posts": true,
301
- "badge_type_id": 1
302
- },
303
- {
304
- "id": 7,
305
- "name": "Good Post",
306
- "description": null,
307
- "grant_count": 0,
308
- "allow_title": false,
309
- "multiple_grant": true,
310
- "icon": "fa-certificate",
311
- "image": null,
312
- "listable": true,
313
- "enabled": true,
314
- "badge_grouping_id": 3,
315
- "system": true,
316
- "query": "\n SELECT p.user_id, p.id post_id, p.updated_at granted_at\n FROM badge_posts p\n WHERE p.post_number > 1 AND p.like_count >= 25 AND\n (:backfill OR p.id IN (:post_ids) )\n",
317
- "trigger": 1,
318
- "target_posts": true,
319
- "auto_revoke": true,
320
- "show_posts": true,
321
- "badge_type_id": 2
322
- },
323
- {
324
- "id": 19,
325
- "name": "Good Topic",
326
- "description": null,
327
- "grant_count": 0,
328
- "allow_title": false,
329
- "multiple_grant": true,
330
- "icon": "fa-certificate",
331
- "image": null,
332
- "listable": true,
333
- "enabled": true,
334
- "badge_grouping_id": 3,
335
- "system": true,
336
- "query": "\n SELECT p.user_id, p.id post_id, p.updated_at granted_at\n FROM badge_posts p\n WHERE p.post_number = 1 AND p.like_count >= 25 AND\n (:backfill OR p.id IN (:post_ids) )\n",
337
- "trigger": 1,
338
- "target_posts": true,
339
- "auto_revoke": true,
340
- "show_posts": true,
341
- "badge_type_id": 2
342
- },
343
- {
344
- "id": 6,
345
- "name": "Nice Post",
346
- "description": null,
347
- "grant_count": 0,
348
- "allow_title": false,
349
- "multiple_grant": true,
350
- "icon": "fa-certificate",
351
- "image": null,
352
- "listable": true,
353
- "enabled": true,
354
- "badge_grouping_id": 3,
355
- "system": true,
356
- "query": "\n SELECT p.user_id, p.id post_id, p.updated_at granted_at\n FROM badge_posts p\n WHERE p.post_number > 1 AND p.like_count >= 10 AND\n (:backfill OR p.id IN (:post_ids) )\n",
357
- "trigger": 1,
358
- "target_posts": true,
359
- "auto_revoke": true,
360
- "show_posts": true,
361
- "badge_type_id": 3
362
- },
363
- {
364
- "id": 18,
365
- "name": "Nice Topic",
366
- "description": null,
367
- "grant_count": 0,
368
- "allow_title": false,
369
- "multiple_grant": true,
370
- "icon": "fa-certificate",
371
- "image": null,
372
- "listable": true,
373
- "enabled": true,
374
- "badge_grouping_id": 3,
375
- "system": true,
376
- "query": "\n SELECT p.user_id, p.id post_id, p.updated_at granted_at\n FROM badge_posts p\n WHERE p.post_number = 1 AND p.like_count >= 10 AND\n (:backfill OR p.id IN (:post_ids) )\n",
377
- "trigger": 1,
378
- "target_posts": true,
379
- "auto_revoke": true,
380
- "show_posts": true,
381
- "badge_type_id": 3
382
- },
383
- {
384
- "id": 4,
385
- "name": "Leader",
386
- "description": null,
387
- "grant_count": 0,
388
- "allow_title": true,
389
- "multiple_grant": false,
390
- "icon": "fa-user",
391
- "image": null,
392
- "listable": true,
393
- "enabled": true,
394
- "badge_grouping_id": 4,
395
- "system": true,
396
- "query": "\n SELECT u.id user_id, current_timestamp granted_at FROM users u\n WHERE trust_level >= 4 AND (\n :backfill OR u.id IN (:user_ids)\n )\n",
397
- "trigger": 4,
398
- "target_posts": false,
399
- "auto_revoke": true,
400
- "show_posts": false,
401
- "badge_type_id": 1
402
- },
403
- {
404
- "id": 3,
405
- "name": "Regular",
406
- "description": null,
407
- "grant_count": 0,
408
- "allow_title": true,
409
- "multiple_grant": false,
410
- "icon": "fa-user",
411
- "image": null,
412
- "listable": true,
413
- "enabled": true,
414
- "badge_grouping_id": 4,
415
- "system": true,
416
- "query": "\n SELECT u.id user_id, current_timestamp granted_at FROM users u\n WHERE trust_level >= 3 AND (\n :backfill OR u.id IN (:user_ids)\n )\n",
417
- "trigger": 4,
418
- "target_posts": false,
419
- "auto_revoke": true,
420
- "show_posts": false,
421
- "badge_type_id": 2
422
- },
423
- {
424
- "id": 1,
425
- "name": "Basic User",
426
- "description": null,
427
- "grant_count": 0,
428
- "allow_title": false,
429
- "multiple_grant": false,
430
- "icon": "fa-user",
431
- "image": null,
432
- "listable": true,
433
- "enabled": true,
434
- "badge_grouping_id": 4,
435
- "system": true,
436
- "query": "\n SELECT u.id user_id, current_timestamp granted_at FROM users u\n WHERE trust_level >= 1 AND (\n :backfill OR u.id IN (:user_ids)\n )\n",
437
- "trigger": 4,
438
- "target_posts": false,
439
- "auto_revoke": true,
440
- "show_posts": false,
441
- "badge_type_id": 3
442
- },
443
- {
444
- "id": 2,
445
- "name": "Member",
446
- "description": null,
447
- "grant_count": 0,
448
- "allow_title": false,
449
- "multiple_grant": false,
450
- "icon": "fa-user",
451
- "image": null,
452
- "listable": true,
453
- "enabled": true,
454
- "badge_grouping_id": 4,
455
- "system": true,
456
- "query": "\n SELECT u.id user_id, current_timestamp granted_at FROM users u\n WHERE trust_level >= 2 AND (\n :backfill OR u.id IN (:user_ids)\n )\n",
457
- "trigger": 4,
458
- "target_posts": false,
459
- "auto_revoke": true,
460
- "show_posts": false,
461
- "badge_type_id": 3
462
- }
463
- ],
464
- "badge_types": [
465
- {
466
- "id": 3,
467
- "name": "Bronze",
468
- "sort_order": 7
469
- },
470
- {
471
- "id": 1,
472
- "name": "Gold",
473
- "sort_order": 9
474
- },
475
- {
476
- "id": 2,
477
- "name": "Silver",
478
- "sort_order": 8
479
- }
480
- ],
481
- "badge_groupings": [
482
- {
483
- "id": 1,
484
- "name": "Getting Started",
485
- "description": null,
486
- "position": 10
487
- },
488
- {
489
- "id": 2,
490
- "name": "Community",
491
- "description": null,
492
- "position": 11
493
- },
494
- {
495
- "id": 3,
496
- "name": "Posting",
497
- "description": null,
498
- "position": 12
499
- },
500
- {
501
- "id": 4,
502
- "name": "Trust Level",
503
- "description": null,
504
- "position": 13
505
- },
506
- {
507
- "id": 5,
508
- "name": "Other",
509
- "description": null,
510
- "position": 14
511
- }
512
- ],
513
- "admin_badges": {
514
- "protected_system_fields": [
515
- "badge_type_id",
516
- "multiple_grant",
517
- "target_posts",
518
- "show_posts",
519
- "query",
520
- "trigger",
521
- "auto_revoke",
522
- "listable"
523
- ],
524
- "triggers": {
525
- "none": 0,
526
- "post_action": 1,
527
- "post_revision": 2,
528
- "trust_level_change": 4,
529
- "user_change": 8
530
- },
531
- "badge_ids": [
532
- 9,
533
- 11,
534
- 14,
535
- 15,
536
- 12,
537
- 16,
538
- 17,
539
- 23,
540
- 22,
541
- 10,
542
- 13,
543
- 21,
544
- 5,
545
- 8,
546
- 20,
547
- 7,
548
- 19,
549
- 6,
550
- 18,
551
- 4,
552
- 3,
553
- 1,
554
- 2
555
- ],
556
- "badge_grouping_ids": [
557
- 1,
558
- 2,
559
- 3,
560
- 4,
561
- 5
562
- ],
563
- "badge_type_ids": [
564
- 1,
565
- 2,
566
- 3
567
- ]
568
- }
569
- }
1
+ {
2
+ "badges": [
3
+ {
4
+ "id": 9,
5
+ "name": "Autobiographer",
6
+ "description": null,
7
+ "grant_count": 0,
8
+ "allow_title": false,
9
+ "multiple_grant": false,
10
+ "icon": "fa-certificate",
11
+ "image": null,
12
+ "listable": true,
13
+ "enabled": true,
14
+ "badge_grouping_id": 1,
15
+ "system": true,
16
+ "query": " SELECT u.id user_id, current_timestamp granted_at\n FROM users u\n JOIN user_profiles up on u.id = up.user_id\n WHERE bio_raw IS NOT NULL AND LENGTH(TRIM(bio_raw)) > 10 AND\n uploaded_avatar_id IS NOT NULL AND\n (:backfill OR u.id IN (:user_ids) )\n",
17
+ "trigger": 8,
18
+ "target_posts": false,
19
+ "auto_revoke": true,
20
+ "show_posts": false,
21
+ "badge_type_id": 3
22
+ },
23
+ {
24
+ "id": 11,
25
+ "name": "First Like",
26
+ "description": null,
27
+ "grant_count": 1,
28
+ "allow_title": false,
29
+ "multiple_grant": false,
30
+ "icon": "fa-certificate",
31
+ "image": null,
32
+ "listable": true,
33
+ "enabled": true,
34
+ "badge_grouping_id": 1,
35
+ "system": true,
36
+ "query": " SELECT pa1.user_id, pa1.created_at granted_at, pa1.post_id\n FROM (\n SELECT pa.user_id, min(pa.id) id\n FROM post_actions pa\n JOIN badge_posts p on p.id = pa.post_id\n WHERE post_action_type_id = 2 AND\n (:backfill OR pa.post_id IN (:post_ids) )\n GROUP BY pa.user_id\n ) x\n JOIN post_actions pa1 on pa1.id = x.id\n",
37
+ "trigger": 1,
38
+ "target_posts": true,
39
+ "auto_revoke": true,
40
+ "show_posts": true,
41
+ "badge_type_id": 3
42
+ },
43
+ {
44
+ "id": 14,
45
+ "name": "First Link",
46
+ "description": null,
47
+ "grant_count": 0,
48
+ "allow_title": false,
49
+ "multiple_grant": false,
50
+ "icon": "fa-certificate",
51
+ "image": null,
52
+ "listable": true,
53
+ "enabled": true,
54
+ "badge_grouping_id": 1,
55
+ "system": true,
56
+ "query": " SELECT l.user_id, l.post_id, l.created_at granted_at\n FROM\n (\n SELECT MIN(l1.id) id\n FROM topic_links l1\n JOIN badge_posts p1 ON p1.id = l1.post_id\n JOIN badge_posts p2 ON p2.id = l1.link_post_id\n WHERE NOT reflection AND p1.topic_id <> p2.topic_id AND not quote AND\n (:backfill OR ( p1.id in (:post_ids) ))\n GROUP BY l1.user_id\n ) ids\n JOIN topic_links l ON l.id = ids.id\n",
57
+ "trigger": 2,
58
+ "target_posts": true,
59
+ "auto_revoke": true,
60
+ "show_posts": true,
61
+ "badge_type_id": 3
62
+ },
63
+ {
64
+ "id": 15,
65
+ "name": "First Quote",
66
+ "description": null,
67
+ "grant_count": 0,
68
+ "allow_title": false,
69
+ "multiple_grant": false,
70
+ "icon": "fa-certificate",
71
+ "image": null,
72
+ "listable": true,
73
+ "enabled": true,
74
+ "badge_grouping_id": 1,
75
+ "system": true,
76
+ "query": " SELECT ids.user_id, q.post_id, q.created_at granted_at\n FROM\n (\n SELECT p1.user_id, MIN(q1.id) id\n FROM quoted_posts q1\n JOIN badge_posts p1 ON p1.id = q1.post_id\n JOIN badge_posts p2 ON p2.id = q1.quoted_post_id\n WHERE (:backfill OR ( p1.id IN (:post_ids) ))\n GROUP BY p1.user_id\n ) ids\n JOIN quoted_posts q ON q.id = ids.id\n",
77
+ "trigger": 2,
78
+ "target_posts": true,
79
+ "auto_revoke": true,
80
+ "show_posts": true,
81
+ "badge_type_id": 3
82
+ },
83
+ {
84
+ "id": 12,
85
+ "name": "First Share",
86
+ "description": null,
87
+ "grant_count": 0,
88
+ "allow_title": false,
89
+ "multiple_grant": false,
90
+ "icon": "fa-certificate",
91
+ "image": null,
92
+ "listable": true,
93
+ "enabled": true,
94
+ "badge_grouping_id": 1,
95
+ "system": true,
96
+ "query": " SELECT views.user_id, i2.post_id, i2.created_at granted_at\n FROM\n (\n SELECT i.user_id, MIN(i.id) i_id\n FROM incoming_links i\n JOIN badge_posts p on p.id = i.post_id\n WHERE i.user_id IS NOT NULL\n GROUP BY i.user_id\n ) as views\n JOIN incoming_links i2 ON i2.id = views.i_id\n",
97
+ "trigger": 0,
98
+ "target_posts": true,
99
+ "auto_revoke": true,
100
+ "show_posts": true,
101
+ "badge_type_id": 3
102
+ },
103
+ {
104
+ "id": 16,
105
+ "name": "Read Guidelines",
106
+ "description": null,
107
+ "grant_count": 0,
108
+ "allow_title": false,
109
+ "multiple_grant": false,
110
+ "icon": "fa-certificate",
111
+ "image": null,
112
+ "listable": true,
113
+ "enabled": true,
114
+ "badge_grouping_id": 1,
115
+ "system": true,
116
+ "query": " SELECT user_id, read_faq granted_at\n FROM user_stats\n WHERE read_faq IS NOT NULL AND (user_id IN (:user_ids) OR :backfill)\n",
117
+ "trigger": 8,
118
+ "target_posts": false,
119
+ "auto_revoke": true,
120
+ "show_posts": false,
121
+ "badge_type_id": 3
122
+ },
123
+ {
124
+ "id": 17,
125
+ "name": "Reader",
126
+ "description": null,
127
+ "grant_count": 0,
128
+ "allow_title": false,
129
+ "multiple_grant": false,
130
+ "icon": "fa-certificate",
131
+ "image": null,
132
+ "listable": true,
133
+ "enabled": true,
134
+ "badge_grouping_id": 1,
135
+ "system": true,
136
+ "query": " SELECT id user_id, current_timestamp granted_at\n FROM users\n WHERE id IN\n (\n SELECT pt.user_id\n FROM post_timings pt\n JOIN badge_posts b ON b.post_number = pt.post_number AND\n b.topic_id = pt.topic_id\n JOIN topics t ON t.id = pt.topic_id\n LEFT JOIN user_badges ub ON ub.badge_id = 17 AND ub.user_id = pt.user_id\n WHERE ub.id IS NULL AND t.posts_count > 100\n GROUP BY pt.user_id, pt.topic_id, t.posts_count\n HAVING count(*) >= t.posts_count\n )\n",
137
+ "trigger": null,
138
+ "target_posts": false,
139
+ "auto_revoke": false,
140
+ "show_posts": false,
141
+ "badge_type_id": 3
142
+ },
143
+ {
144
+ "id": 23,
145
+ "name": "Great Share",
146
+ "description": null,
147
+ "grant_count": 0,
148
+ "allow_title": false,
149
+ "multiple_grant": true,
150
+ "icon": "fa-certificate",
151
+ "image": null,
152
+ "listable": true,
153
+ "enabled": true,
154
+ "badge_grouping_id": 2,
155
+ "system": true,
156
+ "query": " SELECT views.user_id, i2.post_id, i2.created_at granted_at\n FROM\n (\n SELECT i.user_id, MIN(i.id) i_id\n FROM incoming_links i\n JOIN badge_posts p on p.id = i.post_id\n WHERE i.user_id IS NOT NULL\n GROUP BY i.user_id,i.post_id\n HAVING COUNT(*) > 1000\n ) as views\n JOIN incoming_links i2 ON i2.id = views.i_id\n",
157
+ "trigger": 0,
158
+ "target_posts": true,
159
+ "auto_revoke": true,
160
+ "show_posts": true,
161
+ "badge_type_id": 1
162
+ },
163
+ {
164
+ "id": 22,
165
+ "name": "Good Share",
166
+ "description": null,
167
+ "grant_count": 0,
168
+ "allow_title": false,
169
+ "multiple_grant": true,
170
+ "icon": "fa-certificate",
171
+ "image": null,
172
+ "listable": true,
173
+ "enabled": true,
174
+ "badge_grouping_id": 2,
175
+ "system": true,
176
+ "query": " SELECT views.user_id, i2.post_id, i2.created_at granted_at\n FROM\n (\n SELECT i.user_id, MIN(i.id) i_id\n FROM incoming_links i\n JOIN badge_posts p on p.id = i.post_id\n WHERE i.user_id IS NOT NULL\n GROUP BY i.user_id,i.post_id\n HAVING COUNT(*) > 300\n ) as views\n JOIN incoming_links i2 ON i2.id = views.i_id\n",
177
+ "trigger": 0,
178
+ "target_posts": true,
179
+ "auto_revoke": true,
180
+ "show_posts": true,
181
+ "badge_type_id": 2
182
+ },
183
+ {
184
+ "id": 10,
185
+ "name": "Editor",
186
+ "description": null,
187
+ "grant_count": 1,
188
+ "allow_title": false,
189
+ "multiple_grant": false,
190
+ "icon": "fa-certificate",
191
+ "image": null,
192
+ "listable": true,
193
+ "enabled": true,
194
+ "badge_grouping_id": 2,
195
+ "system": true,
196
+ "query": " SELECT p.user_id, min(p.id) post_id, min(p.created_at) granted_at\n FROM badge_posts p\n WHERE p.self_edits > 0 AND\n (:backfill OR p.id IN (:post_ids) )\n GROUP BY p.user_id\n",
197
+ "trigger": 2,
198
+ "target_posts": false,
199
+ "auto_revoke": true,
200
+ "show_posts": false,
201
+ "badge_type_id": 3
202
+ },
203
+ {
204
+ "id": 13,
205
+ "name": "First Flag",
206
+ "description": null,
207
+ "grant_count": 0,
208
+ "allow_title": false,
209
+ "multiple_grant": false,
210
+ "icon": "fa-certificate",
211
+ "image": null,
212
+ "listable": true,
213
+ "enabled": true,
214
+ "badge_grouping_id": 2,
215
+ "system": true,
216
+ "query": " SELECT pa1.user_id, pa1.created_at granted_at, pa1.post_id\n FROM (\n SELECT pa.user_id, min(pa.id) id\n FROM post_actions pa\n JOIN badge_posts p on p.id = pa.post_id\n WHERE post_action_type_id IN (3,4,7,8) AND\n (:backfill OR pa.post_id IN (:post_ids) )\n GROUP BY pa.user_id\n ) x\n JOIN post_actions pa1 on pa1.id = x.id\n",
217
+ "trigger": 1,
218
+ "target_posts": true,
219
+ "auto_revoke": false,
220
+ "show_posts": false,
221
+ "badge_type_id": 3
222
+ },
223
+ {
224
+ "id": 21,
225
+ "name": "Nice Share",
226
+ "description": null,
227
+ "grant_count": 0,
228
+ "allow_title": false,
229
+ "multiple_grant": true,
230
+ "icon": "fa-certificate",
231
+ "image": null,
232
+ "listable": true,
233
+ "enabled": true,
234
+ "badge_grouping_id": 2,
235
+ "system": true,
236
+ "query": " SELECT views.user_id, i2.post_id, i2.created_at granted_at\n FROM\n (\n SELECT i.user_id, MIN(i.id) i_id\n FROM incoming_links i\n JOIN badge_posts p on p.id = i.post_id\n WHERE i.user_id IS NOT NULL\n GROUP BY i.user_id,i.post_id\n HAVING COUNT(*) > 25\n ) as views\n JOIN incoming_links i2 ON i2.id = views.i_id\n",
237
+ "trigger": 0,
238
+ "target_posts": true,
239
+ "auto_revoke": true,
240
+ "show_posts": true,
241
+ "badge_type_id": 3
242
+ },
243
+ {
244
+ "id": 5,
245
+ "name": "Welcome",
246
+ "description": null,
247
+ "grant_count": 1,
248
+ "allow_title": false,
249
+ "multiple_grant": false,
250
+ "icon": "fa-certificate",
251
+ "image": null,
252
+ "listable": true,
253
+ "enabled": true,
254
+ "badge_grouping_id": 2,
255
+ "system": true,
256
+ "query": " SELECT p.user_id, min(post_id) post_id, min(pa.created_at) granted_at\n FROM post_actions pa\n JOIN badge_posts p on p.id = pa.post_id\n WHERE post_action_type_id = 2 AND\n (:backfill OR pa.post_id IN (:post_ids) )\n GROUP BY p.user_id\n",
257
+ "trigger": 1,
258
+ "target_posts": true,
259
+ "auto_revoke": true,
260
+ "show_posts": true,
261
+ "badge_type_id": 3
262
+ },
263
+ {
264
+ "id": 8,
265
+ "name": "Great Post",
266
+ "description": null,
267
+ "grant_count": 0,
268
+ "allow_title": false,
269
+ "multiple_grant": true,
270
+ "icon": "fa-certificate",
271
+ "image": null,
272
+ "listable": true,
273
+ "enabled": true,
274
+ "badge_grouping_id": 3,
275
+ "system": true,
276
+ "query": "\n SELECT p.user_id, p.id post_id, p.updated_at granted_at\n FROM badge_posts p\n WHERE p.post_number > 1 AND p.like_count >= 50 AND\n (:backfill OR p.id IN (:post_ids) )\n",
277
+ "trigger": 1,
278
+ "target_posts": true,
279
+ "auto_revoke": true,
280
+ "show_posts": true,
281
+ "badge_type_id": 1
282
+ },
283
+ {
284
+ "id": 20,
285
+ "name": "Great Topic",
286
+ "description": null,
287
+ "grant_count": 0,
288
+ "allow_title": false,
289
+ "multiple_grant": true,
290
+ "icon": "fa-certificate",
291
+ "image": null,
292
+ "listable": true,
293
+ "enabled": true,
294
+ "badge_grouping_id": 3,
295
+ "system": true,
296
+ "query": "\n SELECT p.user_id, p.id post_id, p.updated_at granted_at\n FROM badge_posts p\n WHERE p.post_number = 1 AND p.like_count >= 50 AND\n (:backfill OR p.id IN (:post_ids) )\n",
297
+ "trigger": 1,
298
+ "target_posts": true,
299
+ "auto_revoke": true,
300
+ "show_posts": true,
301
+ "badge_type_id": 1
302
+ },
303
+ {
304
+ "id": 7,
305
+ "name": "Good Post",
306
+ "description": null,
307
+ "grant_count": 0,
308
+ "allow_title": false,
309
+ "multiple_grant": true,
310
+ "icon": "fa-certificate",
311
+ "image": null,
312
+ "listable": true,
313
+ "enabled": true,
314
+ "badge_grouping_id": 3,
315
+ "system": true,
316
+ "query": "\n SELECT p.user_id, p.id post_id, p.updated_at granted_at\n FROM badge_posts p\n WHERE p.post_number > 1 AND p.like_count >= 25 AND\n (:backfill OR p.id IN (:post_ids) )\n",
317
+ "trigger": 1,
318
+ "target_posts": true,
319
+ "auto_revoke": true,
320
+ "show_posts": true,
321
+ "badge_type_id": 2
322
+ },
323
+ {
324
+ "id": 19,
325
+ "name": "Good Topic",
326
+ "description": null,
327
+ "grant_count": 0,
328
+ "allow_title": false,
329
+ "multiple_grant": true,
330
+ "icon": "fa-certificate",
331
+ "image": null,
332
+ "listable": true,
333
+ "enabled": true,
334
+ "badge_grouping_id": 3,
335
+ "system": true,
336
+ "query": "\n SELECT p.user_id, p.id post_id, p.updated_at granted_at\n FROM badge_posts p\n WHERE p.post_number = 1 AND p.like_count >= 25 AND\n (:backfill OR p.id IN (:post_ids) )\n",
337
+ "trigger": 1,
338
+ "target_posts": true,
339
+ "auto_revoke": true,
340
+ "show_posts": true,
341
+ "badge_type_id": 2
342
+ },
343
+ {
344
+ "id": 6,
345
+ "name": "Nice Post",
346
+ "description": null,
347
+ "grant_count": 0,
348
+ "allow_title": false,
349
+ "multiple_grant": true,
350
+ "icon": "fa-certificate",
351
+ "image": null,
352
+ "listable": true,
353
+ "enabled": true,
354
+ "badge_grouping_id": 3,
355
+ "system": true,
356
+ "query": "\n SELECT p.user_id, p.id post_id, p.updated_at granted_at\n FROM badge_posts p\n WHERE p.post_number > 1 AND p.like_count >= 10 AND\n (:backfill OR p.id IN (:post_ids) )\n",
357
+ "trigger": 1,
358
+ "target_posts": true,
359
+ "auto_revoke": true,
360
+ "show_posts": true,
361
+ "badge_type_id": 3
362
+ },
363
+ {
364
+ "id": 18,
365
+ "name": "Nice Topic",
366
+ "description": null,
367
+ "grant_count": 0,
368
+ "allow_title": false,
369
+ "multiple_grant": true,
370
+ "icon": "fa-certificate",
371
+ "image": null,
372
+ "listable": true,
373
+ "enabled": true,
374
+ "badge_grouping_id": 3,
375
+ "system": true,
376
+ "query": "\n SELECT p.user_id, p.id post_id, p.updated_at granted_at\n FROM badge_posts p\n WHERE p.post_number = 1 AND p.like_count >= 10 AND\n (:backfill OR p.id IN (:post_ids) )\n",
377
+ "trigger": 1,
378
+ "target_posts": true,
379
+ "auto_revoke": true,
380
+ "show_posts": true,
381
+ "badge_type_id": 3
382
+ },
383
+ {
384
+ "id": 4,
385
+ "name": "Leader",
386
+ "description": null,
387
+ "grant_count": 0,
388
+ "allow_title": true,
389
+ "multiple_grant": false,
390
+ "icon": "fa-user",
391
+ "image": null,
392
+ "listable": true,
393
+ "enabled": true,
394
+ "badge_grouping_id": 4,
395
+ "system": true,
396
+ "query": "\n SELECT u.id user_id, current_timestamp granted_at FROM users u\n WHERE trust_level >= 4 AND (\n :backfill OR u.id IN (:user_ids)\n )\n",
397
+ "trigger": 4,
398
+ "target_posts": false,
399
+ "auto_revoke": true,
400
+ "show_posts": false,
401
+ "badge_type_id": 1
402
+ },
403
+ {
404
+ "id": 3,
405
+ "name": "Regular",
406
+ "description": null,
407
+ "grant_count": 0,
408
+ "allow_title": true,
409
+ "multiple_grant": false,
410
+ "icon": "fa-user",
411
+ "image": null,
412
+ "listable": true,
413
+ "enabled": true,
414
+ "badge_grouping_id": 4,
415
+ "system": true,
416
+ "query": "\n SELECT u.id user_id, current_timestamp granted_at FROM users u\n WHERE trust_level >= 3 AND (\n :backfill OR u.id IN (:user_ids)\n )\n",
417
+ "trigger": 4,
418
+ "target_posts": false,
419
+ "auto_revoke": true,
420
+ "show_posts": false,
421
+ "badge_type_id": 2
422
+ },
423
+ {
424
+ "id": 1,
425
+ "name": "Basic User",
426
+ "description": null,
427
+ "grant_count": 0,
428
+ "allow_title": false,
429
+ "multiple_grant": false,
430
+ "icon": "fa-user",
431
+ "image": null,
432
+ "listable": true,
433
+ "enabled": true,
434
+ "badge_grouping_id": 4,
435
+ "system": true,
436
+ "query": "\n SELECT u.id user_id, current_timestamp granted_at FROM users u\n WHERE trust_level >= 1 AND (\n :backfill OR u.id IN (:user_ids)\n )\n",
437
+ "trigger": 4,
438
+ "target_posts": false,
439
+ "auto_revoke": true,
440
+ "show_posts": false,
441
+ "badge_type_id": 3
442
+ },
443
+ {
444
+ "id": 2,
445
+ "name": "Member",
446
+ "description": null,
447
+ "grant_count": 0,
448
+ "allow_title": false,
449
+ "multiple_grant": false,
450
+ "icon": "fa-user",
451
+ "image": null,
452
+ "listable": true,
453
+ "enabled": true,
454
+ "badge_grouping_id": 4,
455
+ "system": true,
456
+ "query": "\n SELECT u.id user_id, current_timestamp granted_at FROM users u\n WHERE trust_level >= 2 AND (\n :backfill OR u.id IN (:user_ids)\n )\n",
457
+ "trigger": 4,
458
+ "target_posts": false,
459
+ "auto_revoke": true,
460
+ "show_posts": false,
461
+ "badge_type_id": 3
462
+ }
463
+ ],
464
+ "badge_types": [
465
+ {
466
+ "id": 3,
467
+ "name": "Bronze",
468
+ "sort_order": 7
469
+ },
470
+ {
471
+ "id": 1,
472
+ "name": "Gold",
473
+ "sort_order": 9
474
+ },
475
+ {
476
+ "id": 2,
477
+ "name": "Silver",
478
+ "sort_order": 8
479
+ }
480
+ ],
481
+ "badge_groupings": [
482
+ {
483
+ "id": 1,
484
+ "name": "Getting Started",
485
+ "description": null,
486
+ "position": 10
487
+ },
488
+ {
489
+ "id": 2,
490
+ "name": "Community",
491
+ "description": null,
492
+ "position": 11
493
+ },
494
+ {
495
+ "id": 3,
496
+ "name": "Posting",
497
+ "description": null,
498
+ "position": 12
499
+ },
500
+ {
501
+ "id": 4,
502
+ "name": "Trust Level",
503
+ "description": null,
504
+ "position": 13
505
+ },
506
+ {
507
+ "id": 5,
508
+ "name": "Other",
509
+ "description": null,
510
+ "position": 14
511
+ }
512
+ ],
513
+ "admin_badges": {
514
+ "protected_system_fields": [
515
+ "badge_type_id",
516
+ "multiple_grant",
517
+ "target_posts",
518
+ "show_posts",
519
+ "query",
520
+ "trigger",
521
+ "auto_revoke",
522
+ "listable"
523
+ ],
524
+ "triggers": {
525
+ "none": 0,
526
+ "post_action": 1,
527
+ "post_revision": 2,
528
+ "trust_level_change": 4,
529
+ "user_change": 8
530
+ },
531
+ "badge_ids": [
532
+ 9,
533
+ 11,
534
+ 14,
535
+ 15,
536
+ 12,
537
+ 16,
538
+ 17,
539
+ 23,
540
+ 22,
541
+ 10,
542
+ 13,
543
+ 21,
544
+ 5,
545
+ 8,
546
+ 20,
547
+ 7,
548
+ 19,
549
+ 6,
550
+ 18,
551
+ 4,
552
+ 3,
553
+ 1,
554
+ 2
555
+ ],
556
+ "badge_grouping_ids": [
557
+ 1,
558
+ 2,
559
+ 3,
560
+ 4,
561
+ 5
562
+ ],
563
+ "badge_type_ids": [
564
+ 1,
565
+ 2,
566
+ 3
567
+ ]
568
+ }
569
+ }