From 025a49b715ab9d3ffbeb226b94ec1f1e30bf4e07 Mon Sep 17 00:00:00 2001
From: Pierce Thompson <52843537+Insprill@users.noreply.github.com>
Date: Tue, 8 Nov 2022 11:27:06 -0500
Subject: [PATCH] Add [modrinth] followers (#8601)

* Add Modrinth followers

* Update class names
---
 ...rvice.js => modrinth-downloads.service.js} |  4 +-
 ...tester.js => modrinth-downloads.tester.js} |  0
 .../modrinth/modrinth-followers.service.js    | 49 +++++++++++++++++++
 .../modrinth/modrinth-followers.tester.js     | 12 +++++
 4 files changed, 63 insertions(+), 2 deletions(-)
 rename services/modrinth/{modrinth.service.js => modrinth-downloads.service.js} (89%)
 rename services/modrinth/{modrinth.tester.js => modrinth-downloads.tester.js} (100%)
 create mode 100644 services/modrinth/modrinth-followers.service.js
 create mode 100644 services/modrinth/modrinth-followers.tester.js

diff --git a/services/modrinth/modrinth.service.js b/services/modrinth/modrinth-downloads.service.js
similarity index 89%
rename from services/modrinth/modrinth.service.js
rename to services/modrinth/modrinth-downloads.service.js
index acbf47b905..5ce5ec079d 100644
--- a/services/modrinth/modrinth.service.js
+++ b/services/modrinth/modrinth-downloads.service.js
@@ -7,7 +7,7 @@ const schema = Joi.object({
   downloads: nonNegativeInteger,
 }).required()
 
-export default class Modrinth extends BaseJsonService {
+export default class ModrinthDownloads extends BaseJsonService {
   static category = 'downloads'
 
   static route = {
@@ -17,7 +17,7 @@ export default class Modrinth extends BaseJsonService {
 
   static examples = [
     {
-      title: 'Modrinth',
+      title: 'Modrinth Downloads',
       namedParams: { projectId: 'AANobbMI' },
       staticPreview: renderDownloadsBadge({ downloads: 120000 }),
     },
diff --git a/services/modrinth/modrinth.tester.js b/services/modrinth/modrinth-downloads.tester.js
similarity index 100%
rename from services/modrinth/modrinth.tester.js
rename to services/modrinth/modrinth-downloads.tester.js
diff --git a/services/modrinth/modrinth-followers.service.js b/services/modrinth/modrinth-followers.service.js
new file mode 100644
index 0000000000..69c1f9d771
--- /dev/null
+++ b/services/modrinth/modrinth-followers.service.js
@@ -0,0 +1,49 @@
+import Joi from 'joi'
+import { metric } from '../text-formatters.js'
+import { BaseJsonService } from '../index.js'
+import { nonNegativeInteger } from '../validators.js'
+
+const schema = Joi.object({
+  followers: nonNegativeInteger,
+}).required()
+
+export default class ModrinthFollowers extends BaseJsonService {
+  static category = 'social'
+
+  static route = {
+    base: 'modrinth/followers',
+    pattern: ':projectId',
+  }
+
+  static examples = [
+    {
+      title: 'Modrinth Followers',
+      namedParams: { projectId: 'AANobbMI' },
+      staticPreview: Object.assign(this.render({ followers: 176 }), {
+        label: 'Followers',
+        style: 'social',
+      }),
+    },
+  ]
+
+  static defaultBadgeData = { label: 'followers' }
+
+  static render({ followers }) {
+    return {
+      message: metric(followers),
+      color: 'blue',
+    }
+  }
+
+  async fetch({ projectId }) {
+    return this._requestJson({
+      schema,
+      url: `https://api.modrinth.com/v2/project/${projectId}`,
+    })
+  }
+
+  async handle({ projectId }) {
+    const { followers } = await this.fetch({ projectId })
+    return this.constructor.render({ followers })
+  }
+}
diff --git a/services/modrinth/modrinth-followers.tester.js b/services/modrinth/modrinth-followers.tester.js
new file mode 100644
index 0000000000..2e39bc464e
--- /dev/null
+++ b/services/modrinth/modrinth-followers.tester.js
@@ -0,0 +1,12 @@
+import { createServiceTester } from '../tester.js'
+import { isMetric } from '../test-validators.js'
+
+export const t = await createServiceTester()
+
+t.create('Followers')
+  .get('/AANobbMI.json')
+  .expectBadge({ label: 'followers', message: isMetric })
+
+t.create('Followers (not found)')
+  .get('/not-existing.json')
+  .expectBadge({ label: 'followers', message: 'not found', color: 'red' })
-- 
GitLab