sagas.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  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 {
  21. call,
  22. put,
  23. all,
  24. takeLatest,
  25. throttle,
  26. takeEvery
  27. } from 'redux-saga/effects'
  28. import { message } from 'antd'
  29. import {
  30. LOGIN,
  31. LOGOUT,
  32. CHECK_NAME,
  33. ACTIVE,
  34. GET_SERVER_CONFIGURATIONS,
  35. UPDATE_PROFILE,
  36. CHANGE_USER_PASSWORD,
  37. JOIN_ORGANIZATION,
  38. LOAD_DOWNLOAD_LIST,
  39. DOWNLOAD_FILE,
  40. GET_EXTERNAL_AUTH_PROVIDERS,
  41. TRY_EXTERNAL_AUTH,
  42. GET_CAPTCHA_FOR_RESET_PASSWORD,
  43. RESET_PASSWORD_UNLOGGED,
  44. GET_USER_BY_TOKEN
  45. } from './constants'
  46. import {
  47. loginError,
  48. activeSuccess,
  49. activeError,
  50. joinOrganizationSuccess,
  51. joinOrganizationError,
  52. updateProfileSuccess,
  53. updateProfileError,
  54. userPasswordChanged,
  55. changeUserPasswordFail,
  56. downloadListLoaded,
  57. loadDownloadListFail,
  58. fileDownloaded,
  59. downloadFileFail,
  60. gotExternalAuthProviders,
  61. getCaptchaforResetPasswordSuccess,
  62. getCaptchaforResetPasswordError,
  63. resetPasswordUnloggedSuccess,
  64. resetPasswordUnloggedFail,
  65. serverConfigurationsGetted,
  66. getServerConfigurationsFail,
  67. getUserByTokenFail,
  68. getUserByTokenSuccess
  69. } from './actions'
  70. import request, {
  71. removeToken,
  72. getToken,
  73. setTokenExpired,
  74. IDavinciResponse
  75. } from 'utils/request'
  76. import { errorHandler } from 'utils/util'
  77. import api from 'utils/api'
  78. import { IReduxActionStruct } from 'utils/types'
  79. import {
  80. IResetPasswordParams,
  81. IGetgetCaptchaParams
  82. } from '../FindPassword/types'
  83. import { IServerConfigurations } from './types'
  84. export function* getExternalAuthProviders() {
  85. try {
  86. const asyncData = yield call(request, {
  87. method: 'get',
  88. url: api.externalAuthProviders
  89. })
  90. const providers = asyncData.payload
  91. yield put(gotExternalAuthProviders(providers))
  92. return providers
  93. } catch (err) {
  94. errorHandler(err)
  95. }
  96. }
  97. export function* getServerConfigurations(action) {
  98. try {
  99. const result: IDavinciResponse<IServerConfigurations> = yield call(
  100. request,
  101. {
  102. method: 'get',
  103. url: api.configurations
  104. }
  105. )
  106. const configurations = result.payload
  107. setTokenExpired(configurations.jwtToken.timeout)
  108. yield put(serverConfigurationsGetted(configurations))
  109. } catch (err) {
  110. yield put(getServerConfigurationsFail(err))
  111. errorHandler(err)
  112. }
  113. }
  114. export function* tryExternalAuth(action) {
  115. const { resolve } = action.payload
  116. try {
  117. const asyncData = yield call(request, {
  118. method: 'post',
  119. url: api.tryExternalAuth
  120. })
  121. const loginUser = asyncData.payload
  122. localStorage.setItem('loginUser', JSON.stringify(loginUser))
  123. resolve()
  124. } catch (err) {
  125. console.error(err)
  126. }
  127. }
  128. export function* login(action) {
  129. const { username, password, resolve } = action.payload
  130. try {
  131. const asyncData = yield call(request, {
  132. method: 'post',
  133. url: api.login,
  134. data: {
  135. username,
  136. password
  137. }
  138. })
  139. const loginUser = asyncData.payload
  140. localStorage.setItem('loginUser', JSON.stringify(loginUser))
  141. resolve()
  142. } catch (err) {
  143. yield put(loginError())
  144. errorHandler(err)
  145. }
  146. }
  147. export function* logout() {
  148. try {
  149. removeToken()
  150. localStorage.removeItem('loginUser')
  151. } catch (err) {
  152. errorHandler(err)
  153. }
  154. }
  155. export function* activeUser(action) {
  156. const { token, resolve } = action.payload
  157. try {
  158. const asyncData = yield call(request, {
  159. method: 'post',
  160. url: `${api.signup}/active/${token}`
  161. })
  162. switch (asyncData.header.code) {
  163. case 200:
  164. const loginUser = asyncData.payload
  165. yield put(activeSuccess(loginUser))
  166. localStorage.setItem('loginUser', JSON.stringify(loginUser))
  167. resolve()
  168. return loginUser
  169. case 302:
  170. message.error(asyncData.header.msg)
  171. setTimeout(() => location.replace('/'), 500)
  172. return
  173. default:
  174. yield put(activeError())
  175. message.error(asyncData.header.msg)
  176. return null
  177. }
  178. } catch (err) {
  179. yield put(activeError())
  180. errorHandler(err)
  181. }
  182. }
  183. export function* checkName(action) {
  184. const { id, name, type, params, resolve, reject } = action.payload
  185. try {
  186. const asyncData = yield call(request, `${api.checkName}/${type}`, {
  187. method: 'get',
  188. params: {
  189. ...params,
  190. id,
  191. name
  192. }
  193. })
  194. const msg =
  195. asyncData && asyncData.header && asyncData.header.msg
  196. ? asyncData.header.msg
  197. : ''
  198. const code =
  199. asyncData && asyncData.header && asyncData.header.code
  200. ? asyncData.header.code
  201. : ''
  202. resolve(msg)
  203. } catch (err) {
  204. errorHandler(err)
  205. }
  206. }
  207. export function* checkNameUnique(action) {
  208. const { pathname, data, resolve, reject } = action.payload
  209. try {
  210. if (!data.name) {
  211. return
  212. }
  213. const asyncData = yield call(request, {
  214. method: 'get',
  215. url: `${api.checkNameUnique}/${pathname}`,
  216. params: data
  217. })
  218. const msg =
  219. asyncData && asyncData.header && asyncData.header.msg
  220. ? asyncData.header.msg
  221. : ''
  222. const code =
  223. asyncData && asyncData.header && asyncData.header.code
  224. ? asyncData.header.code
  225. : ''
  226. resolve(msg)
  227. } catch (err) {
  228. errorHandler(err)
  229. }
  230. }
  231. export function* updateProfile(action) {
  232. const { id, name, description, department, resolve } = action.payload
  233. try {
  234. const asyncData = yield call(request, {
  235. method: 'put',
  236. url: `${api.signup}/${id}`,
  237. data: {
  238. name,
  239. description,
  240. department
  241. }
  242. })
  243. const updateUserProfile = { id, name, department, description }
  244. yield put(updateProfileSuccess(updateUserProfile))
  245. const prevLoginUser = JSON.parse(localStorage.getItem('loginUser'))
  246. localStorage.setItem(
  247. 'loginUser',
  248. JSON.stringify({ ...prevLoginUser, ...updateUserProfile })
  249. )
  250. resolve(asyncData)
  251. } catch (err) {
  252. yield put(updateProfileError())
  253. errorHandler(err)
  254. }
  255. }
  256. export function* getCaptchaForResetPassword(
  257. action: IReduxActionStruct<IGetgetCaptchaParams>
  258. ) {
  259. const { type, ticket, resolve } = action.payload
  260. try {
  261. const httpResponse = yield call(request, {
  262. method: 'post',
  263. url: `${api.user}/forget/password/${type}`,
  264. data: {
  265. ticket
  266. }
  267. })
  268. const { payload } = httpResponse
  269. yield put(getCaptchaforResetPasswordSuccess(payload))
  270. resolve(payload)
  271. } catch (err) {
  272. yield put(getCaptchaforResetPasswordError(err))
  273. errorHandler(err)
  274. }
  275. }
  276. export function* resetPasswordUnlogged(
  277. action: IReduxActionStruct<IResetPasswordParams>
  278. ) {
  279. const { ticket, type, token, resolve, checkCode, password } = action.payload
  280. try {
  281. const httpResponse = yield call(request, {
  282. method: 'post',
  283. url: `${api.user}/reset/password/${type}/${token}`,
  284. data: {
  285. ticket,
  286. checkCode,
  287. password
  288. }
  289. })
  290. const { header } = httpResponse
  291. yield put(resetPasswordUnloggedSuccess(header))
  292. resolve(header)
  293. } catch (err) {
  294. yield put(resetPasswordUnloggedFail(err))
  295. errorHandler(err)
  296. }
  297. }
  298. export function* changeUserPassword({ payload }) {
  299. const { user } = payload
  300. try {
  301. const result = yield call(request, {
  302. method: 'put',
  303. url: `${api.user}/${user.id}/changepassword`,
  304. data: user
  305. })
  306. yield put(userPasswordChanged(payload.info))
  307. payload.resolve()
  308. } catch (err) {
  309. yield put(changeUserPasswordFail())
  310. errorHandler(err)
  311. }
  312. }
  313. export function* joinOrganization(action) {
  314. const { token, resolve, reject } = action.payload
  315. try {
  316. const asyncData = yield call(request, {
  317. method: 'post',
  318. url: `${api.organizations}/confirminvite/${token}`
  319. })
  320. switch (asyncData.header.code) {
  321. case 200:
  322. const detail = asyncData.payload
  323. yield put(joinOrganizationSuccess(detail))
  324. if (resolve) {
  325. resolve(detail)
  326. }
  327. return token
  328. default:
  329. yield put(joinOrganizationError())
  330. message.error(asyncData.header.msg)
  331. return null
  332. }
  333. } catch (error) {
  334. if (reject) {
  335. reject(error)
  336. }
  337. if (error.response) {
  338. switch (error.response.status) {
  339. case 403:
  340. removeToken()
  341. break
  342. case 400:
  343. message.error(error.response.data.header.msg, 3)
  344. break
  345. default:
  346. break
  347. }
  348. }
  349. }
  350. }
  351. export function* getDownloadList() {
  352. try {
  353. const result = yield call(request, `${api.download}/page`)
  354. yield put(downloadListLoaded(result.payload))
  355. } catch (err) {
  356. yield put(loadDownloadListFail(err))
  357. errorHandler(err)
  358. }
  359. }
  360. export function* downloadFile(action) {
  361. const { id } = action.payload
  362. try {
  363. location.href = `${api.download}/record/file/${id}/${getToken()}`
  364. yield put(fileDownloaded(id))
  365. } catch (err) {
  366. yield put(downloadFileFail(err))
  367. errorHandler(err)
  368. }
  369. }
  370. export function* getUserByToken(action) {
  371. const { token } = action.payload
  372. try {
  373. const result = yield call(request, `${api.user}/check/${token}`)
  374. const loginUser = result.payload
  375. yield put(getUserByTokenSuccess(loginUser))
  376. localStorage.setItem('loginUser', JSON.stringify(loginUser))
  377. } catch (err) {
  378. yield put(getUserByTokenFail(err))
  379. errorHandler(err)
  380. }
  381. }
  382. export default function* rootGroupSaga() {
  383. yield all([
  384. throttle(1000, CHECK_NAME, checkNameUnique),
  385. takeEvery(ACTIVE, activeUser),
  386. takeLatest(GET_EXTERNAL_AUTH_PROVIDERS, getExternalAuthProviders),
  387. takeEvery(TRY_EXTERNAL_AUTH, tryExternalAuth),
  388. takeEvery(LOGIN, login),
  389. takeEvery(LOGOUT, logout),
  390. takeEvery(UPDATE_PROFILE, updateProfile),
  391. takeEvery(CHANGE_USER_PASSWORD, changeUserPassword as any),
  392. takeEvery(
  393. GET_CAPTCHA_FOR_RESET_PASSWORD,
  394. getCaptchaForResetPassword as any
  395. ),
  396. takeEvery(RESET_PASSWORD_UNLOGGED, resetPasswordUnlogged as any),
  397. takeEvery(GET_USER_BY_TOKEN, getUserByToken),
  398. takeEvery(JOIN_ORGANIZATION, joinOrganization),
  399. takeLatest(LOAD_DOWNLOAD_LIST, getDownloadList),
  400. takeLatest(DOWNLOAD_FILE, downloadFile),
  401. takeLatest(GET_SERVER_CONFIGURATIONS, getServerConfigurations)
  402. ])
  403. }