app/routes/api.github.repositories.tsx (55 lines of code) (raw):

import { LoaderFunction, json } from "@remix-run/node"; import { extractCredentialsFromCookie } from "~/lib/server/auth"; import { GitHubAPIService } from "~/lib/githubAPIService"; export const loader: LoaderFunction = async ({ request }) => { try { // Check authentication and GitHub connection const cookieHeader = request.headers.get("Cookie"); const credentials = extractCredentialsFromCookie(cookieHeader); if (!credentials.githubToken) { return json( { error: "GitHub not connected", repositories: [], }, { status: 401 } ); } const url = new URL(request.url); const searchQuery = url.searchParams.get("search"); const type = (url.searchParams.get("type") as "all" | "owner" | "member") || "all"; const page = parseInt(url.searchParams.get("page") || "1"); let repositories; if (searchQuery) { // Search repositories repositories = await GitHubAPIService.searchUserRepositories( credentials.githubToken, searchQuery, credentials.githubUserInfo?.username ); } else { // Get user repositories repositories = await GitHubAPIService.getUserRepositories( credentials.githubToken, { type, sort: "updated", direction: "desc", per_page: 50, page, } ); } return json({ repositories, user: credentials.githubUserInfo, }); } catch (error) { console.error("Error fetching GitHub repositories:", error); return json( { error: "Failed to fetch repositories", repositories: [], }, { status: 500 } ); } };