diff --git a/source/app/mocks/api/github/graphql/discussions.comments.mjs b/source/app/mocks/api/github/graphql/discussions.comments.mjs new file mode 100644 index 00000000..303194b2 --- /dev/null +++ b/source/app/mocks/api/github/graphql/discussions.comments.mjs @@ -0,0 +1,22 @@ +/**Mocked data */ +export default function({faker, query, login = faker.internet.userName()}) { + console.debug("metrics/compute/mocks > mocking graphql api result > discussions/comments") + return /after: "MOCKED_CURSOR"/m.test(query) + ? ({ + user:{ + repositoryDiscussionsComments:{ + edges:[], + nodes:[], + } + } + }) + : ({ + user:{ + repositoryDiscussionsComments:{ + edges:new Array(100).fill(null).map(_ => ({cursor:"MOCKED_CURSOR"})), + nodes:new Array(100).fill(null).map(_ => ({upvoteCount: faker.datatype.number(10)})) + } + } + }) +} + diff --git a/source/app/web/statics/app.placeholder.js b/source/app/web/statics/app.placeholder.js index aa3761ec..462a7dca 100644 --- a/source/app/web/statics/app.placeholder.js +++ b/source/app/web/statics/app.placeholder.js @@ -594,6 +594,7 @@ stats: { '🙏 Q&A': faker.datatype.number(100), '📣 Announcements': faker.datatype.number(100), '💡 Ideas': faker.datatype.number(100), '💬 General': faker.datatype.number(100) }, favorite: '📣 Announcements' }, + upvotes: { discussions:faker.datatype.number(1000), comments: faker.datatype.number(1000) }, started: faker.datatype.number(1000), comments: faker.datatype.number(1000), answers: faker.datatype.number(1000), diff --git a/source/plugins/discussions/index.mjs b/source/plugins/discussions/index.mjs index 9ba20a0b..ceba5045 100644 --- a/source/plugins/discussions/index.mjs +++ b/source/plugins/discussions/index.mjs @@ -8,7 +8,7 @@ //Load inputs imports.metadata.plugins.discussions.inputs({data, account, q}) - const discussions = {categories:{}} + const discussions = {categories:{}, upvotes:{discussions:0, comments:0}} //Fetch general statistics const stats = Object.fromEntries(Object.entries((await graphql(queries.discussions.statistics({login}))).user).map(([key, value]) => [key, value.totalCount])) @@ -29,6 +29,9 @@ console.debug(`metrics/compute/${login}/discussions > retrieved ${pushed} discussions after ${cursor}`) } while ((pushed) && (cursor)) + //Compute upvotes + fetched.map(({upvoteCount}) => discussions.upvotes.discussions += upvoteCount) + //Compute favorite category for (const category of [...fetched.map(({category:{emoji, name}}) => `${imports.emoji.get(emoji)} ${name}`)]) categories[category] = (categories[category] ?? 0) + 1 @@ -37,6 +40,24 @@ discussions.categories.favorite = categoryEntries[0]?.[0] ?? null } + //Load comments + { + const fetched = [] + let cursor = null + let pushed = 0 + do { + console.debug(`metrics/compute/${login}/discussions > retrieving comments after ${cursor}`) + const {user:{repositoryDiscussionComments:{edges = [], nodes = []} = {}}} = await graphql(queries.discussions.comments({login, after:cursor ? `after: "${cursor}"` : ""})) + cursor = edges?.[edges?.length - 1]?.cursor + fetched.push(...nodes) + pushed = nodes.length + console.debug(`metrics/compute/${login}/discussions > retrieved ${pushed} comments after ${cursor}`) + } while ((pushed) && (cursor)) + + //Compute upvotes + fetched.map(({upvoteCount}) => discussions.upvotes.comments += upvoteCount) + } + //Results return discussions } diff --git a/source/plugins/discussions/queries/categories.graphql b/source/plugins/discussions/queries/categories.graphql index cc6ba0f6..3083354d 100644 --- a/source/plugins/discussions/queries/categories.graphql +++ b/source/plugins/discussions/queries/categories.graphql @@ -5,6 +5,7 @@ query DiscussionsCategories { cursor } nodes { + upvoteCount category { emoji name diff --git a/source/plugins/discussions/queries/comments.graphql b/source/plugins/discussions/queries/comments.graphql new file mode 100644 index 00000000..85a158d5 --- /dev/null +++ b/source/plugins/discussions/queries/comments.graphql @@ -0,0 +1,12 @@ +query DiscussionsComments { + user(login: "$login") { + repositoryDiscussionComments($after first: 100) { + edges { + cursor + } + nodes { + upvoteCount + } + } + } +} \ No newline at end of file diff --git a/source/templates/classic/partials/discussions.ejs b/source/templates/classic/partials/discussions.ejs index 7ff84e26..6af30d29 100644 --- a/source/templates/classic/partials/discussions.ejs +++ b/source/templates/classic/partials/discussions.ejs @@ -24,13 +24,21 @@ <%= plugins.discussions.comments %> Comment<%= s(plugins.discussions.comments) %> - -
<%= plugins.discussions.answers %> Answer<%= s(plugins.discussions.answers) %>
+
+
+ + <%= plugins.discussions.upvotes.discussions %> Upvote<%= s(plugins.discussions.upvotes.discussions) %> from discussions +
+
+ + <%= plugins.discussions.upvotes.comments %> Upvote<%= s(plugins.discussions.upvotes.comments) %> from comments +
+
<% if (Object.keys(plugins.discussions.categories.stats).length) { %>