@drodil/backstage-plugin-qeta-backend 3.49.1 → 3.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/badges.cjs.js +906 -0
  2. package/dist/badges.cjs.js.map +1 -0
  3. package/dist/database/DatabaseQetaStore.cjs.js +23 -4
  4. package/dist/database/DatabaseQetaStore.cjs.js.map +1 -1
  5. package/dist/database/stores/BadgesStore.cjs.js +92 -0
  6. package/dist/database/stores/BadgesStore.cjs.js.map +1 -0
  7. package/dist/database/stores/PostsStore.cjs.js +3 -3
  8. package/dist/database/stores/PostsStore.cjs.js.map +1 -1
  9. package/dist/database/stores/StatsStore.cjs.js +22 -40
  10. package/dist/database/stores/StatsStore.cjs.js.map +1 -1
  11. package/dist/database/stores/UsersStore.cjs.js +41 -24
  12. package/dist/database/stores/UsersStore.cjs.js.map +1 -1
  13. package/dist/plugin.cjs.js +34 -2
  14. package/dist/plugin.cjs.js.map +1 -1
  15. package/dist/service/BadgeManager.cjs.js +187 -0
  16. package/dist/service/BadgeManager.cjs.js.map +1 -0
  17. package/dist/service/NotificationManager.cjs.js +26 -0
  18. package/dist/service/NotificationManager.cjs.js.map +1 -1
  19. package/dist/service/PermissionManager.cjs.js +5 -6
  20. package/dist/service/PermissionManager.cjs.js.map +1 -1
  21. package/dist/service/StatsCollector.cjs.js +37 -6
  22. package/dist/service/StatsCollector.cjs.js.map +1 -1
  23. package/dist/service/router.cjs.js +3 -11
  24. package/dist/service/router.cjs.js.map +1 -1
  25. package/dist/service/routes/badges.cjs.js +27 -0
  26. package/dist/service/routes/badges.cjs.js.map +1 -0
  27. package/dist/service/routes/statistics.cjs.js +8 -5
  28. package/dist/service/routes/statistics.cjs.js.map +1 -1
  29. package/dist/service/types.cjs.js +2 -1
  30. package/dist/service/types.cjs.js.map +1 -1
  31. package/dist/service/util.cjs.js +13 -14
  32. package/dist/service/util.cjs.js.map +1 -1
  33. package/migrations/20251222_reputation.js +166 -0
  34. package/package.json +6 -6
  35. package/dist/database/QetaStore.cjs.js +0 -24
  36. package/dist/database/QetaStore.cjs.js.map +0 -1
