crud.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { take, fork, call, put } from 'redux-saga/effects';
  2. import axios from 'axios';
  3. import {
  4. DOC_CREATED,
  5. DOC_READ,
  6. DOC_UPDATED,
  7. DOC_DELETED
  8. } from 'constants/actions';
  9. import {
  10. docCreateResponded,
  11. docReadResponded,
  12. docUpdateResponded,
  13. docDeleteResponded
  14. } from 'actions/crud';
  15. export function *apiRequest(method, route, params = [], data = null) {
  16. let path = `/api1/${route}`;
  17. if (params.length) {
  18. path = `${path}/${params.join('/')}`;
  19. }
  20. const args = [[axios, method], path];
  21. if (['post', 'put'].includes(method)) {
  22. args.push(data);
  23. }
  24. try {
  25. const response = yield call(...args);
  26. return { response, err: null };
  27. } catch (err) {
  28. return { response: null, err };
  29. }
  30. }
  31. export function *createListener() {
  32. while (true) {
  33. const { route, pendingId, fields } = yield take(DOC_CREATED);
  34. const { response, err } = yield call(apiRequest, 'post', route, [], fields);
  35. yield put(docCreateResponded(route, pendingId, err, response));
  36. }
  37. }
  38. export function *readListener() {
  39. while (true) {
  40. const { route } = yield take(DOC_READ);
  41. const { response, err } = yield call(apiRequest, 'get', route);
  42. yield put(docReadResponded(route, err, response));
  43. }
  44. }
  45. export function *updateListener() {
  46. while (true) {
  47. const { route, id, fields } = yield take(DOC_UPDATED);
  48. const { response, err } = yield call(apiRequest, 'put', route, [id], fields);
  49. yield put(docUpdateResponded(route, id, err, response));
  50. }
  51. }
  52. export function *deleteListener() {
  53. while (true) {
  54. const { route, id } = yield take(DOC_DELETED);
  55. const { err } = yield call(apiRequest, 'delete', route, [id]);
  56. yield put(docDeleteResponded(route, id, err));
  57. }
  58. }
  59. export function *crudSaga() {
  60. yield fork(createListener);
  61. yield fork(readListener);
  62. yield fork(updateListener);
  63. yield fork(deleteListener);
  64. }