sagas/roles.js

import { takeEvery, put, call, select } from 'redux-saga/effects';

import { requestGet, requestPost } from '../utils/request';

import { API_URLS, MODALS, SUCCESS_MODALS } from '../constants';
import { getPagination } from '../selectors/common';
import {
  aDelRoleSuccess,
  aDisableEnableRoleSuccess,
  aNewRoleSuccess,
  aPermissionsListSuccess,
  aRolePermissions,
  aRolePermissionsSuccess,
  aRolesListSuccess,
  aRolesUserListSuccess,
} from '../reducers/admin';
import {
  aDisableEnableRole,
  aGetPermissions,
  aRemoveRole,
  aRolesInit,
  aSaveEditRole,
  aSaveNewRole,
} from '../reducers/actions';
import { aSetIsFetched, aSetOpenModal } from '../reducers/common';

/**
 * @namespace sagas/roles
 */
/**
 * @memberof sagas/roles
 * @typedef Role
 * @type {object}
 * @property {string} description
 * @property {string} insertionDate
 * @property {string} insertionUser
 * @property {string} name
 * @property {number} roleId
 * @property {string} status
 */
/**
 * @memberof sagas/roles
 * @typedef "rolesInit/response.data"
 * @type {object}
 * @property {Array<Roles>} roles
 * @property {number} totalPages
 */
/**
 * Get list of roles
 *
 * @memberof sagas/roles
 * @async
 * @param {object} action
 * @property {object} action
 * @property {object} action.payload
 * @property {boolean} action.payload.skipParams
 */
function* rolesInit(action) {
  let response;
  try {
    const pagination = yield select(getPagination);
    const params = action.payload && action.payload.skipParams ? '' : `?page=${pagination.page}&pageSize=10`;

    yield put(aSetIsFetched({ isFetched: false }));
    response = yield call(requestGet, API_URLS.ROLES + params, true);
    if (response.status === -1) {
      const e = new Error(response.error.message);
      e.modal = MODALS.ERROR;
      throw e;
    } else {
      const meta = {
        page: pagination.page,
        totalPage: response.data.totalPage,
      };
      if (typeof action.payload !== 'undefined' && action.payload.skipParams === true) {
        yield put(
          aRolesUserListSuccess({
            roles: response.data.roles,
          })
        );
      } else {
        yield put(
          aRolesListSuccess({
            roles: response.data.roles,
            meta,
          })
        );
      }
    }
    yield put(aSetIsFetched({ isFetched: true }));
  } catch (error) {
    yield put(
      aSetOpenModal({
        modal: error.modal || MODALS.GENERAL_ERROR,
        errorMessage: error.modal ? error.message : MODALS.GENERAL_ERROR,
      })
    );
  }
}
/**
 * @memberof sagas/roles
 * @typedef Permission
 * @type {object}
 * @property {number} permissionId
 * @property {string} name
 */
/**
 * @memberof sagas/roles
 * @typedef "getPermissions/response.data"
 * @type {object}
 * @property {Array<Permission>} permissions
 */
/**
 * Get list of all permissions
 *
 * @memberof sagas/roles
 * @async
 */
function* getPermissions() {
  let response;

  try {
    response = yield call(requestGet, API_URLS.PERMISSIONS, true);
    if (response.status !== -1) {
      yield put(
        aPermissionsListSuccess({
          permissions: response.data.permissions,
        })
      );
    }
  } catch (error) {
    yield put(
      aSetOpenModal({
        modal: error.modal || MODALS.GENERAL_ERROR,
        errorMessage: error.modal ? error.message : MODALS.GENERAL_ERROR,
      })
    );
  }
}

/**
 * Save new role
 *
 * @memberof sagas/roles
 * @async
 * @param {object} action
 */
function* saveNewRole(action) {
  let response;
  try {
    yield put(aSetIsFetched({ isFetched: false }));
    response = yield call(requestPost, API_URLS.SAVE_NEW_ROLE, action.payload, true);
    if (response.status === -1) {
      const e = new Error(response.error.message);
      e.modal = MODALS.ERROR;
      throw e;
    } else {
      yield put(aNewRoleSuccess());
      yield put(
        aSetOpenModal({
          modal: MODALS.SUCCESS,
          modalData: {
            message: SUCCESS_MODALS.ADD_ROLE,
            additionalMessage: 'successfully',
            modal: SUCCESS_MODALS.ADD_ROLE,
          },
        })
      );
      yield put(aRolesInit());
    }
  } catch (error) {
    yield put(
      aSetOpenModal({
        modal: error.modal || MODALS.GENERAL_ERROR,
        errorMessage: error.modal ? error.message : MODALS.GENERAL_ERROR,
      })
    );
  }
}

