import { api } from '../index'; import { toUser, type RawUser } from '../mappers'; import type { User } from '../types'; /** * Admin user management. The backend models authorization as `is_superuser` / * `is_active` (no `role`/`email`); `toUser` maps superuser→role for the UI and * the mutations translate role back to `is_superuser` on the way out. */ export const adminApi = api.injectEndpoints({ endpoints: (build) => ({ getUsers: build.query({ query: () => '/admin/users', transformResponse: (raw: RawUser[]) => raw.map(toUser), providesTags: ['User'], }), createUser: build.mutation< User, { username: string; password: string; role: 'admin' | 'user' } >({ query: ({ username, password, role }) => ({ url: '/admin/users', method: 'POST', body: { username, password, is_superuser: role === 'admin' }, }), transformResponse: (raw: RawUser) => toUser(raw), invalidatesTags: ['User'], }), updateUser: build.mutation< User, { id: string; role?: 'admin' | 'user'; isActive?: boolean } >({ query: ({ id, role, isActive }) => ({ url: `/admin/users/${id}`, method: 'PATCH', body: { is_superuser: role === undefined ? undefined : role === 'admin', is_active: isActive, }, }), transformResponse: (raw: RawUser) => toUser(raw), invalidatesTags: ['User'], }), deleteUser: build.mutation({ query: (id) => ({ url: `/admin/users/${id}`, method: 'DELETE' }), invalidatesTags: ['User'], }), }), overrideExisting: false, }); export const { useGetUsersQuery, useCreateUserMutation, useUpdateUserMutation, useDeleteUserMutation, } = adminApi;