From ba19a4dc5bd8cfb4dfdbbae38bfa4b426d591c9f Mon Sep 17 00:00:00 2001 From: Ardeman Date: Mon, 3 Mar 2025 15:42:12 +0800 Subject: [PATCH] feat: add staff and user authentication APIs with request handling --- app/apis/admin/get-staff.ts | 21 +++++++++++++++++++ app/apis/admin/login-staff.ts | 20 ++++++++++++++++++ app/apis/news/{login.ts => login-user.ts} | 2 +- .../news/{register.ts => register-user.ts} | 2 +- app/routes/_admin.lg-admin.tsx | 19 +++++++++++++++++ app/routes/actions.login.ts | 4 ++-- app/routes/actions.register.ts | 4 ++-- 7 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 app/apis/admin/get-staff.ts create mode 100644 app/apis/admin/login-staff.ts rename app/apis/news/{login.ts => login-user.ts} (88%) rename app/apis/news/{register.ts => register-user.ts} (91%) diff --git a/app/apis/admin/get-staff.ts b/app/apis/admin/get-staff.ts new file mode 100644 index 0000000..ff34ffd --- /dev/null +++ b/app/apis/admin/get-staff.ts @@ -0,0 +1,21 @@ +import { z } from 'zod' + +import { HttpServer, type THttpServer } from '~/libs/http-server' + +const staffSchema = z.object({ + data: z.object({ + id: z.string(), + email: z.string(), + username: z.string(), + }), +}) + +export const getStaff = async (parameters: THttpServer) => { + try { + const { data } = await HttpServer(parameters).get(`/api/staff/profile`) + return staffSchema.parse(data) + } catch (error) { + // eslint-disable-next-line unicorn/no-useless-promise-resolve-reject + return Promise.reject(error) + } +} diff --git a/app/apis/admin/login-staff.ts b/app/apis/admin/login-staff.ts new file mode 100644 index 0000000..dbdcaf4 --- /dev/null +++ b/app/apis/admin/login-staff.ts @@ -0,0 +1,20 @@ +import { z } from 'zod' + +import { type TLoginSchema } from '~/layouts/news/form-login' +import { HttpServer } from '~/libs/http-server' + +const loginResponseSchema = z.object({ + data: z.object({ + token: z.string(), + }), +}) + +export const staffLoginRequest = async (payload: TLoginSchema) => { + try { + const { data } = await HttpServer().post('/api/staff/login', payload) + return loginResponseSchema.parse(data) + } catch (error) { + // eslint-disable-next-line unicorn/no-useless-promise-resolve-reject + return Promise.reject(error) + } +} diff --git a/app/apis/news/login.ts b/app/apis/news/login-user.ts similarity index 88% rename from app/apis/news/login.ts rename to app/apis/news/login-user.ts index 5c74146..a25b0ff 100644 --- a/app/apis/news/login.ts +++ b/app/apis/news/login-user.ts @@ -9,7 +9,7 @@ const loginResponseSchema = z.object({ }), }) -export const newsLoginRequest = async (payload: TLoginSchema) => { +export const userLoginRequest = async (payload: TLoginSchema) => { try { const { data } = await HttpServer().post('/api/user/login', payload) return loginResponseSchema.parse(data) diff --git a/app/apis/news/register.ts b/app/apis/news/register-user.ts similarity index 91% rename from app/apis/news/register.ts rename to app/apis/news/register-user.ts index 66c53bf..7c6ab16 100644 --- a/app/apis/news/register.ts +++ b/app/apis/news/register-user.ts @@ -9,7 +9,7 @@ const loginResponseSchema = z.object({ }), }) -export const newsRegisterRequest = async (payload: TRegisterSchema) => { +export const userRegisterRequest = async (payload: TRegisterSchema) => { try { const { subscribe_plan, ...restPayload } = payload const transformedPayload = { diff --git a/app/routes/_admin.lg-admin.tsx b/app/routes/_admin.lg-admin.tsx index 565ed09..6e75f52 100644 --- a/app/routes/_admin.lg-admin.tsx +++ b/app/routes/_admin.lg-admin.tsx @@ -1,7 +1,26 @@ import { Outlet } from 'react-router' +import { getStaff } from '~/apis/admin/get-staff' import { AdminProvider } from '~/contexts/admin' import { AdminDefaultLayout } from '~/layouts/admin/default' +import { handleCookie } from '~/libs/cookies' + +import type { Route } from './+types/_admin.lg-admin' + +export const loader = async ({ request }: Route.LoaderArgs) => { + const { adminToken } = await handleCookie(request) + let adminData + if (adminToken) { + const { data } = await getStaff({ + accessToken: adminToken, + }) + adminData = data + } + + return { + adminData, + } +} const AdminLayout = () => { return ( diff --git a/app/routes/actions.login.ts b/app/routes/actions.login.ts index 28118c2..6923511 100644 --- a/app/routes/actions.login.ts +++ b/app/routes/actions.login.ts @@ -4,7 +4,7 @@ import { getValidatedFormData } from 'remix-hook-form' import { XiorError } from 'xior' import { getUser } from '~/apis/news/get-user' -import { newsLoginRequest } from '~/apis/news/login' +import { userLoginRequest } from '~/apis/news/login-user' import { loginSchema, type TLoginSchema } from '~/layouts/news/form-login' import { generateTokenCookie } from '~/utils/token' @@ -26,7 +26,7 @@ export const action = async ({ request }: Route.ActionArgs) => { return data({ success: false, errors, defaultValues }, { status: 400 }) } - const { data: loginData } = await newsLoginRequest(payload) + const { data: loginData } = await userLoginRequest(payload) const { token } = loginData const { data: userData } = await getUser({ accessToken: token, diff --git a/app/routes/actions.register.ts b/app/routes/actions.register.ts index ae30723..fac144b 100644 --- a/app/routes/actions.register.ts +++ b/app/routes/actions.register.ts @@ -4,7 +4,7 @@ import { getValidatedFormData } from 'remix-hook-form' import { XiorError } from 'xior' import { getUser } from '~/apis/news/get-user' -import { newsRegisterRequest } from '~/apis/news/register' +import { userRegisterRequest } from '~/apis/news/register-user' import { registerSchema, type TRegisterSchema, @@ -29,7 +29,7 @@ export const action = async ({ request }: Route.ActionArgs) => { return data({ success: false, errors, defaultValues }, { status: 400 }) } - const { data: registerData } = await newsRegisterRequest(payload) + const { data: registerData } = await userRegisterRequest(payload) const { token } = registerData const { data: userData } = await getUser({ accessToken: token,