app/apiHandler/ordersApiSlice.js

/**
 * @file
 * File : ordersApiSlice.js\
 * Defines API endpoints for managing orders using RTK Query.
 * Extends the base API slice with order-related endpoints.
 *
 * @author  Pierre-Yves Léglise <contact@axialdata.net>
 * @name ordersApiSlice
 */
import { apiSlice } from './apiSlice'

export const ordersApiSlice = apiSlice.injectEndpoints({
  /**
   * Injects additional endpoints related to orders into the base API slice.
   * Defines endpoints for querying orders based on order groups.
   *
   * @category ApiSlice
   * @function
   * @author  Pierre-Yves Léglise <contact@axialdata.net>
   * @param {Object} builder - RTK Query endpoints builder.
   * @example
   *  const { data, isLoading, isFetching } = useGetOrdersListQuery({
   *    ordersGroupNb: selectedOrdersGroupNb,
   *  })
   * @returns {Object} Object containing order-related endpoint definitions.
   */
  endpoints: (builder) => ({
    /**
     * Endpoint for retrieving a list of orders within a specific orders group.
     * Sends a GET request to the `/ordersgroups/{ordersGroupNb}/orders` endpoint.
     *
     * @method
     * @author  Pierre-Yves Léglise <contact@axialdata.net>
     * @name getOrdersList
     * @param {Object} params - Query parameters for the request.
     * @param {string} params.ordersGroupNb - The identifier of the orders group.
     * @param {Object} [params.params] - Additional query parameters for filtering or pagination.
     * @example
     *  const { data, isLoading, isFetching } = useGetOrdersListQuery({
     *    ordersGroupNb: selectedOrdersGroupNb,
     *  })
     * @returns {Object} Result of the API request.
     */
    getOrdersList: builder.query({
      query: ({ ordersGroupId, includeInactive, params }) => ({
        url: `/ordersgroups/${ordersGroupId}/orders`,
        method: 'get',
        withCredentials: true,
        params: { ...params, includeInactive },
      }),
    }),

    update: builder.mutation({
      query: ({ orderId, data }) => ({
        url: `/orders/${orderId}`,
        method: 'patch',
        withCredentials: true,
        data: { ...data },
      }),
      keepUnusedDataFor: 0,
    }),
    updateComment: builder.mutation({
      query: ({ orderId, data }) => ({
        url: `/orders/${orderId}/comment`,
        method: 'patch',
        withCredentials: true,
        data: { ...data },
      }),
      keepUnusedDataFor: 0,
    }),
    updateStatus: builder.mutation({
      query: ({ orderId, data }) => ({
        url: `/orders/${orderId}/status`,
        method: 'patch',
        withCredentials: true,
        data: { ...data },
      }),
      keepUnusedDataFor: 0,
    }),
    updateOrderReference: builder.mutation({
      query: ({ orderId, data }) => ({
        url: `/orders/${orderId}/reference`,
        method: 'patch',
        withCredentials: true,
        data: { ...data },
      }),
      keepUnusedDataFor: 0,
    }),
    updateManyInactive: builder.mutation({
      query: (data) => ({
        url: `/orders/many/isactive`,
        method: 'patch',
        withCredentials: true,
        data: { ...data },
      }),
      keepUnusedDataFor: 0,
    }),
    updateManyOrdersGroup: builder.mutation({
      query: (data) => ({
        url: `/orders/many/ordersgroup`,
        method: 'patch',
        withCredentials: true,
        data: { ...data },
      }),
      keepUnusedDataFor: 0,
    }),
    exportOrdersXlsx: builder.query({
      query: ({ ordersGroupId }) => ({
        url: `/ordersgroups/${ordersGroupId}/orders`,
        method: 'get',
        withCredentials: true,
        // params: { export: true },
      }),
      keepUnusedDataFor: 0,
    }),
  }),
})

/**
 * Hooks for interacting with the orders-related endpoints.
 *
 * @typedef {Object} Hooks
 * @author  Pierre-Yves Léglise <contact@axialdata.net>
 * @property {Function} useGetOrdersListQuery - Hook to trigger the getOrdersList query.
 * @example
 *  const { data, isLoading, isFetching } = useGetOrdersListQuery({
 *    ordersGroupNb: selectedOrdersGroupNb,
 *  })
 * @returns {Object} Object containing order-related endpoint hooks.
 */
export const {
  useGetOrdersListQuery,
  useUpdateMutation,
  useUpdateStatusMutation,
  useUpdateManyInactiveMutation,
  useUpdateCommentMutation,
  useUpdateOrderReferenceMutation,
  useUpdateManyOrdersGroupMutation,
  useExportOrdersXlsxQuery,
} = ordersApiSlice