From 1acee3143273fc9a050245ed074fffd72d70d9ba Mon Sep 17 00:00:00 2001 From: ngc2207 Date: Sun, 1 Dec 2024 22:12:55 +0800 Subject: [PATCH] feat: integrate Gitea API for user management and add error handling --- next.config.ts | 7 ++++ package.json | 3 ++ src/app/actions/(gitea)/admin/users/index.ts | 17 ++++++++++ src/lib/gitea.ts | 35 ++++++++++++++++++++ 4 files changed, 62 insertions(+) create mode 100644 src/app/actions/(gitea)/admin/users/index.ts create mode 100644 src/lib/gitea.ts diff --git a/next.config.ts b/next.config.ts index e9ffa30..5fa4aca 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,14 @@ +import logger from "@/lib/logger"; import type { NextConfig } from "next"; const nextConfig: NextConfig = { /* config options here */ + serverExternalPackages: ["pino", "pino-pretty"], }; +if (!process.env.GITEA_URL || !process.env.GITEA_TOKEN) { + logger.error("GITEA_URL and GITEA_TOKEN must be set in your .env file"); + throw new Error("GITEA_URL and GITEA_TOKEN must be set in your .env file"); +} + export default nextConfig; diff --git a/package.json b/package.json index 63c7dda..68db43d 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,11 @@ "lint": "next lint" }, "dependencies": { + "@radix-ui/react-slot": "^1.1.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "cross-fetch": "^4.0.0", + "gitea-js": "^1.22.0", "lucide-react": "^0.462.0", "next": "15.0.3", "pino": "^9.5.0", diff --git a/src/app/actions/(gitea)/admin/users/index.ts b/src/app/actions/(gitea)/admin/users/index.ts new file mode 100644 index 0000000..a15da6f --- /dev/null +++ b/src/app/actions/(gitea)/admin/users/index.ts @@ -0,0 +1,17 @@ +"use server"; + +import { APIError, CreateUserOption, User } from "gitea-js"; +import { callGiteaApi, gitea, GiteaApiResponse } from "@/lib/gitea"; + +export async function adminCreateUser( + body: CreateUserOption +): Promise> { + const context = { body }; + const result = await callGiteaApi( + () => gitea.admin.adminCreateUser(body), + "Successfully created user", + "Failed to create user", + context + ); + return result; +} diff --git a/src/lib/gitea.ts b/src/lib/gitea.ts new file mode 100644 index 0000000..4f9a417 --- /dev/null +++ b/src/lib/gitea.ts @@ -0,0 +1,35 @@ +import logger from "./logger"; +import fetch from "cross-fetch"; +import { APIError, giteaApi } from "gitea-js"; + +const gitea = giteaApi(process.env.GITEA_URL as string, { + token: process.env.GITEA_TOKEN, + customFetch: fetch, +}); + +interface GiteaApiResponse { + data: D | null; + error: E | null; +} + +async function callGiteaApi( + apiCall: () => Promise>, + successMessage: string, + errorMessage: string, + context?: Record +): Promise> { + try { + logger.info("Calling Gitea API"); + const response = await apiCall(); + logger.info({ context, response }, successMessage); + return { data: response.data, error: response.error }; + } catch (err) { + logger.error({ context, error: err }, errorMessage); + const errorResponse = err as GiteaApiResponse; + const apiError = errorResponse.error; + return { data: errorResponse.data, error: apiError }; + } +} + +export { gitea, callGiteaApi }; +export type { GiteaApiResponse };