sagas.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  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 api from 'utils/api'
  21. import request from 'utils/request'
  22. import { errorHandler } from 'utils/util'
  23. import { ActionTypes } from './constants'
  24. import { ProjectActions, ProjectActionType } from './actions'
  25. import { ActionTypes as OrganizationActionTypes } from '../Organizations/constants'
  26. import { call, all, put, takeLatest, takeEvery, throttle } from 'redux-saga/effects'
  27. import { OrganizationActions, OrganizationActionType } from 'containers/Organizations/actions'
  28. export function* getProjects (action: ProjectActionType) {
  29. if (action.type !== ActionTypes.LOAD_PROJECTS) { return }
  30. const { projectsLoaded, loadProjectsFail } = ProjectActions
  31. try {
  32. const asyncData = yield call(request, api.projects)
  33. const projects = asyncData.payload
  34. yield put(projectsLoaded(projects))
  35. } catch (err) {
  36. yield put(loadProjectsFail())
  37. errorHandler(err)
  38. }
  39. }
  40. export function* addProject (action: ProjectActionType) {
  41. if (action.type !== ActionTypes.ADD_PROJECT) { return }
  42. const { project, resolve } = action.payload
  43. const { projectAdded, addProjectFail } = ProjectActions
  44. try {
  45. const asyncData = yield call(request, {
  46. method: 'post',
  47. url: api.projects,
  48. data: project
  49. })
  50. const result = asyncData.payload
  51. yield put(projectAdded(result))
  52. resolve()
  53. } catch (err) {
  54. yield put(addProjectFail())
  55. errorHandler(err)
  56. }
  57. }
  58. export function* editProject (action: ProjectActionType) {
  59. if (action.type !== ActionTypes.EDIT_PROJECT) { return }
  60. const { project, resolve } = action.payload
  61. const { id } = project
  62. const { projectEdited, editProjectFail } = ProjectActions
  63. try {
  64. yield call(request, {
  65. method: 'put',
  66. url: `${api.projects}/${id}`,
  67. data: project
  68. })
  69. yield put(projectEdited(project))
  70. resolve()
  71. } catch (err) {
  72. yield put(editProjectFail())
  73. errorHandler(err)
  74. }
  75. }
  76. export function* deleteProject (action: ProjectActionType) {
  77. if (action.type !== ActionTypes.DELETE_PROJECT) { return }
  78. const { id, resolve } = action.payload
  79. const { projectDeleted, deleteProjectFail } = ProjectActions
  80. try {
  81. yield call(request, {
  82. method: 'delete',
  83. url: `${api.projects}/${id}`
  84. })
  85. yield put(projectDeleted(id))
  86. if (resolve) {
  87. resolve()
  88. }
  89. } catch (err) {
  90. yield put(deleteProjectFail())
  91. errorHandler(err)
  92. }
  93. }
  94. export function* addProjectAdmin (action: ProjectActionType) {
  95. if (action.type !== ActionTypes.ADD_PROJECT_ADMIN) { return }
  96. const { id, adminIds, resolve } = action.payload
  97. const { addProjectFail } = ProjectActions
  98. try {
  99. const asyncData = yield call(request, {
  100. method: 'post',
  101. url: `${api.projects}/${id}/admins`,
  102. data: adminIds
  103. })
  104. const result = asyncData.payload
  105. // yield put(projectAdded(result))
  106. resolve(result)
  107. } catch (err) {
  108. yield put(addProjectFail())
  109. errorHandler(err)
  110. }
  111. }
  112. export function* deleteProjectAdmin (action: ProjectActionType) {
  113. if (action.type !== ActionTypes.DELETE_PROJECT_ADMIN) { return }
  114. const { id, relationId, resolve } = action.payload
  115. const { deleteProjectAdminFail } = ProjectActions
  116. try {
  117. const asyncData = yield call(request, {
  118. method: 'delete',
  119. url: `${api.projects}/${id}/admin/${relationId}`
  120. })
  121. const result = asyncData.payload
  122. // yield put(projectAdded(result))
  123. resolve(result)
  124. } catch (err) {
  125. yield put(deleteProjectAdminFail())
  126. errorHandler(err)
  127. }
  128. }
  129. export function* addProjectRole (action: ProjectActionType) {
  130. if (action.type !== ActionTypes.ADD_PROJECT_ROLE) { return }
  131. const { projectId, roleIds, resolve } = action.payload
  132. const { addProjectRoleFail } = ProjectActions
  133. try {
  134. const asyncData = yield call(request, {
  135. method: 'post',
  136. url: `${api.projects}/${projectId}/roles`,
  137. data: roleIds
  138. })
  139. const result = asyncData.payload
  140. resolve(result)
  141. } catch (err) {
  142. yield put(addProjectRoleFail())
  143. errorHandler(err)
  144. }
  145. }
  146. export function* getProjectDetail (action: ProjectActionType) {
  147. if (action.type !== ActionTypes.LOAD_PROJECT_DETAIL) { return }
  148. const { id: projectId } = action.payload
  149. const { projectDetailLoaded } = ProjectActions
  150. try {
  151. const asyncData = yield call(request, `${api.projects}/${projectId}`)
  152. const project = asyncData.payload
  153. yield put(projectDetailLoaded(project))
  154. } catch (err) {
  155. errorHandler(err)
  156. }
  157. }
  158. export function* transferProject (action: ProjectActionType) {
  159. if (action.type !== ActionTypes.TRANSFER_PROJECT) { return }
  160. const { id, orgId } = action.payload
  161. const { projectTransfered, transferProjectFail } = ProjectActions
  162. try {
  163. const asyncData = yield call(request, {
  164. method: 'put',
  165. url: `${api.projects}/${id}/transfer`,
  166. data: {orgId}
  167. })
  168. const result = asyncData.payload
  169. yield put(projectTransfered(result))
  170. } catch (err) {
  171. yield put(transferProjectFail())
  172. errorHandler(err)
  173. }
  174. }
  175. export function* searchProject (action: ProjectActionType) {
  176. if (action.type !== ActionTypes.SEARCH_PROJECT) { return }
  177. const { param: { keywords, pageNum, pageSize } } = action.payload
  178. const { projectSearched, searchProjectFail } = ProjectActions
  179. try {
  180. const asyncData = yield call(request, {
  181. method: 'get',
  182. url: `${api.projects}/search/?pageNum=${pageNum || 1}&pageSize=${pageSize || 10}&keywords=${keywords || ''}`
  183. })
  184. const result = asyncData.payload
  185. yield put(projectSearched(result))
  186. } catch (err) {
  187. yield put(searchProjectFail())
  188. errorHandler(err)
  189. }
  190. }
  191. export function* unStarProject (action: ProjectActionType) {
  192. if (action.type !== ActionTypes.PROJECT_UNSTAR) { return }
  193. const { id, resolve } = action.payload
  194. const { unStarProjectSuccess, unStarProjectFail } = ProjectActions
  195. try {
  196. const asyncData = yield call(request, {
  197. method: 'post',
  198. url: `${api.star}/project/${id}`,
  199. data: {id}
  200. })
  201. const result = asyncData.payload
  202. yield put(unStarProjectSuccess(result))
  203. yield resolve()
  204. } catch (err) {
  205. yield put(unStarProjectFail())
  206. errorHandler(err)
  207. }
  208. }
  209. export function* getProjectStarUser (action: ProjectActionType) {
  210. if (action.type !== ActionTypes.GET_PROJECT_STAR_USER) { return }
  211. const { id } = action.payload
  212. const { getProjectStarUserSuccess, getProjectStarUserFail } = ProjectActions
  213. try {
  214. const asyncData = yield call(request, {
  215. method: 'get',
  216. url: `${api.star}/project/${id}`
  217. })
  218. const result = asyncData.payload
  219. yield put(getProjectStarUserSuccess(result))
  220. } catch (err) {
  221. yield put(getProjectStarUserFail())
  222. errorHandler(err)
  223. }
  224. }
  225. export function* getCollectProjects () {
  226. const { collectProjectLoaded, collectProjectFail } = ProjectActions
  227. try {
  228. const asyncData = yield call(request, {
  229. method: 'get',
  230. url: `${api.projects}/favorites`
  231. })
  232. const result = asyncData.payload
  233. yield put(collectProjectLoaded(result))
  234. } catch (err) {
  235. yield put(collectProjectFail())
  236. errorHandler(err)
  237. }
  238. }
  239. export function* editCollectProject (action: ProjectActionType) {
  240. if (action.type !== ActionTypes.CLICK_COLLECT_PROJECT) { return }
  241. const { isFavorite, proId, resolve } = action.payload
  242. const { collectProjectClicked, clickCollectProjectFail } = ProjectActions
  243. try {
  244. if (!isFavorite) {
  245. yield call(request, {
  246. method: 'post',
  247. url: `${api.projects}/favorite/${proId}`,
  248. data: {id: proId}
  249. })
  250. } else {
  251. yield call(request, {
  252. method: 'delete',
  253. url: `${api.projects}/remove/favorites`,
  254. data: [proId]
  255. })
  256. }
  257. yield put(collectProjectClicked(action.payload))
  258. yield resolve()
  259. } catch (err) {
  260. yield put(clickCollectProjectFail())
  261. errorHandler(err)
  262. }
  263. }
  264. export function* loadRelRoleProject (action: ProjectActionType) {
  265. if (action.type !== ActionTypes.LOAD_RELATION_ROLE_PROJECT) { return }
  266. const { id, roleId } = action.payload
  267. const { relRoleProjectLoaded, loadRelRoleProjectFail } = ProjectActions
  268. try {
  269. const asyncData = yield call(request, {
  270. method: 'get',
  271. url: `${api.projects}/${id}/roles/${roleId}`
  272. })
  273. const result = asyncData.payload
  274. yield put(relRoleProjectLoaded(result))
  275. } catch (err) {
  276. yield put(loadRelRoleProjectFail())
  277. errorHandler(err)
  278. }
  279. }
  280. export function* updateRelRoleProject (action: ProjectActionType) {
  281. if (action.type !== ActionTypes.UPDATE_RELATION_ROLE_PROJECT) { return }
  282. const { roleId, projectId, projectRole } = action.payload
  283. const { relRoleProjectUpdated, updateRelRoleProjectFail } = ProjectActions
  284. try {
  285. yield call(request, {
  286. method: 'put',
  287. url: `${api.roles}/${roleId}/project/${projectId}`,
  288. data: projectRole
  289. })
  290. yield put(relRoleProjectUpdated(projectRole))
  291. } catch (err) {
  292. yield put(updateRelRoleProjectFail())
  293. errorHandler(err)
  294. }
  295. }
  296. export function* deleteRelRoleProject (action: ProjectActionType) {
  297. if (action.type !== ActionTypes.DELETE_RELATION_ROLE_PROJECT) { return }
  298. const { roleId, projectId, resolve } = action.payload
  299. const { relRoleProjectDeleted, deleteRelRoleProjectFail } = ProjectActions
  300. try {
  301. const asyncData = yield call(request, {
  302. method: 'delete',
  303. url: `${api.roles}/${roleId}/project/${projectId}`
  304. })
  305. const result = asyncData.payload
  306. yield put(relRoleProjectDeleted(result))
  307. resolve()
  308. } catch (err) {
  309. yield put(deleteRelRoleProjectFail())
  310. errorHandler(err)
  311. }
  312. }
  313. export function* getProjectRoles (action: OrganizationActionType) {
  314. if (action.type !== OrganizationActionTypes.LOAD_PROJECT_ROLES) { return }
  315. const { projectId } = action.payload
  316. const { projectRolesLoaded, loadProjectRolesFail } = OrganizationActions
  317. try {
  318. const asyncData = yield call(request, `${api.projects}/${projectId}/roles`)
  319. const results = asyncData.payload
  320. yield put(projectRolesLoaded(results))
  321. } catch (err) {
  322. yield put(loadProjectRolesFail())
  323. errorHandler(err)
  324. }
  325. }
  326. export function* excludeRole (action: ProjectActionType) {
  327. if (action.type !== ActionTypes.EXCLUDE_ROLES) { return }
  328. const { id, type, resolve } = action.payload
  329. const { rolesExcluded, excludeRolesFail } = ProjectActions
  330. let host: string
  331. switch (type) {
  332. case 'dashboard':
  333. host = `${api.portal}/dashboard`
  334. break
  335. case 'portal':
  336. host = `${api.portal}`
  337. break
  338. case 'display':
  339. host = `${api.display}`
  340. break
  341. default:
  342. break
  343. }
  344. try {
  345. const asyncData = yield call(request, `${host}/${id}/exclude/roles`)
  346. const results = asyncData.payload
  347. yield put(rolesExcluded(results))
  348. resolve(results)
  349. } catch (err) {
  350. yield put(excludeRolesFail(err))
  351. }
  352. }
  353. export default function* rootProjectSaga () {
  354. yield all([
  355. takeLatest(ActionTypes.LOAD_PROJECTS, getProjects),
  356. takeLatest(ActionTypes.ADD_PROJECT_ROLE, addProjectRole),
  357. takeEvery(ActionTypes.ADD_PROJECT, addProject),
  358. takeEvery(ActionTypes.EDIT_PROJECT, editProject),
  359. takeEvery(ActionTypes.DELETE_PROJECT, deleteProject),
  360. takeLatest(ActionTypes.LOAD_PROJECT_DETAIL, getProjectDetail),
  361. takeEvery(ActionTypes.TRANSFER_PROJECT, transferProject),
  362. takeEvery(ActionTypes.PROJECT_UNSTAR, unStarProject),
  363. takeEvery(ActionTypes.GET_PROJECT_STAR_USER, getProjectStarUser),
  364. throttle(1000, ActionTypes.SEARCH_PROJECT, searchProject),
  365. takeLatest(ActionTypes.LOAD_COLLECT_PROJECTS, getCollectProjects),
  366. takeEvery(ActionTypes.CLICK_COLLECT_PROJECT, editCollectProject),
  367. takeEvery(ActionTypes.ADD_PROJECT_ADMIN, addProjectAdmin),
  368. takeEvery(ActionTypes.DELETE_PROJECT_ADMIN, deleteProjectAdmin),
  369. takeEvery(ActionTypes.LOAD_RELATION_ROLE_PROJECT, loadRelRoleProject),
  370. takeEvery(ActionTypes.UPDATE_RELATION_ROLE_PROJECT, updateRelRoleProject),
  371. takeEvery(ActionTypes.DELETE_RELATION_ROLE_PROJECT, deleteRelRoleProject),
  372. takeEvery(OrganizationActionTypes.LOAD_PROJECT_ROLES, getProjectRoles),
  373. takeEvery(ActionTypes.EXCLUDE_ROLES, excludeRole)
  374. ])
  375. }