diff --git a/src/hooks/useUsers.tsx b/src/hooks/useUsers.tsx index 7b860637..a9d0285f 100644 --- a/src/hooks/useUsers.tsx +++ b/src/hooks/useUsers.tsx @@ -1,15 +1,15 @@ -import {Type, User} from "@/interfaces/user"; +import { Type, User } from "@/interfaces/user"; import Axios from "axios"; -import {useEffect, useState} from "react"; -import {setupCache} from "axios-cache-interceptor"; +import { useEffect, useState } from "react"; +import { setupCache } from "axios-cache-interceptor"; const instance = Axios.create(); const axios = setupCache(instance); -export const userHashStudent = {type: "student"} as {type: Type}; -export const userHashTeacher = {type: "teacher"} as {type: Type}; -export const userHashCorporate = {type: "corporate"} as {type: Type}; +export const userHashStudent = { query: { type: "student" } } as { query: { type: Type } }; +export const userHashTeacher = { query: { type: "teacher" } } as { query: { type: Type } }; +export const userHashCorporate = { query: { type: "corporate" } } as { query: { type: Type } }; -export default function useUsers(props?: {type?: string; page?: number; size?: number; orderBy?: string; direction?: "asc" | "desc"}) { +export default function useUsers(props?: { query?: Record; page?: number; size?: number; orderBy?: string; direction?: "asc" | "desc" }) { const [users, setUsers] = useState([]); const [total, setTotal] = useState(0); const [isLoading, setIsLoading] = useState(false); @@ -18,16 +18,21 @@ export default function useUsers(props?: {type?: string; page?: number; size?: n const getData = () => { const params = new URLSearchParams(); - if (!!props) + if (!!props) { Object.keys(props).forEach((key) => { - if (props[key as keyof typeof props] !== undefined) params.append(key, props[key as keyof typeof props]!.toString()); + if (key === 'query' && props.query) { + Object.entries(props.query).forEach(([queryKey, queryValue]) => { + if (queryValue !== undefined) params.append(queryKey, queryValue); + }); + } else if (props[key as keyof typeof props] !== undefined) { + params.append(key, props[key as keyof typeof props]!.toString()); + } }); - - console.log(params.toString()); + } setIsLoading(true); axios - .get<{users: User[]; total: number}>(`/api/users/list?${params.toString()}`, {headers: {page: "register"}}) + .get<{ users: User[]; total: number }>(`/api/users/list?${params.toString()}`, { headers: { page: "register" } }) .then((response) => { setUsers(response.data.users); setTotal(response.data.total); @@ -35,7 +40,7 @@ export default function useUsers(props?: {type?: string; page?: number; size?: n .finally(() => setIsLoading(false)); }; // eslint-disable-next-line react-hooks/exhaustive-deps - useEffect(getData, [props?.page, props?.size, props?.type, props?.orderBy, props?.direction]); + useEffect(getData, [props?.page, props?.size, props?.query, props?.orderBy, props?.direction]); - return {users, total, isLoading, isError, reload: getData}; + return { users, total, isLoading, isError, reload: getData }; } diff --git a/src/pages/api/register.ts b/src/pages/api/register.ts index 32636243..7c758d51 100644 --- a/src/pages/api/register.ts +++ b/src/pages/api/register.ts @@ -45,7 +45,7 @@ async function registerIndividual(req: NextApiRequest, res: NextApiResponse) { code?: string; }; - const codeDoc = await db.collection("codes").findOne({code}); + const codeDoc = await db.collection("codes").findOne({id: code}); if (code && code.length > 0 && !!codeDoc) { res.status(400).json({error: "Invalid Code!"}); diff --git a/src/pages/api/user.ts b/src/pages/api/user.ts index c1e8ceac..ffc45c1b 100644 --- a/src/pages/api/user.ts +++ b/src/pages/api/user.ts @@ -35,7 +35,7 @@ async function del(req: NextApiRequest, res: NextApiResponse) { return; } - const targetUser = await db.collection("users").findOne({id}); + const targetUser = await db.collection("users").findOne({id: id}); if (!targetUser) { res.status(404).json({ok: false}); return; diff --git a/src/pages/api/users/list.ts b/src/pages/api/users/list.ts index 41d509ca..c948a0e4 100644 --- a/src/pages/api/users/list.ts +++ b/src/pages/api/users/list.ts @@ -3,7 +3,6 @@ import type {NextApiRequest, NextApiResponse} from "next"; import {withIronSessionApiRoute} from "iron-session/next"; import {sessionOptions} from "@/lib/session"; import {getLinkedUsers} from "@/utils/users.be"; -import {Type} from "@/interfaces/user"; export default withIronSessionApiRoute(handler, sessionOptions); @@ -15,16 +14,16 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { const { size, - type, page, orderBy, direction = "desc", - } = req.query as {size?: string; type?: Type; page?: string; orderBy?: string; direction?: "asc" | "desc"}; + ...query + } = req.query as {size?: string; page?: string; orderBy?: string; direction?: "asc" | "desc"; [key: string]: string | string[] | undefined}; const {users, total} = await getLinkedUsers( req.session.user?.id, req.session.user?.type, - type, + query, page !== undefined ? parseInt(page) : undefined, size !== undefined ? parseInt(size) : undefined, orderBy, diff --git a/src/pages/list/users.tsx b/src/pages/list/users.tsx index 3a07e363..9bee8a76 100644 --- a/src/pages/list/users.tsx +++ b/src/pages/list/users.tsx @@ -1,6 +1,5 @@ import Layout from "@/components/High/Layout"; import useUser from "@/hooks/useUser"; -import useUsers from "@/hooks/useUsers"; import {sessionOptions} from "@/lib/session"; import useFilterStore from "@/stores/listFilterStore"; import {withIronSessionSsr} from "iron-session/next"; diff --git a/src/utils/users.be.ts b/src/utils/users.be.ts index a04bfd20..c68f5a6b 100644 --- a/src/utils/users.be.ts +++ b/src/utils/users.be.ts @@ -25,17 +25,20 @@ export async function getSpecificUsers(ids: string[]) { .toArray(); } +type Query = { [key: string]: string | string[] | undefined }; + + export async function getLinkedUsers( userID?: string, userType?: Type, - type?: Type, + query?: Query, page?: number, size?: number, sort?: string, direction?: "asc" | "desc", ) { const filters = { - ...(!!type ? {type} : {}), + ...(!!query ? query : {}), }; if (!userID || userType === "admin" || userType === "developer") {