From b075614a42a94cddc5d293eb219924fe62b46d82 Mon Sep 17 00:00:00 2001 From: ngc2207 Date: Tue, 3 Dec 2024 15:57:31 +0800 Subject: [PATCH] feat: add user management functionality with Gitea API integration and Zustand store --- package.json | 8 +++--- src/app/actions/(gitea)/user/index.ts | 23 ++++++++++++++++++ src/app/actions/(gitea)/user/store.ts | 35 +++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 src/app/actions/(gitea)/user/index.ts create mode 100644 src/app/actions/(gitea)/user/store.ts diff --git a/package.json b/package.json index c3d1f64..35d707e 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-toast": "^1.2.2", + "base-64": "^1.0.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cross-fetch": "^4.0.0", @@ -32,13 +33,14 @@ "zustand": "^5.0.1" }, "devDependencies": { - "typescript": "^5", + "@types/base-64": "^1.0.2", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "15.0.3", "postcss": "^8", "tailwindcss": "^3.4.1", - "eslint": "^8", - "eslint-config-next": "15.0.3" + "typescript": "^5" } } diff --git a/src/app/actions/(gitea)/user/index.ts b/src/app/actions/(gitea)/user/index.ts new file mode 100644 index 0000000..fac0285 --- /dev/null +++ b/src/app/actions/(gitea)/user/index.ts @@ -0,0 +1,23 @@ +import base64 from "base-64"; +import { APIError, RequestParams, User } from "gitea-js"; +import { callGiteaApi, gitea, GiteaApiResponse } from "@/lib/gitea"; + +export async function userGetCurrent( + username: string, + password: string +): Promise> { + const basicAuth = `Basic ${base64.encode(`${username}:${password}`)}`; + const params: RequestParams = { + headers: { + Authorization: basicAuth, + }, + }; + const context = { username, password }; + const result = await callGiteaApi( + () => gitea.user.userGetCurrent(params), + "Successfully retrieved current user", + "Failed to retrieve current user", + context + ); + return result; +} diff --git a/src/app/actions/(gitea)/user/store.ts b/src/app/actions/(gitea)/user/store.ts new file mode 100644 index 0000000..5f588fd --- /dev/null +++ b/src/app/actions/(gitea)/user/store.ts @@ -0,0 +1,35 @@ +import { create } from "zustand"; +import logger from "@/lib/logger"; +import { userGetCurrent } from "."; +import { APIError, User } from "gitea-js"; + +interface UserGetCurrentState { + user: User | null; + error: APIError | null; + loading: boolean; + userGetCurrent: (username: string, password: string) => Promise; +} + +const userGetCurrentStore = create((set) => ({ + user: null, + error: null, + loading: false, + userGetCurrent: async (username: string, password: string) => { + set({ loading: true, user: null, error: null }); + try { + const result = await userGetCurrent(username, password); + if (result.error) { + set({ loading: false, user: null, error: result.error }); + } else { + set({ loading: false, user: result.data, error: null }); + } + } catch (error) { + logger.error({ error }, "Error in userGetCurrentStore"); + set({ + loading: false, + user: null, + error: { message: "Error in Server" } as APIError, + }); + } + }, +}));