@@ -0,0 +1,906 @@
1
+ 'use strict';
2
+
3
+ var backstagePluginQetaCommon = require('@drodil/backstage-plugin-qeta-common');
4
+
5
+ class GoodQuestionEvaluator {
6
+ key = "good-question";
7
+ name = "Good Question";
8
+ description = "Received more than 10 votes on a question";
9
+ icon = "star";
10
+ level = "bronze";
11
+ type = "repetitive";
12
+ reputation = 10;
13
+ async evaluate(entity) {
14
+ if (!backstagePluginQetaCommon.isQuestion(entity)) {
15
+ return false;
16
+ }
17
+ return entity.score > 10;
18
+ }
19
+ }
20
+ class GreatQuestionEvaluator {
21
+ key = "great-question";
22
+ name = "Great Question";
23
+ description = "Received more than 100 votes on a question";
24
+ icon = "local_police";
25
+ level = "silver";
26
+ type = "repetitive";
27
+ reputation = 50;
28
+ async evaluate(entity) {
29
+ if (!backstagePluginQetaCommon.isQuestion(entity)) {
30
+ return false;
31
+ }
32
+ return entity.score > 100;
33
+ }
34
+ }
35
+ class FamousQuestionEvaluator {
36
+ key = "famous-question";
37
+ name = "Famous Question";
38
+ description = "Question has somewhat more than 1000 views";
39
+ icon = "visibility";
40
+ level = "gold";
41
+ type = "repetitive";
42
+ reputation = 20;
43
+ async evaluate(entity) {
44
+ if (!backstagePluginQetaCommon.isQuestion(entity)) {
45
+ return false;
46
+ }
47
+ return entity.views > 1e3;
48
+ }
49
+ }
50
+ class GoodArticleEvaluator {
51
+ key = "good-article";
52
+ name = "Good Article";
53
+ description = "Received more than 10 votes on an article";
54
+ icon = "star";
55
+ level = "bronze";
56
+ type = "repetitive";
57
+ reputation = 10;
58
+ async evaluate(entity) {
59
+ if (!backstagePluginQetaCommon.isArticle(entity)) {
60
+ return false;
61
+ }
62
+ return entity.score > 10;
63
+ }
64
+ }
65
+ class GreatArticleEvaluator {
66
+ key = "great-article";
67
+ name = "Great Article";
68
+ description = "Received more than 50 votes on an article";
69
+ icon = "local_police";
70
+ level = "silver";
71
+ type = "repetitive";
72
+ reputation = 50;
73
+ async evaluate(entity) {
74
+ if (!backstagePluginQetaCommon.isArticle(entity)) {
75
+ return false;
76
+ }
77
+ return entity.score > 50;
78
+ }
79
+ }
80
+ class GoodLinkEvaluator {
81
+ key = "good-link";
82
+ name = "Good Link";
83
+ description = "Received more than 10 votes on a link";
84
+ icon = "star";
85
+ level = "bronze";
86
+ type = "repetitive";
87
+ reputation = 10;
88
+ async evaluate(entity) {
89
+ if (!backstagePluginQetaCommon.isLink(entity)) {
90
+ return false;
91
+ }
92
+ return entity.score > 10;
93
+ }
94
+ }
95
+ class GreatLinkEvaluator {
96
+ key = "great-link";
97
+ name = "Great Link";
98
+ description = "Received more than 50 votes on a link";
99
+ icon = "local_police";
100
+ level = "silver";
101
+ type = "repetitive";
102
+ reputation = 50;
103
+ async evaluate(entity) {
104
+ if (!backstagePluginQetaCommon.isLink(entity)) {
105
+ return false;
106
+ }
107
+ return entity.score > 50;
108
+ }
109
+ }
110
+ class GoodAnswerEvaluator {
111
+ key = "good-answer";
112
+ name = "Good Answer";
113
+ description = "Received more than 10 votes on an answer";
114
+ icon = "star";
115
+ level = "bronze";
116
+ type = "repetitive";
117
+ reputation = 10;
118
+ async evaluate(entity) {
119
+ if (!backstagePluginQetaCommon.isAnswer(entity)) {
120
+ return false;
121
+ }
122
+ return entity.score > 10;
123
+ }
124
+ }
125
+ class GreatAnswerEvaluator {
126
+ key = "great-answer";
127
+ name = "Great Answer";
128
+ description = "Received more than 100 votes on an answer";
129
+ icon = "local_police";
130
+ level = "silver";
131
+ type = "repetitive";
132
+ reputation = 50;
133
+ async evaluate(entity) {
134
+ if (!backstagePluginQetaCommon.isAnswer(entity)) {
135
+ return false;
136
+ }
137
+ const score = entity.score || 0;
138
+ return score > 100;
139
+ }
140
+ }
141
+ class ExpertEvaluator {
142
+ key = "expert";
143
+ name = "Expert";
144
+ description = "Achieved a reputation score of 5000";
145
+ icon = "workspace_premium";
146
+ level = "gold";
147
+ type = "one-time";
148
+ reputation = 100;
149
+ async evaluateUser(user) {
150
+ return user.reputation >= 5e3;
151
+ }
152
+ }
153
+ class InquisitiveEvaluator {
154
+ key = "inquisitive";
155
+ name = "Inquisitive";
156
+ description = "Asked more than 5 questions";
157
+ icon = "help";
158
+ level = "bronze";
159
+ type = "one-time";
160
+ reputation = 20;
161
+ async evaluateUser(user) {
162
+ return user.totalQuestions >= 5;
163
+ }
164
+ }
165
+ class CuriousMindEvaluator {
166
+ key = "curious-mind";
167
+ name = "Curious Mind";
168
+ description = "Asked more than 20 questions";
169
+ icon = "psychology";
170
+ level = "silver";
171
+ type = "one-time";
172
+ reputation = 50;
173
+ async evaluateUser(user) {
174
+ return user.totalQuestions >= 20;
175
+ }
176
+ }
177
+ class HelperEvaluator {
178
+ key = "helper";
179
+ name = "Helper";
180
+ description = "Answered more than 5 questions";
181
+ icon = "support";
182
+ level = "bronze";
183
+ type = "one-time";
184
+ reputation = 20;
185
+ async evaluateUser(user) {
186
+ return user.totalAnswers >= 5;
187
+ }
188
+ }
189
+ class ProblemSolverEvaluator {
190
+ key = "problem-solver";
191
+ name = "Problem Solver";
192
+ description = "Answered more than 20 questions";
193
+ icon = "build";
194
+ level = "silver";
195
+ type = "one-time";
196
+ reputation = 50;
197
+ async evaluateUser(user) {
198
+ return user.totalAnswers >= 20;
199
+ }
200
+ }
201
+ class GuruEvaluator {
202
+ key = "guru";
203
+ name = "Guru";
204
+ description = "Answered more than 50 questions";
205
+ icon = "school";
206
+ level = "gold";
207
+ type = "one-time";
208
+ reputation = 100;
209
+ async evaluateUser(user) {
210
+ return user.totalAnswers >= 50;
211
+ }
212
+ }
213
+ class StudentEvaluator {
214
+ key = "student";
215
+ name = "Student";
216
+ description = "Viewed more than 10 posts";
217
+ icon = "menu_book";
218
+ level = "bronze";
219
+ type = "one-time";
220
+ reputation = 5;
221
+ async evaluateUser(user) {
222
+ return user.totalViews >= 10;
223
+ }
224
+ }
225
+ class TutorEvaluator {
226
+ key = "tutor";
227
+ name = "Tutor";
228
+ description = "Viewed more than 50 posts";
229
+ icon = "cast_for_education";
230
+ level = "silver";
231
+ type = "one-time";
232
+ reputation = 15;
233
+ async evaluateUser(user) {
234
+ return user.totalViews >= 50;
235
+ }
236
+ }
237
+ class ProfessorEvaluator {
238
+ key = "professor";
239
+ name = "Professor";
240
+ description = "Viewed more than 200 posts";
241
+ icon = "school";
242
+ level = "gold";
243
+ type = "one-time";
244
+ reputation = 40;
245
+ async evaluateUser(user) {
246
+ return user.totalViews >= 200;
247
+ }
248
+ }
249
+ class SupporterEvaluator {
250
+ key = "supporter";
251
+ name = "Supporter";
252
+ description = "Voted more than 10 times";
253
+ icon = "thumb_up";
254
+ level = "bronze";
255
+ type = "one-time";
256
+ reputation = 10;
257
+ async evaluateUser(user) {
258
+ return user.totalVotes >= 10;
259
+ }
260
+ }
261
+ class CriticEvaluator {
262
+ key = "critic";
263
+ name = "Critic";
264
+ description = "Voted more than 50 times";
265
+ icon = "rate_review";
266
+ level = "silver";
267
+ type = "one-time";
268
+ reputation = 30;
269
+ async evaluateUser(user) {
270
+ return user.totalVotes >= 50;
271
+ }
272
+ }
273
+ class BloggerEvaluator {
274
+ key = "blogger";
275
+ name = "Blogger";
276
+ description = "Wrote an article";
277
+ icon = "article";
278
+ level = "bronze";
279
+ type = "one-time";
280
+ reputation = 20;
281
+ async evaluateUser(user) {
282
+ return user.totalArticles >= 1;
283
+ }
284
+ }
285
+ class JournalistEvaluator {
286
+ key = "journalist";
287
+ name = "Journalist";
288
+ description = "Wrote more than 5 articles";
289
+ icon = "history_edu";
290
+ level = "silver";
291
+ type = "one-time";
292
+ reputation = 50;
293
+ async evaluateUser(user) {
294
+ return user.totalArticles >= 5;
295
+ }
296
+ }
297
+ class ColumnistEvaluator {
298
+ key = "columnist";
299
+ name = "Columnist";
300
+ description = "Wrote more than 20 articles";
301
+ icon = "view_column";
302
+ level = "gold";
303
+ type = "one-time";
304
+ reputation = 100;
305
+ async evaluateUser(user) {
306
+ return user.totalArticles >= 20;
307
+ }
308
+ }
309
+ class ConnectorEvaluator {
310
+ key = "connector";
311
+ name = "Connector";
312
+ description = "Posted more than 5 links";
313
+ icon = "link";
314
+ level = "bronze";
315
+ type = "one-time";
316
+ reputation = 10;
317
+ async evaluateUser(user) {
318
+ return user.totalLinks >= 5;
319
+ }
320
+ }
321
+ class NetworkerEvaluator {
322
+ key = "networker";
323
+ name = "Networker";
324
+ description = "Posted more than 20 links";
325
+ icon = "share";
326
+ level = "silver";
327
+ type = "one-time";
328
+ reputation = 30;
329
+ async evaluateUser(user) {
330
+ return user.totalLinks >= 20;
331
+ }
332
+ }
333
+ class AmbassadorEvaluator {
334
+ key = "ambassador";
335
+ name = "Ambassador";
336
+ description = "Posted more than 50 links";
337
+ icon = "public";
338
+ level = "gold";
339
+ type = "one-time";
340
+ reputation = 75;
341
+ async evaluateUser(user) {
342
+ return user.totalLinks >= 50;
343
+ }
344
+ }
345
+ class DiscussorEvaluator {
346
+ key = "discussor";
347
+ name = "Discussor";
348
+ description = "Posted more than 10 comments";
349
+ icon = "comment";
350
+ level = "bronze";
351
+ type = "one-time";
352
+ reputation = 10;
353
+ async evaluateUser(user) {
354
+ return user.totalComments >= 10;
355
+ }
356
+ }
357
+ class CommentatorEvaluator {
358
+ key = "commentator";
359
+ name = "Commentator";
360
+ description = "Posted more than 50 comments";
361
+ icon = "record_voice_over";
362
+ level = "silver";
363
+ type = "one-time";
364
+ reputation = 30;
365
+ async evaluateUser(user) {
366
+ return user.totalComments >= 50;
367
+ }
368
+ }
369
+ class PunditEvaluator {
370
+ key = "pundit";
371
+ name = "Pundit";
372
+ description = "Posted more than 200 comments";
373
+ icon = "campaign";
374
+ level = "gold";
375
+ type = "one-time";
376
+ reputation = 75;
377
+ async evaluateUser(user) {
378
+ return user.totalComments >= 200;
379
+ }
380
+ }
381
+ class EditorEvaluator {
382
+ key = "editor";
383
+ name = "Editor";
384
+ description = "Wrote more than 100 articles";
385
+ icon = "gavel";
386
+ level = "diamond";
387
+ type = "one-time";
388
+ reputation = 200;
389
+ async evaluateUser(user) {
390
+ return user.totalArticles >= 100;
391
+ }
392
+ }
393
+ class HubEvaluator {
394
+ key = "hub";
395
+ name = "Hub";
396
+ description = "Posted more than 100 links";
397
+ icon = "device_hub";
398
+ level = "diamond";
399
+ type = "one-time";
400
+ system = true;
401
+ reputation = 150;
402
+ async evaluateUser(user) {
403
+ return user.totalLinks >= 100;
404
+ }
405
+ }
406
+ class OratorEvaluator {
407
+ key = "orator";
408
+ name = "Orator";
409
+ description = "Posted more than 500 comments";
410
+ icon = "hearing";
411
+ level = "diamond";
412
+ type = "one-time";
413
+ reputation = 150;
414
+ async evaluateUser(user) {
415
+ return user.totalComments >= 500;
416
+ }
417
+ }
418
+ class EnthusiastEvaluator {
419
+ key = "enthusiast";
420
+ name = "Enthusiast";
421
+ description = "Achieved a reputation score of 500";
422
+ icon = "verified";
423
+ level = "bronze";
424
+ type = "one-time";
425
+ reputation = 20;
426
+ async evaluateUser(user) {
427
+ return user.reputation >= 500;
428
+ }
429
+ }
430
+ class SpecialistEvaluator {
431
+ key = "specialist";
432
+ name = "Specialist";
433
+ description = "Achieved a reputation score of 2500";
434
+ icon = "verified";
435
+ level = "silver";
436
+ type = "one-time";
437
+ reputation = 50;
438
+ async evaluateUser(user) {
439
+ return user.reputation >= 2500;
440
+ }
441
+ }
442
+ class AuthorityEvaluator {
443
+ key = "authority";
444
+ name = "Authority";
445
+ description = "Achieved a reputation score of 15000";
446
+ icon = "verified";
447
+ level = "diamond";
448
+ type = "one-time";
449
+ reputation = 100;
450
+ async evaluateUser(user) {
451
+ return user.reputation >= 15e3;
452
+ }
453
+ }
454
+ class SolverEvaluator {
455
+ key = "solver";
456
+ name = "Solver";
457
+ description = "Marked as correct answer for 1 question";
458
+ icon = "check_circle";
459
+ level = "bronze";
460
+ type = "one-time";
461
+ reputation = 0;
462
+ async evaluateCollection(entities) {
463
+ return entities.filter((e) => backstagePluginQetaCommon.isAnswer(e) && e.correct).length >= 1;
464
+ }
465
+ }
466
+ class FixerEvaluator {
467
+ key = "fixer";
468
+ name = "Fixer";
469
+ description = "Marked as correct answer for 5 questions";
470
+ icon = "done_all";
471
+ level = "silver";
472
+ type = "one-time";
473
+ reputation = 0;
474
+ async evaluateCollection(entities) {
475
+ return entities.filter((e) => backstagePluginQetaCommon.isAnswer(e) && e.correct).length >= 5;
476
+ }
477
+ }
478
+ class ArchitectEvaluator {
479
+ key = "architect";
480
+ name = "Architect";
481
+ description = "Marked as correct answer for 20 questions";
482
+ icon = "construction";
483
+ level = "gold";
484
+ type = "one-time";
485
+ reputation = 0;
486
+ async evaluateCollection(entities) {
487
+ return entities.filter((e) => backstagePluginQetaCommon.isAnswer(e) && e.correct).length >= 20;
488
+ }
489
+ }
490
+ class WizardEvaluator {
491
+ key = "wizard";
492
+ name = "Wizard";
493
+ description = "Marked as correct answer for 50 questions";
494
+ icon = "auto_fix_high";
495
+ level = "diamond";
496
+ type = "one-time";
497
+ reputation = 0;
498
+ async evaluateCollection(entities) {
499
+ return entities.filter((e) => backstagePluginQetaCommon.isAnswer(e) && e.correct).length >= 50;
500
+ }
501
+ }
502
+ class FriendlyEvaluator {
503
+ key = "friendly";
504
+ name = "Friendly";
505
+ description = "Gained 5 followers";
506
+ icon = "person_add";
507
+ level = "bronze";
508
+ type = "one-time";
509
+ reputation = 15;
510
+ async evaluateUser(user) {
511
+ return user.totalFollowers >= 5;
512
+ }
513
+ }
514
+ class InfluencerEvaluator {
515
+ key = "influencer";
516
+ name = "Influencer";
517
+ description = "Gained 25 followers";
518
+ icon = "trending_up";
519
+ level = "silver";
520
+ type = "one-time";
521
+ reputation = 40;
522
+ async evaluateUser(user) {
523
+ return user.totalFollowers >= 25;
524
+ }
525
+ }
526
+ class CelebrityEvaluator {
527
+ key = "celebrity";
528
+ name = "Celebrity";
529
+ description = "Gained 100 followers";
530
+ icon = "emoji_events";
531
+ level = "gold";
532
+ type = "one-time";
533
+ reputation = 100;
534
+ async evaluateUser(user) {
535
+ return user.totalFollowers >= 100;
536
+ }
537
+ }
538
+ class CultLeaderEvaluator {
539
+ key = "cult-leader";
540
+ name = "Cult Leader";
541
+ description = "Gained 500 followers - you have a loyal following!";
542
+ icon = "groups";
543
+ level = "diamond";
544
+ type = "one-time";
545
+ reputation = 250;
546
+ async evaluateUser(user) {
547
+ return user.totalFollowers >= 500;
548
+ }
549
+ }
550
+ class NightOwlEvaluator {
551
+ key = "night-owl";
552
+ name = "Night Owl";
553
+ description = "Posted more than 100 questions and answers";
554
+ icon = "nights_stay";
555
+ level = "silver";
556
+ type = "one-time";
557
+ reputation = 35;
558
+ async evaluateUser(user) {
559
+ return user.totalQuestions + user.totalAnswers >= 100;
560
+ }
561
+ }
562
+ class EncyclopediaEvaluator {
563
+ key = "encyclopedia";
564
+ name = "Encyclopedia";
565
+ description = "Created content across all types - question, article, and link";
566
+ icon = "auto_stories";
567
+ level = "gold";
568
+ type = "one-time";
569
+ reputation = 50;
570
+ async evaluateUser(user) {
571
+ return user.totalQuestions >= 1 && user.totalArticles >= 1 && user.totalLinks >= 1;
572
+ }
573
+ }
574
+ class PolyglotEvaluator {
575
+ key = "polyglot";
576
+ name = "Polyglot";
577
+ description = "Master of all trades - 10+ questions, answers, articles, and links";
578
+ icon = "translate";
579
+ level = "diamond";
580
+ type = "one-time";
581
+ reputation = 150;
582
+ async evaluateUser(user) {
583
+ return user.totalQuestions >= 10 && user.totalAnswers >= 10 && user.totalArticles >= 10 && user.totalLinks >= 10;
584
+ }
585
+ }
586
+ class ChatterboxEvaluator {
587
+ key = "chatterbox";
588
+ name = "Chatterbox";
589
+ description = "Posted more than 100 comments - you love to chat!";
590
+ icon = "chat_bubble";
591
+ level = "silver";
592
+ type = "one-time";
593
+ reputation = 25;
594
+ async evaluateUser(user) {
595
+ return user.totalComments >= 100;
596
+ }
597
+ }
598
+ class CuratorEvaluator {
599
+ key = "curator";
600
+ name = "Curator";
601
+ description = "Created a collection with more than 5 posts";
602
+ icon = "collections_bookmark";
603
+ level = "bronze";
604
+ type = "repetitive";
605
+ reputation = 15;
606
+ async evaluate(entity) {
607
+ if (!backstagePluginQetaCommon.isCollection(entity)) {
608
+ return false;
609
+ }
610
+ return entity.postsCount >= 5;
611
+ }
612
+ }
613
+ class LibrarianEvaluator {
614
+ key = "librarian";
615
+ name = "Librarian";
616
+ description = "Created a collection with more than 20 posts";
617
+ icon = "local_library";
618
+ level = "silver";
619
+ type = "repetitive";
620
+ reputation = 40;
621
+ async evaluate(entity) {
622
+ if (!backstagePluginQetaCommon.isCollection(entity)) {
623
+ return false;
624
+ }
625
+ return entity.postsCount >= 20;
626
+ }
627
+ }
628
+ class ArchivistEvaluator {
629
+ key = "archivist";
630
+ name = "Archivist";
631
+ description = "Created a collection with more than 50 posts";
632
+ icon = "archive";
633
+ level = "gold";
634
+ type = "repetitive";
635
+ reputation = 100;
636
+ async evaluate(entity) {
637
+ if (!backstagePluginQetaCommon.isCollection(entity)) {
638
+ return false;
639
+ }
640
+ return entity.postsCount >= 50;
641
+ }
642
+ }
643
+ class CollectorEvaluator {
644
+ key = "collector";
645
+ name = "Collector";
646
+ description = "Created your first collection";
647
+ icon = "playlist_add";
648
+ level = "bronze";
649
+ type = "one-time";
650
+ reputation = 10;
651
+ async evaluateCollection(entities) {
652
+ return entities.filter((e) => backstagePluginQetaCommon.isCollection(e)).length >= 1;
653
+ }
654
+ }
655
+ class OrganizerEvaluator {
656
+ key = "organizer";
657
+ name = "Organizer";
658
+ description = "Created more than 5 collections";
659
+ icon = "folder_special";
660
+ level = "silver";
661
+ type = "one-time";
662
+ reputation = 35;
663
+ async evaluateCollection(entities) {
664
+ return entities.filter((e) => backstagePluginQetaCommon.isCollection(e)).length >= 5;
665
+ }
666
+ }
667
+ class CatalogerEvaluator {
668
+ key = "cataloger";
669
+ name = "Cataloger";
670
+ description = "Created more than 15 collections";
671
+ icon = "inventory";
672
+ level = "gold";
673
+ type = "one-time";
674
+ reputation = 75;
675
+ async evaluateCollection(entities) {
676
+ return entities.filter((e) => backstagePluginQetaCommon.isCollection(e)).length >= 15;
677
+ }
678
+ }
679
+ class TrendsetterEvaluator {
680
+ key = "trendsetter";
681
+ name = "Trendsetter";
682
+ description = "Collection has more than 10 followers";
683
+ icon = "trending_up";
684
+ level = "bronze";
685
+ type = "repetitive";
686
+ reputation = 20;
687
+ async evaluate(entity) {
688
+ if (!backstagePluginQetaCommon.isCollection(entity)) {
689
+ return false;
690
+ }
691
+ return entity.followers >= 10;
692
+ }
693
+ }
694
+ class TasteMarkerEvaluator {
695
+ key = "taste-maker";
696
+ name = "Taste Maker";
697
+ description = "Collection has more than 50 followers";
698
+ icon = "star_rate";
699
+ level = "silver";
700
+ type = "repetitive";
701
+ reputation = 50;
702
+ async evaluate(entity) {
703
+ if (!backstagePluginQetaCommon.isCollection(entity)) {
704
+ return false;
705
+ }
706
+ return entity.followers >= 50;
707
+ }
708
+ }
709
+ class IconicCollectionEvaluator {
710
+ key = "iconic-collection";
711
+ name = "Iconic Collection";
712
+ description = "Collection has more than 200 followers";
713
+ icon = "diamond";
714
+ level = "gold";
715
+ type = "repetitive";
716
+ reputation = 150;
717
+ async evaluate(entity) {
718
+ if (!backstagePluginQetaCommon.isCollection(entity)) {
719
+ return false;
720
+ }
721
+ return entity.followers >= 200;
722
+ }
723
+ }
724
+ class LegendEvaluator {
725
+ key = "legend";
726
+ name = "Legend";
727
+ description = "The ultimate achievement - You are basically running this company!";
728
+ icon = "whatshot";
729
+ level = "diamond";
730
+ type = "one-time";
731
+ reputation = 1e3;
732
+ async evaluateUser(user) {
733
+ return user.reputation >= 25e3 && user.totalQuestions >= 50 && user.totalAnswers >= 100 && user.totalArticles >= 25 && user.totalLinks >= 50 && user.totalFollowers >= 20;
734
+ }
735
+ }
736
+ class PicassoEvaluator {
737
+ key = "picasso";
738
+ name = "Picasso";
739
+ description = "Visual artist - Added a header image to your post";
740
+ icon = "palette";
741
+ level = "bronze";
742
+ type = "one-time";
743
+ reputation = 10;
744
+ async evaluate(entity) {
745
+ if (!backstagePluginQetaCommon.isPost(entity)) {
746
+ return false;
747
+ }
748
+ return !!entity.headerImage;
749
+ }
750
+ }
751
+ class PaparazziEvaluator {
752
+ key = "paparazzi";
753
+ name = "Paparazzi";
754
+ description = "A picture is worth a thousand words - Embedded 3+ images in a post";
755
+ icon = "camera_alt";
756
+ level = "silver";
757
+ type = "one-time";
758
+ reputation = 25;
759
+ async evaluate(entity) {
760
+ if (!backstagePluginQetaCommon.isPost(entity)) {
761
+ return false;
762
+ }
763
+ return (entity.images?.length ?? 0) >= 3;
764
+ }
765
+ }
766
+ class TagHoarderEvaluator {
767
+ key = "tag-hoarder";
768
+ name = "Tag Hoarder";
769
+ description = "Categorization enthusiast - Used 5+ tags on a post";
770
+ icon = "label_important";
771
+ level = "bronze";
772
+ type = "repetitive";
773
+ reputation = 15;
774
+ async evaluate(entity) {
775
+ if (!backstagePluginQetaCommon.isPost(entity)) {
776
+ return false;
777
+ }
778
+ return (entity.tags?.length ?? 0) >= 5;
779
+ }
780
+ }
781
+ const BADGE_EVALUATORS = [
782
+ new GoodQuestionEvaluator(),
783
+ new GreatQuestionEvaluator(),
784
+ new FamousQuestionEvaluator(),
785
+ new GoodAnswerEvaluator(),
786
+ new GreatAnswerEvaluator(),
787
+ new GoodArticleEvaluator(),
788
+ new GreatArticleEvaluator(),
789
+ new GoodLinkEvaluator(),
790
+ new GreatLinkEvaluator(),
791
+ new InquisitiveEvaluator(),
792
+ new CuriousMindEvaluator(),
793
+ new HelperEvaluator(),
794
+ new ProblemSolverEvaluator(),
795
+ new GuruEvaluator(),
796
+ new StudentEvaluator(),
797
+ new TutorEvaluator(),
798
+ new ProfessorEvaluator(),
799
+ new SupporterEvaluator(),
800
+ new CriticEvaluator(),
801
+ new BloggerEvaluator(),
802
+ new JournalistEvaluator(),
803
+ new ColumnistEvaluator(),
804
+ new EditorEvaluator(),
805
+ new ConnectorEvaluator(),
806
+ new NetworkerEvaluator(),
807
+ new AmbassadorEvaluator(),
808
+ new HubEvaluator(),
809
+ new DiscussorEvaluator(),
810
+ new CommentatorEvaluator(),
811
+ new PunditEvaluator(),
812
+ new OratorEvaluator(),
813
+ new ExpertEvaluator(),
814
+ new EnthusiastEvaluator(),
815
+ new SpecialistEvaluator(),
816
+ new AuthorityEvaluator(),
817
+ new SolverEvaluator(),
818
+ new FixerEvaluator(),
819
+ new ArchitectEvaluator(),
820
+ new WizardEvaluator(),
821
+ new FriendlyEvaluator(),
822
+ new InfluencerEvaluator(),
823
+ new CelebrityEvaluator(),
824
+ new CultLeaderEvaluator(),
825
+ new NightOwlEvaluator(),
826
+ new EncyclopediaEvaluator(),
827
+ new PolyglotEvaluator(),
828
+ new ChatterboxEvaluator(),
829
+ new CuratorEvaluator(),
830
+ new LibrarianEvaluator(),
831
+ new ArchivistEvaluator(),
832
+ new CollectorEvaluator(),
833
+ new OrganizerEvaluator(),
834
+ new CatalogerEvaluator(),
835
+ new TrendsetterEvaluator(),
836
+ new TasteMarkerEvaluator(),
837
+ new IconicCollectionEvaluator(),
838
+ new LegendEvaluator(),
839
+ // Fun badges
840
+ new PicassoEvaluator(),
841
+ new PaparazziEvaluator(),
842
+ new TagHoarderEvaluator()
843
+ ];
844
+
845
+ exports.AmbassadorEvaluator = AmbassadorEvaluator;
846
+ exports.ArchitectEvaluator = ArchitectEvaluator;
847
+ exports.ArchivistEvaluator = ArchivistEvaluator;
848
+ exports.AuthorityEvaluator = AuthorityEvaluator;
849
+ exports.BADGE_EVALUATORS = BADGE_EVALUATORS;
850
+ exports.BloggerEvaluator = BloggerEvaluator;
851
+ exports.CatalogerEvaluator = CatalogerEvaluator;
852
+ exports.CelebrityEvaluator = CelebrityEvaluator;
853
+ exports.ChatterboxEvaluator = ChatterboxEvaluator;
854
+ exports.CollectorEvaluator = CollectorEvaluator;
855
+ exports.ColumnistEvaluator = ColumnistEvaluator;
856
+ exports.CommentatorEvaluator = CommentatorEvaluator;
857
+ exports.ConnectorEvaluator = ConnectorEvaluator;
858
+ exports.CriticEvaluator = CriticEvaluator;
859
+ exports.CultLeaderEvaluator = CultLeaderEvaluator;
860
+ exports.CuratorEvaluator = CuratorEvaluator;
861
+ exports.CuriousMindEvaluator = CuriousMindEvaluator;
862
+ exports.DiscussorEvaluator = DiscussorEvaluator;
863
+ exports.EditorEvaluator = EditorEvaluator;
864
+ exports.EncyclopediaEvaluator = EncyclopediaEvaluator;
865
+ exports.EnthusiastEvaluator = EnthusiastEvaluator;
866
+ exports.ExpertEvaluator = ExpertEvaluator;
867
+ exports.FamousQuestionEvaluator = FamousQuestionEvaluator;
868
+ exports.FixerEvaluator = FixerEvaluator;
869
+ exports.FriendlyEvaluator = FriendlyEvaluator;
870
+ exports.GoodAnswerEvaluator = GoodAnswerEvaluator;
871
+ exports.GoodArticleEvaluator = GoodArticleEvaluator;
872
+ exports.GoodLinkEvaluator = GoodLinkEvaluator;
873
+ exports.GoodQuestionEvaluator = GoodQuestionEvaluator;
874
+ exports.GreatAnswerEvaluator = GreatAnswerEvaluator;
875
+ exports.GreatArticleEvaluator = GreatArticleEvaluator;
876
+ exports.GreatLinkEvaluator = GreatLinkEvaluator;
877
+ exports.GreatQuestionEvaluator = GreatQuestionEvaluator;
878
+ exports.GuruEvaluator = GuruEvaluator;
879
+ exports.HelperEvaluator = HelperEvaluator;
880
+ exports.HubEvaluator = HubEvaluator;
881
+ exports.IconicCollectionEvaluator = IconicCollectionEvaluator;
882
+ exports.InfluencerEvaluator = InfluencerEvaluator;
883
+ exports.InquisitiveEvaluator = InquisitiveEvaluator;
884
+ exports.JournalistEvaluator = JournalistEvaluator;
885
+ exports.LegendEvaluator = LegendEvaluator;
886
+ exports.LibrarianEvaluator = LibrarianEvaluator;
887
+ exports.NetworkerEvaluator = NetworkerEvaluator;
888
+ exports.NightOwlEvaluator = NightOwlEvaluator;
889
+ exports.OratorEvaluator = OratorEvaluator;
890
+ exports.OrganizerEvaluator = OrganizerEvaluator;
891
+ exports.PaparazziEvaluator = PaparazziEvaluator;
892
+ exports.PicassoEvaluator = PicassoEvaluator;
893
+ exports.PolyglotEvaluator = PolyglotEvaluator;
894
+ exports.ProblemSolverEvaluator = ProblemSolverEvaluator;
895
+ exports.ProfessorEvaluator = ProfessorEvaluator;
896
+ exports.PunditEvaluator = PunditEvaluator;
897
+ exports.SolverEvaluator = SolverEvaluator;
898
+ exports.SpecialistEvaluator = SpecialistEvaluator;
899
+ exports.StudentEvaluator = StudentEvaluator;
900
+ exports.SupporterEvaluator = SupporterEvaluator;
901
+ exports.TagHoarderEvaluator = TagHoarderEvaluator;
902
+ exports.TasteMarkerEvaluator = TasteMarkerEvaluator;
903
+ exports.TrendsetterEvaluator = TrendsetterEvaluator;
904
+ exports.TutorEvaluator = TutorEvaluator;
905
+ exports.WizardEvaluator = WizardEvaluator;
906
+ //# sourceMappingURL=badges.cjs.js.map