/**
 * Remove role
 *
 * @memberof sagas/roles
 * @async
 * @param {object} action
 */
function* removeRole(action) {
  let response;
  try {
    yield put(aSetIsFetched({ isFetched: false }));
    response = yield call(requestPost, API_URLS.REMOVE_ROLE, action.payload, true);
    if (response.status === -1) {
      const e = new Error(response.error.message);
      e.modal = MODALS.ERROR;
      throw e;
    } else {
      yield put(aDelRoleSuccess());
      yield put(
        aSetOpenModal({
          modal: MODALS.SUCCESS,
          modalData: {
            message: SUCCESS_MODALS.REMOVE_ROLE,
            additionalMessage: 'successfully',
            modal: SUCCESS_MODALS.REMOVE_ROLE,
          },
        })
      );
      yield put(aRolesInit());
    }
  } catch (error) {
    yield put(
      aSetOpenModal({
        modal: error.modal || MODALS.GENERAL_ERROR,
        errorMessage: error.modal ? error.message : MODALS.GENERAL_ERROR,
      })
    );
  }
}

/**
 * Change status of user
 *
 * @memberof sagas/roles
 * @param {object} action
 */
function* changeRoleStatus(action) {
  let response;
  try {
    yield put(aSetIsFetched({ isFetched: false }));
    response = yield call(requestPost, API_URLS.DISABLE_ENABLE_ROLE, action.payload, true);
    if (response.status === -1) {
      const e = new Error(response.error.message);
      e.modal = MODALS.ERROR;
      throw e;
    } else {
      yield put(aDisableEnableRoleSuccess());
      yield put(
        aSetOpenModal({
          modal: MODALS.SUCCESS,
          modalData: {
            message: SUCCESS_MODALS.EDIT_STATUS,
            additionalMessage: 'successfully',
            modal: SUCCESS_MODALS.EDIT_STATUS,
          },
        })
      );
      yield put(aRolesInit());
    }
  } catch (error) {
    yield put(
      aSetOpenModal({
        modal: error.modal || MODALS.GENERAL_ERROR,
        errorMessage: error.modal ? error.message : MODALS.GENERAL_ERROR,
      })
    );
  }
}

/**
 * Get list of permissions for passed roles
 *
 * @memberof sagas/roles
 * @param {object} action
 */
function* getRolePermissions(action) {
  let response;
  try {
    response = yield call(requestGet, `${API_URLS.ROLE_PERMISSION}/${action.payload.roleId}`, true);
    if (response.status === -1) {
      const e = new Error(response.error.message);
      e.modal = MODALS.ERROR;
      throw e;
    } else {
      yield put(
        aRolePermissionsSuccess({
          permissions: response.data.permissions,
          forRole: action.payload.roleId,
        })
      );
    }
  } catch (error) {
    yield put(
      aSetOpenModal({
        modal: error.modal || MODALS.GENERAL_ERROR,
        errorMessage: error.modal ? error.message : MODALS.GENERAL_ERROR,
      })
    );
  }
}

/**
 * Edit roles
 *
 * @memberof sagas/roles
 * @async
 * @param {object} action
 */
function* saveEditRole(action) {
  let response;
  try {
    yield put(aSetIsFetched({ isFetched: false }));
    response = yield call(requestPost, API_URLS.SAVE_EDIT_ROLE, action.payload, true);
    if (response.status === -1) {
      const e = new Error(response.error.message);
      e.modal = MODALS.ERROR;
      throw e;
    } else {
      yield put(aNewRoleSuccess());
      yield put(
        aSetOpenModal({
          modal: MODALS.SUCCESS,
          modalData: {
            message: SUCCESS_MODALS.EDIT_ROLES,
            additionalMessage: 'successfully',
            modal: SUCCESS_MODALS.EDIT_ROLES,
          },
        })
      );
      yield put(aRolesInit());
    }
  } catch (error) {
    yield put(
      aSetOpenModal({
        modal: error.modal || MODALS.GENERAL_ERROR,
        errorMessage: error.modal ? error.message : MODALS.GENERAL_ERROR,
      })
    );
  }
}

/**
 * @memberof sagas/roles
 * @async
 * @returns {void}
 */
export default function* rolesSaga() {
  yield takeEvery(aRolesInit, rolesInit);
  yield takeEvery(aGetPermissions, getPermissions);
  yield takeEvery(aSaveNewRole, saveNewRole);
  yield takeEvery(aRemoveRole, removeRole);
  yield takeEvery(aDisableEnableRole, changeRoleStatus);
  yield takeEvery(aRolePermissions, getRolePermissions);
  yield takeEvery(aSaveEditRole, saveEditRole);
}