feat(route): github discussion add category filter (#16983)

This commit is contained in:
Wayne Zhang 2024-10-02 04:24:45 +08:00 committed by GitHub
parent 0a79a862a7
commit 78a5e4fdfc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 75 additions and 16 deletions

View File

@ -10,13 +10,47 @@ const md = MarkdownIt({
import { parseDate } from '@/utils/parse-date';
export const route: Route = {
path: '/discussion/:user/:repo/:state?',
path: '/discussion/:user/:repo/:state?/:category?',
categories: ['programming'],
example: '/github/discussion/DIYgod/RSSHub',
parameters: {
user: 'User name',
repo: 'Repo name',
state: 'The state of discussions. Can be either `open`, `closed`, `answered`, `unanswered`, `locked`, `unlocked` or `all`. Default: `all`.',
state: {
description: 'The state of discussions',
default: 'open',
options: [
{
label: 'Open',
value: 'open',
},
{
label: 'Closed',
value: 'closed',
},
{
label: 'Answered',
value: 'answered',
},
{
label: 'Unanswered',
value: 'unanswered',
},
{
label: 'Locked',
value: 'locked',
},
{
label: 'Unlocked',
value: 'unlocked',
},
{
label: 'All',
value: 'all',
},
],
},
category: 'Category Name (case-sensitive). Default: `null`.',
},
features: {
requireConfig: [
@ -41,7 +75,7 @@ async function handler(ctx) {
if (!config.github || !config.github.access_token) {
throw new ConfigNotFoundError('GitHub Discussions RSS is disabled due to the lack of <a href="https://docs.rsshub.app/deploy/config#route-specific-configurations">relevant config</a>');
}
const { user, repo, limit, state = 'all' } = ctx.req.param();
const { user, repo, limit, state = 'open', category = null } = ctx.req.param();
const { answered, closed, locked } = mapStateToBooleans(state);
const perPage = Math.min(Number.parseInt(limit) || 100, 100);
@ -52,6 +86,31 @@ async function handler(ctx) {
if (answered !== null) {
filters += `, answered: ${answered}`;
}
if (category !== null) {
const response = await got({
method: 'post',
url,
headers: {
Authorization: `bearer ${config.github.access_token}`,
},
json: {
query: `
{
repository(owner: "${user}", name: "${repo}") {
discussionCategories(first: 25) {
nodes {
id,
name,
}
},
}
}
`,
},
});
const categoryItem = response.data.data.repository.discussionCategories.nodes.find((item) => item.name === category);
filters += categoryItem?.id ? `, categoryId: "${categoryItem.id}"` : '';
}
const response = await got({
method: 'post',
@ -63,19 +122,19 @@ async function handler(ctx) {
query: `
{
repository(owner: "${user}", name: "${repo}") {
discussions(${filters}) {
nodes {
title,
author {
login
},
createdAt,
closed,
isAnswered,
locked,
body,
url
}
discussions(${filters}) {
nodes {
title,
author {
login
},
createdAt,
closed,
isAnswered,
locked,
body,
url
}
},
}
}