app/apiHandler/authUsersApiSlice.js

/**
 * @file
 * File : authUsersApiSlice.js\
 * Defines RTK Query endpoints for managing authentication users \
 * Extends the base API slice from `apiSlice.js`
 *
 * @author  Pierre-Yves Léglise <contact@axialdata.net>
 * @name authUsersApiSlice
 */
import { apiSlice } from './apiSlice'

/**
 * RTK Query API slice for authentication users.
 * Defines query and mutation endpoints for user management.
 *
 * @category ApiSlice
 * @function
 * @author  Pierre-Yves Léglise <contact@axialdata.net>
 * @constant {Object} authUsersApiSlice
 * @property {Function} useGetAuthUsersQuery - Hook for querying authentication users.
 * @property {Function} useDeleteAuthUserMutation - Hook for deleting an authentication user.
 * @property {Function} useUpdateProfileMutation - Hook for updating user profile.
 * @property {Function} useChangePasswordMutation - Hook for changing user password.
 * @property {Function} useCheckPasswordMutation - Hook for checking user password.
 * @property {Function} useMfaQrCodeQuery - Hook for querying MFA QR code.
 * @property {Function} useResetPasswordMutation - Hook for resetting user password.
 * @property {Function} useSignUpMutation - Hook for signing up new users.
 * @property {Function} useVerifyMutation - Hook for verifying user email.
 * @property {Function} useUploadFileMutation - Hook for uploading files.
 * @property {Function} useProfilePictureQuery - Hook for querying user profile picture.
 * @example
 * const { useGetAuthUsersQuery } = authUsersApiSlice
 * @returns {Object} The RTK Query API slice for authentication users.
 */
export const authUsersApiSlice = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    // Query endpoints ____________________________________________
    getAuthUsers: builder.query({
      query: (params) => ({
        url: '/authusers',
        method: 'get',
        params: { ...params },
      }),
    }),
    mfaQrCode: builder.query({
      query: ({ userId, params }) => ({
        url: `/authusers/${userId}/mfa-qr-code`,
        method: 'get',
        params: { ...params },
      }),
      keepUnusedDataFor: 0,
    }),
    profilePicture: builder.query({
      query: ({ userId, params }) => ({
        url: `/authusers/${userId}/profile-picture`,
        method: 'get',
        params: { ...params },
        headers: {
          'Content-Type': 'image/jpeg',
        },
      }),
      keepUnusedDataFor: 20,
    }),

    // Mutation endpoints ____________________________________________
    signUp: builder.mutation({
      query: ({ language, credentials }) => ({
        url: `/authusers/new/${language}`,
        method: 'put',
        data: { ...credentials },
      }),
    }),
    verify: builder.mutation({
      query: (data) => ({
        url: '/authusers/email-valid',
        method: 'patch',
        data: data,
      }),
      keepUnusedDataFor: 0,
    }),
    verifyNewUser: builder.mutation({
      query: (data) => ({
        url: '/authusers/new-user-email-valid',
        method: 'patch',
        data: data,
      }),
      keepUnusedDataFor: 0,
    }),
    resetPassword: builder.mutation({
      query: (credentials) => ({
        url: '/authusers/password-reset',
        method: 'patch',
        data: { ...credentials },
      }),
      keepUnusedDataFor: 0,
    }),
    newUserResetPassword: builder.mutation({
      query: ({ credentials }) => ({
        url: '/authusers/new-user-password-reset',
        method: 'patch',
        data: { ...credentials },
      }),
      keepUnusedDataFor: 0,
    }),
    changePassword: builder.mutation({
      query: ({ userId, credentials, params }) => ({
        url: `/authusers/${userId}/password-new`,
        method: 'patch',
        data: { ...credentials },
        params: { ...params },
      }),
      keepUnusedDataFor: 0,
    }),
    checkPassword: builder.mutation({
      query: ({ userId, credentials, params }) => ({
        url: `/authusers/${userId}/password-check`,
        method: 'post',
        data: { ...credentials },
        params: { ...params },
      }),
      keepUnusedDataFor: 0,
    }),
    updateProfile: builder.mutation({
      query: ({ userData, params }) => ({
        url: `/authusers/${userData._id}`,
        method: 'patch',
        data: { ...userData },
        withCredentials: true,
        params: { ...params },
      }),
      keepUnusedDataFor: 0,
    }),
    uploadFile: builder.mutation({
      query: ({ userData, formData, headers }) => ({
        url: `/authusers/${userData._id}`,
        method: 'patch',
        headers: {
          'content-type': 'multipart/form-data',
        },
        data: formData,
      }),
      keepUnusedDataFor: 0,
    }),

    deleteAuthUser: builder.mutation({
      query: ({ userId, params }) => ({
        url: `/authusers/${userId}`,
        method: 'delete',
        params: { ...params },
      }),
      keepUnusedDataFor: 0,
    }),
  }),
  overrideExisting: true,
})

// Export hooks for usage in functional components
export const {
  useGetAuthUsersQuery,
  useDeleteAuthUserMutation,
  useUpdateProfileMutation,
  useChangePasswordMutation,
  useCheckPasswordMutation,
  useMfaQrCodeQuery,
  useResetPasswordMutation,
  useNewUserResetPasswordMutation,
  useSignUpMutation,
  useVerifyMutation,
  useVerifyNewUserMutation,
  useUploadFileMutation,
  useProfilePictureQuery,
} = authUsersApiSlice