From 17e2fc729d52d17ba8b07988ae168cc3c956fdc7 Mon Sep 17 00:00:00 2001 From: CaoMeiYouRen <40430746+CaoMeiYouRen@users.noreply.github.com> Date: Tue, 10 Dec 2024 10:30:42 +0800 Subject: [PATCH] feat(route/github): enhance /repos route with optional parameters for type, sort, and direction (#17827) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(route/github): enhance /repos route with optional parameters for type, sort, and direction - Updated the route to accept optional parameters: type, sort, and direction. - Added filtering logic for repository types: all, owner, member, public, private, forks, and sources. - Improved documentation for parameters to clarify usage. * refactor(github): 优化仓库路由参数配置 - 移除 `direction` 参数,简化排序逻辑 - 更新路由路径以匹配简化后的参数 --- lib/routes/github/repos.ts | 47 ++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/lib/routes/github/repos.ts b/lib/routes/github/repos.ts index 57e02e3ec..edf19af5c 100644 --- a/lib/routes/github/repos.ts +++ b/lib/routes/github/repos.ts @@ -1,13 +1,16 @@ import { Route } from '@/types'; import got from '@/utils/got'; import { config } from '@/config'; -import queryString from 'query-string'; export const route: Route = { - path: '/repos/:user', + path: '/repos/:user/:type?/:sort?', categories: ['programming'], example: '/github/repos/DIYgod', - parameters: { user: 'GitHub username' }, + parameters: { + user: 'GitHub username', + type: 'Type of repository, can be `all`, `owner`, `member`, `public`, `private`, `forks`, `sources`', + sort: 'Sort by `created`, `updated`, `pushed`, `full_name`', + }, features: { requireConfig: false, requirePuppeteer: false, @@ -28,20 +31,44 @@ export const route: Route = { async function handler(ctx) { const user = ctx.req.param('user'); - - const headers = {}; + const type = ctx.req.param('type') || 'all'; + const sort = ctx.req.param('sort') || 'created'; + let headers = {}; if (config.github && config.github.access_token) { - headers.Authorization = `token ${config.github.access_token}`; + headers = { + ...headers, + Authorization: `token ${config.github.access_token}`, + }; } const response = await got({ method: 'get', url: `https://api.github.com/users/${user}/repos`, - searchParams: queryString.stringify({ - sort: 'created', - }), + searchParams: { + type, + sort, + }, headers, }); - const data = response.data; + const data = response.data.filter((item) => { + switch (type) { + case 'all': + return true; + case 'owner': + return item.owner.login === user; + case 'member': + return item.owner.login !== user; + case 'public': + return item.private === false; + case 'private': + return item.private === true; + case 'forks': + return item.fork === true; + case 'sources': + return item.fork === false; + default: + return true; + } + }); return { allowEmpty: true, title: `${user}'s GitHub repositories`,