import apiClient from "@/lib/api/client"; import { CreateUserDto, UpdateUserDto, SearchUserDto, User, Role } from "@/types/user"; /** Raw API user shape (before transform) */ interface RawUser { user_id?: number; userId?: number; assignments?: Array<{ role: unknown }>; [key: string]: unknown; } const extractArrayData = (value: unknown): T[] => { let current: unknown = value; for (let i = 0; i < 5; i += 1) { if (Array.isArray(current)) { return current as T[]; } if (!current || typeof current !== "object" || !("data" in current)) { return []; } current = (current as { data?: unknown }).data; } return Array.isArray(current) ? (current as T[]) : []; }; const transformUser = (user: RawUser): User => { return { ...(user as unknown as User), uuid: (user.uuid as string) ?? '', userId: (user.user_id ?? user.userId) as number | undefined, roles: (user.assignments?.map((a) => a.role) ?? []) as User['roles'], }; }; /** Paginated or unwrapped response shape */ type UserListResponse = User[] | { data: User[] | { data: User[] } }; export const userService = { getAll: async (params?: SearchUserDto) => { const response = await apiClient.get("/users", { params }); return extractArrayData(response.data).map(transformUser); }, getRoles: async (): Promise => { const response = await apiClient.get<{ data: unknown } | unknown>("/users/roles"); return extractArrayData(response.data); }, getByUuid: async (uuid: string) => { const response = await apiClient.get(`/users/${uuid}`); return transformUser(response.data); }, create: async (data: CreateUserDto) => { const response = await apiClient.post("/users", data); return transformUser(response.data); }, update: async (uuid: string, data: UpdateUserDto) => { const response = await apiClient.put(`/users/${uuid}`, data); return transformUser(response.data); }, delete: async (uuid: string) => { const response = await apiClient.delete(`/users/${uuid}`); return response.data; }, // Optional: Reset Password, Deactivate etc. };