rsshub
Version:
Make RSS Great Again!
177 lines (175 loc) • 4.86 kB
JavaScript
import "./esm-shims-CzJ_djXG.mjs";
import { t as config } from "./config-C37vj7VH.mjs";
import "./dist-BInvbO1W.mjs";
import "./logger-Czu8UMNd.mjs";
import "./ofetch-BIyrKU3Y.mjs";
import { t as parseDate } from "./parse-date-BrP7mxXf.mjs";
import "./helpers-DxBp0Pty.mjs";
import { t as got_default } from "./got-KxxWdaxq.mjs";
import { t as config_not_found_default } from "./config-not-found-Dyp3RlZZ.mjs";
import markdownit from "markdown-it";
//#region lib/routes/github/discussions.ts
const md = markdownit({
html: true,
linkify: true
});
const route = {
path: "/discussion/:user/:repo/:state?/:category?",
categories: ["programming"],
example: "/github/discussion/DIYgod/RSSHub",
parameters: {
user: "User name",
repo: "Repo name",
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: [{
name: "GITHUB_ACCESS_TOKEN",
description: "GitHub Access Token"
}] },
radar: [{
source: [
"github.com/:user/:repo/discussions",
"github.com/:user/:repo/discussions/:id",
"github.com/:user/:repo"
],
target: "/discussion/:user/:repo"
}],
name: "Repo Discussions",
maintainers: ["waynzh"],
handler
};
async function handler(ctx) {
if (!config.github || !config.github.access_token) throw new config_not_found_default("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 = "open", category = null } = ctx.req.param();
const { answered, closed, locked } = mapStateToBooleans(state);
const perPage = Math.min(Number.parseInt(limit) || 100, 100);
const host = `https://github.com/${user}/${repo}/discussions`;
const url = "https://api.github.com/graphql";
let filters = `first: ${perPage}`;
if (answered !== null) filters += `, answered: ${answered}`;
if (category !== null) {
const categoryItem = (await got_default({
method: "post",
url,
headers: { Authorization: `bearer ${config.github.access_token}` },
json: { query: `
{
repository(owner: "${user}", name: "${repo}") {
discussionCategories(first: 25) {
nodes {
id,
name,
}
},
}
}
` }
})).data.data.repository.discussionCategories.nodes.find((item) => item.name === category);
filters += categoryItem?.id ? `, categoryId: "${categoryItem.id}"` : "";
}
const data = (await got_default({
method: "post",
url,
headers: { Authorization: `bearer ${config.github.access_token}` },
json: { query: `
{
repository(owner: "${user}", name: "${repo}") {
discussions(${filters}) {
nodes {
title,
author {
login
},
createdAt,
closed,
isAnswered,
locked,
body,
url
}
},
}
}
` }
})).data.data.repository.discussions.nodes.filter((item) => closed === null ? item : item.closed === closed).filter((item) => locked === null ? item : item.locked === locked);
return {
allowEmpty: true,
title: `${user}/${repo} Discussions`,
link: host,
item: data.map((item) => ({
title: item.title,
author: item.author?.login ?? "ghost",
description: item.body ? md.render(item.body) : "No description",
pubDate: parseDate(item.createdAt),
link: item.url
}))
};
}
function mapStateToBooleans(state) {
let answered = null;
let closed = null;
let locked = null;
switch (state) {
case "answered":
answered = true;
break;
case "unanswered":
answered = false;
break;
case "closed":
closed = true;
break;
case "open":
closed = false;
break;
case "locked":
locked = true;
break;
case "unlocked":
locked = false;
break;
case "all":
default: break;
}
return {
answered,
closed,
locked
};
}
//#endregion
export { route };