sagas.ts 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. /*
  2. * <<
  3. * Davinci
  4. * ==
  5. * Copyright (C) 2016 - 2017 EDP
  6. * ==
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. * >>
  19. */
  20. import { call, put, all, takeLatest, takeEvery } from 'redux-saga/effects'
  21. import { ActionTypes } from './constants'
  22. import { OrganizationActions, OrganizationActionType } from './actions'
  23. import { message } from 'antd'
  24. import request from 'utils/request'
  25. import api from 'utils/api'
  26. import { errorHandler } from 'utils/util'
  27. export function* getOrganizations() {
  28. try {
  29. const asyncData = yield call(request, api.organizations)
  30. const organizations = asyncData.payload
  31. yield put(OrganizationActions.organizationsLoaded(organizations))
  32. } catch (err) {
  33. yield put(OrganizationActions.loadOrganizationsFail())
  34. errorHandler(err)
  35. }
  36. }
  37. export function* addOrganization(action: OrganizationActionType) {
  38. if (action.type !== ActionTypes.ADD_ORGANIZATION) {
  39. return
  40. }
  41. const { organization, resolve } = action.payload
  42. try {
  43. const asyncData = yield call(request, {
  44. method: 'post',
  45. url: api.organizations,
  46. data: organization
  47. })
  48. const result = asyncData.payload
  49. yield put(OrganizationActions.organizationAdded(result))
  50. resolve()
  51. } catch (err) {
  52. yield put(OrganizationActions.addOrganizationFail())
  53. errorHandler(err)
  54. }
  55. }
  56. export function* editOrganization(action: OrganizationActionType) {
  57. if (action.type !== ActionTypes.EDIT_ORGANIZATION) {
  58. return
  59. }
  60. const { organization } = action.payload
  61. try {
  62. yield call(request, {
  63. method: 'put',
  64. url: `${api.organizations}/${organization.id}`,
  65. data: organization
  66. })
  67. yield put(OrganizationActions.organizationEdited(organization))
  68. message.success('success')
  69. } catch (err) {
  70. yield put(OrganizationActions.editOrganizationFail())
  71. errorHandler(err)
  72. }
  73. }
  74. export function* deleteOrganization(action: OrganizationActionType) {
  75. if (action.type !== ActionTypes.DELETE_ORGANIZATION) {
  76. return
  77. }
  78. const { id, resolve } = action.payload
  79. try {
  80. yield call(request, {
  81. method: 'delete',
  82. url: `${api.organizations}/${id}`
  83. })
  84. yield put(OrganizationActions.organizationDeleted(id))
  85. resolve()
  86. } catch (err) {
  87. yield put(OrganizationActions.deleteOrganizationFail())
  88. errorHandler(err)
  89. }
  90. }
  91. export function* getOrganizationDetail(action: OrganizationActionType) {
  92. if (action.type !== ActionTypes.LOAD_ORGANIZATION_DETAIL) {
  93. return
  94. }
  95. try {
  96. const asyncData = yield call(
  97. request,
  98. `${api.organizations}/${action.payload.id}`
  99. )
  100. const organization = asyncData.payload
  101. yield put(OrganizationActions.organizationDetailLoaded(organization))
  102. } catch (err) {
  103. errorHandler(err)
  104. }
  105. }
  106. export function* getOrganizationsProjects(action: OrganizationActionType) {
  107. if (action.type !== ActionTypes.LOAD_ORGANIZATIONS_PROJECTS) {
  108. return
  109. }
  110. const {
  111. param: { id, keyword, pageNum, pageSize }
  112. } = action.payload
  113. const requestUrl = keyword
  114. ? `${
  115. api.organizations
  116. }/${id}/projects?keyword=${keyword}&pageNum=1&pageSize=${pageSize || 10}`
  117. : `${api.organizations}/${id}/projects/?pageNum=${pageNum || 1}&pageSize=${
  118. pageSize || 10
  119. }`
  120. try {
  121. const asyncData = yield call(request, {
  122. method: 'get',
  123. url: requestUrl
  124. })
  125. const organizations = asyncData.payload
  126. yield put(OrganizationActions.organizationsProjectsLoaded(organizations))
  127. } catch (err) {
  128. yield put(OrganizationActions.loadOrganizationsProjectsFail())
  129. errorHandler(err)
  130. }
  131. }
  132. export function* getOrganizationsMembers(action: OrganizationActionType) {
  133. if (action.type !== ActionTypes.LOAD_ORGANIZATIONS_MEMBERS) {
  134. return
  135. }
  136. const { id } = action.payload
  137. try {
  138. const asyncData = yield call(request, `${api.organizations}/${id}/members`)
  139. yield put(OrganizationActions.organizationsMembersLoaded(asyncData.payload))
  140. } catch (err) {
  141. yield put(OrganizationActions.loadOrganizationsMembersFail())
  142. errorHandler(err)
  143. }
  144. }
  145. export function* getOrganizationsRole(action: OrganizationActionType) {
  146. if (action.type !== ActionTypes.LOAD_ORGANIZATIONS_ROLE) {
  147. return
  148. }
  149. const { id } = action.payload
  150. try {
  151. const asyncData = yield call(request, `${api.organizations}/${id}/roles`)
  152. const organizations = asyncData.payload
  153. yield put(OrganizationActions.organizationsRoleLoaded(organizations))
  154. } catch (err) {
  155. yield put(OrganizationActions.loadOrganizationsRoleFail())
  156. errorHandler(err)
  157. }
  158. }
  159. export function* addRole(action: OrganizationActionType) {
  160. if (action.type !== ActionTypes.ADD_ROLE) {
  161. return
  162. }
  163. const { name, description, id, resolve } = action.payload
  164. try {
  165. const role = { name, description, orgId: id }
  166. const asyncData = yield call(request, {
  167. method: 'post',
  168. url: api.roles,
  169. data: role
  170. })
  171. const result = asyncData.payload
  172. yield put(OrganizationActions.roleAdded(result))
  173. resolve()
  174. } catch (err) {
  175. yield put(OrganizationActions.addRoleFail())
  176. errorHandler(err)
  177. }
  178. }
  179. export function* getRoleListByMemberId(action: OrganizationActionType) {
  180. if (action.type !== ActionTypes.GET_ROLELISTS_BY_MEMBERID) {
  181. return
  182. }
  183. const { memberId, orgId, resolve } = action.payload
  184. try {
  185. const asyncData = yield call(request, {
  186. method: 'get',
  187. url: `${api.organizations}/${orgId}/member/${memberId}/roles`
  188. })
  189. const result = asyncData.payload
  190. yield put(
  191. OrganizationActions.getRoleListByMemberIdSuccess(result, memberId)
  192. )
  193. if (resolve) {
  194. resolve(result)
  195. }
  196. } catch (err) {
  197. yield put(OrganizationActions.getRoleListByMemberIdFail(err, memberId))
  198. errorHandler(err)
  199. }
  200. }
  201. export function* deleteRole(action: OrganizationActionType) {
  202. if (action.type !== ActionTypes.DELETE_ROLE) {
  203. return
  204. }
  205. const { id, resolve } = action.payload
  206. try {
  207. const asyncData = yield call(request, {
  208. method: 'delete',
  209. url: `${api.roles}/${id}`
  210. })
  211. const result = asyncData.payload
  212. yield put(OrganizationActions.roleDeleted(result))
  213. resolve()
  214. } catch (err) {
  215. yield put(OrganizationActions.deleteRoleFail())
  216. errorHandler(err)
  217. }
  218. }
  219. export function* editRole(action: OrganizationActionType) {
  220. if (action.type !== ActionTypes.EDIT_ROLE) {
  221. return
  222. }
  223. const { name, description, id, resolve } = action.payload
  224. try {
  225. const role = { name, description }
  226. const asyncData = yield call(request, {
  227. method: 'put',
  228. url: `${api.roles}/${id}`,
  229. data: role
  230. })
  231. const result = asyncData.payload
  232. yield put(OrganizationActions.roleEdited(result))
  233. resolve()
  234. } catch (err) {
  235. yield put(OrganizationActions.editRoleFail())
  236. errorHandler(err)
  237. }
  238. }
  239. export function* relRoleMember(action: OrganizationActionType) {
  240. if (action.type !== ActionTypes.REL_ROLE_MEMBER) {
  241. return
  242. }
  243. const { id, memberIds, resolve } = action.payload
  244. try {
  245. yield call(request, {
  246. method: 'post',
  247. url: `${api.roles}/${id}/members`,
  248. data: memberIds
  249. })
  250. yield put(OrganizationActions.relRoleMemberSuccess())
  251. resolve()
  252. } catch (err) {
  253. yield put(OrganizationActions.relRoleMemberFail())
  254. errorHandler(err)
  255. }
  256. }
  257. export function* getRelRoleMember(action: OrganizationActionType) {
  258. if (action.type !== ActionTypes.GET_REL_ROLE_MEMBER) {
  259. return
  260. }
  261. const { id, resolve } = action.payload
  262. try {
  263. const asyncData = yield call(request, {
  264. method: 'get',
  265. url: `${api.roles}/${id}/members`
  266. })
  267. const result = asyncData.payload
  268. yield put(OrganizationActions.getRelRoleMemberSuccess())
  269. resolve(result)
  270. } catch (err) {
  271. yield put(OrganizationActions.getRelRoleMemberFail())
  272. errorHandler(err)
  273. }
  274. }
  275. export function* searchMember(action: OrganizationActionType) {
  276. if (action.type !== ActionTypes.SEARCH_MEMBER) {
  277. return
  278. }
  279. const { keyword } = action.payload
  280. try {
  281. const asyncData = yield call(request, {
  282. method: 'get',
  283. url: `${api.user}?keyword=${keyword}`
  284. })
  285. const result = asyncData.payload
  286. yield put(OrganizationActions.memberSearched(result))
  287. } catch (err) {
  288. yield put(OrganizationActions.searchMemberFail())
  289. errorHandler(err)
  290. }
  291. }
  292. export function* inviteMember(action: OrganizationActionType) {
  293. if (action.type !== ActionTypes.INVITE_MEMBER) {
  294. return
  295. }
  296. const { orgId, members, needEmail, resolve } = action.payload
  297. try {
  298. const asyncData = yield call(request, {
  299. method: 'post',
  300. url: `${api.organizations}/${orgId}/invite/members`,
  301. data: {
  302. orgId,
  303. members,
  304. needConfirm: needEmail
  305. }
  306. })
  307. const result = asyncData.payload
  308. yield put(OrganizationActions.inviteMemberSuccess(result))
  309. if (resolve) {
  310. resolve(result)
  311. }
  312. } catch (err) {
  313. yield put(OrganizationActions.inviteMemberFail())
  314. errorHandler(err)
  315. }
  316. }
  317. export function* deleteOrganizationMember(action: OrganizationActionType) {
  318. if (action.type !== ActionTypes.DELETE_ORGANIZATION_MEMBER) {
  319. return
  320. }
  321. const { relationId, resolve } = action.payload
  322. try {
  323. yield call(request, {
  324. url: `${api.organizations}/member/${relationId}`,
  325. method: 'delete'
  326. })
  327. yield put(OrganizationActions.organizationMemberDeleted(relationId))
  328. resolve()
  329. } catch (err) {
  330. yield put(OrganizationActions.deleteOrganizationMemberFail())
  331. errorHandler(err)
  332. }
  333. }
  334. export function* changeOrganizationMemberRole(action: OrganizationActionType) {
  335. if (action.type !== ActionTypes.CHANGE_MEMBER_ROLE_ORGANIZATION) {
  336. return
  337. }
  338. const { relationId, newRole, resolve } = action.payload
  339. try {
  340. const asyncData = yield call(request, {
  341. url: `${api.organizations}/member/${relationId}`,
  342. method: 'put',
  343. data: { role: newRole }
  344. })
  345. const member = asyncData.payload
  346. yield put(
  347. OrganizationActions.organizationMemberRoleChanged(relationId, member)
  348. )
  349. yield resolve()
  350. } catch (err) {
  351. yield put(OrganizationActions.changeOrganizationMemberRoleFail())
  352. errorHandler(err)
  353. }
  354. }
  355. export function* getProjectAdmins(action: OrganizationActionType) {
  356. if (action.type !== ActionTypes.LOAD_PROJECT_ADMINS) {
  357. return
  358. }
  359. const { projectId } = action.payload
  360. try {
  361. const asyncData = yield call(request, `${api.projects}/${projectId}/admins`)
  362. const results = asyncData.payload
  363. yield put(OrganizationActions.projectAdminLoaded(results))
  364. } catch (err) {
  365. yield put(OrganizationActions.loadProjectAdminFail())
  366. errorHandler(err)
  367. }
  368. }
  369. export function* getVizVisbility(action: OrganizationActionType) {
  370. if (action.type !== ActionTypes.GET_VIZ_VISBILITY) {
  371. return
  372. }
  373. const { roleId, projectId, resolve } = action.payload
  374. try {
  375. const asyncData = yield call(request, {
  376. method: 'get',
  377. url: `${api.roles}/${roleId}/project/${projectId}/viz/visibility`
  378. })
  379. const results = asyncData.payload
  380. resolve(results)
  381. } catch (err) {
  382. errorHandler(err)
  383. }
  384. }
  385. export function* postVizVisbility(action: OrganizationActionType) {
  386. if (action.type !== ActionTypes.POST_VIZ_VISBILITY) {
  387. return
  388. }
  389. const { id, permission, resolve } = action.payload
  390. try {
  391. const asyncData = yield call(request, {
  392. url: `${api.roles}/${id}/viz/visibility`,
  393. method: 'post',
  394. data: permission
  395. })
  396. const result = asyncData.payload
  397. yield resolve(result)
  398. } catch (err) {
  399. errorHandler(err)
  400. }
  401. }
  402. export default function* rootOrganizationSaga() {
  403. yield all([
  404. takeLatest(ActionTypes.LOAD_ORGANIZATIONS, getOrganizations),
  405. takeEvery(ActionTypes.ADD_ORGANIZATION, addOrganization),
  406. takeEvery(ActionTypes.EDIT_ORGANIZATION, editOrganization),
  407. takeEvery(ActionTypes.DELETE_ORGANIZATION, deleteOrganization),
  408. takeLatest(ActionTypes.LOAD_ORGANIZATION_DETAIL, getOrganizationDetail),
  409. takeLatest(ActionTypes.LOAD_ORGANIZATIONS_MEMBERS, getOrganizationsMembers),
  410. takeLatest(
  411. ActionTypes.LOAD_ORGANIZATIONS_PROJECTS,
  412. getOrganizationsProjects
  413. ),
  414. takeLatest(ActionTypes.LOAD_ORGANIZATIONS_ROLE, getOrganizationsRole),
  415. takeEvery(ActionTypes.ADD_ROLE, addRole),
  416. takeEvery(ActionTypes.DELETE_ROLE, deleteRole),
  417. takeEvery(ActionTypes.EDIT_ROLE, editRole),
  418. takeEvery(ActionTypes.REL_ROLE_MEMBER, relRoleMember),
  419. takeEvery(ActionTypes.GET_REL_ROLE_MEMBER, getRelRoleMember),
  420. takeLatest(ActionTypes.LOAD_PROJECT_ADMINS, getProjectAdmins),
  421. takeLatest(ActionTypes.INVITE_MEMBER, inviteMember),
  422. takeLatest(ActionTypes.SEARCH_MEMBER, searchMember),
  423. takeLatest(
  424. ActionTypes.DELETE_ORGANIZATION_MEMBER,
  425. deleteOrganizationMember
  426. ),
  427. takeLatest(
  428. ActionTypes.CHANGE_MEMBER_ROLE_ORGANIZATION,
  429. changeOrganizationMemberRole
  430. ),
  431. takeLatest(ActionTypes.GET_VIZ_VISBILITY, getVizVisbility),
  432. takeLatest(ActionTypes.POST_VIZ_VISBILITY, postVizVisbility),
  433. takeEvery(ActionTypes.GET_ROLELISTS_BY_MEMBERID, getRoleListByMemberId)
  434. ])
  435. }