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);
}