import { api, API_BASE_URL } from "@/lib/api-client"; import { asPaginated, asRecordData } from "@/lib/odoo-api"; import type { User, PaginatedResponse, PaginationParams, ApiSuccessResponse } from "@/types"; export interface UserListParams extends PaginationParams { type?: string; entity_id?: number; } function mapPortalUser(raw: Record): User { return { id: raw.id as number, name: String(raw.name || ""), email: String(raw.email ?? raw.login ?? ""), login: String(raw.login ?? raw.email ?? ""), user_type: (raw.user_type as User["user_type"]) || "student", is_verified: Boolean(raw.is_verified ?? true), entities: Array.isArray(raw.entities) ? (raw.entities as User["entities"]) : [], classrooms: Array.isArray(raw.classrooms) ? (raw.classrooms as string[]) : [], phone: raw.phone as string | undefined, gender: raw.gender as string | undefined, student_id: raw.student_id as string | undefined, }; } export const usersService = { async list(params: UserListParams): Promise> { const raw = await api.get("/users/list", params); const p = asPaginated>(raw); const items = p.items.map(mapPortalUser); return { items, total: p.total, page: p.page, size: p.size, pages: p.pages }; }, async getById(id: number): Promise { const raw = await api.get(`/users/${id}`); return mapPortalUser(asRecordData>(raw)); }, async update(id: number, data: Partial): Promise { const raw = await api.patch(`/users/update`, { id, ...data }); return mapPortalUser(asRecordData>(raw)); }, async create(data: Partial): Promise { const raw = await api.post("/users/create", data); return mapPortalUser(asRecordData>(raw)); }, async createBatch(data: { users: Partial[] }): Promise { return api.post("/batch_users", data); }, async exportList(params: UserListParams): Promise { const res = await fetch(`${API_BASE_URL}/users/export?${new URLSearchParams(params as Record)}`, { headers: { Authorization: `Bearer ${localStorage.getItem("encoach_token") ?? ""}` }, }); if (!res.ok) throw new Error(`Export failed: ${res.status} ${res.statusText}`); return res.blob(); }, };