sagas.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  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. console.log(err)
  111. // window.location.href = 'http://taihu.xt.wenhq.top:8083'
  112. yield put(getServerConfigurationsFail(err))
  113. errorHandler(err)
  114. }
  115. }
  116. export function* tryExternalAuth(action) {
  117. const { resolve } = action.payload
  118. try {
  119. const asyncData = yield call(request, {
  120. method: 'post',
  121. url: api.tryExternalAuth
  122. })
  123. const loginUser = asyncData.payload
  124. localStorage.setItem('loginUser', JSON.stringify(loginUser))
  125. resolve()
  126. } catch (err) {
  127. console.error(err)
  128. }
  129. }
  130. export function* login(action) {
  131. const { username, password, resolve } = action.payload
  132. try {
  133. const asyncData = yield call(request, {
  134. method: 'post',
  135. url: api.login,
  136. data: {
  137. username,
  138. password
  139. }
  140. })
  141. const loginUser = asyncData.payload
  142. localStorage.setItem('loginUser', JSON.stringify(loginUser))
  143. resolve()
  144. } catch (err) {
  145. yield put(loginError())
  146. errorHandler(err)
  147. }
  148. }
  149. export function* logout() {
  150. try {
  151. removeToken()
  152. localStorage.removeItem('loginUser')
  153. } catch (err) {
  154. errorHandler(err)
  155. }
  156. }
  157. export function* activeUser(action) {
  158. const { token, resolve } = action.payload
  159. try {
  160. const asyncData = yield call(request, {
  161. method: 'post',
  162. url: `${api.signup}/active/${token}`
  163. })
  164. switch (asyncData.header.code) {
  165. case 200:
  166. const loginUser = asyncData.payload
  167. yield put(activeSuccess(loginUser))
  168. localStorage.setItem('loginUser', JSON.stringify(loginUser))
  169. resolve()
  170. return loginUser
  171. case 302:
  172. message.error(asyncData.header.msg)
  173. setTimeout(() => location.replace('/'), 500)
  174. return
  175. default:
  176. yield put(activeError())
  177. message.error(asyncData.header.msg)
  178. return null
  179. }
  180. } catch (err) {
  181. yield put(activeError())
  182. errorHandler(err)
  183. }
  184. }
  185. export function* checkName(action) {
  186. const { id, name, type, params, resolve, reject } = action.payload
  187. try {
  188. const asyncData = yield call(request, `${api.checkName}/${type}`, {
  189. method: 'get',
  190. params: {
  191. ...params,
  192. id,
  193. name
  194. }
  195. })
  196. const msg =
  197. asyncData && asyncData.header && asyncData.header.msg
  198. ? asyncData.header.msg
  199. : ''
  200. const code =
  201. asyncData && asyncData.header && asyncData.header.code
  202. ? asyncData.header.code
  203. : ''
  204. resolve(msg)
  205. } catch (err) {
  206. errorHandler(err)
  207. }
  208. }
  209. export function* checkNameUnique(action) {
  210. const { pathname, data, resolve, reject } = action.payload
  211. try {
  212. if (!data.name) {
  213. return
  214. }
  215. const asyncData = yield call(request, {
  216. method: 'get',
  217. url: `${api.checkNameUnique}/${pathname}`,
  218. params: data
  219. })
  220. const msg =
  221. asyncData && asyncData.header && asyncData.header.msg
  222. ? asyncData.header.msg
  223. : ''
  224. const code =
  225. asyncData && asyncData.header && asyncData.header.code
  226. ? asyncData.header.code
  227. : ''
  228. resolve(msg)
  229. } catch (err) {
  230. errorHandler(err)
  231. }
  232. }
  233. export function* updateProfile(action) {
  234. const { id, name, description, department, resolve } = action.payload
  235. try {
  236. const asyncData = yield call(request, {
  237. method: 'put',
  238. url: `${api.signup}/${id}`,
  239. data: {
  240. name,
  241. description,
  242. department
  243. }
  244. })
  245. const updateUserProfile = { id, name, department, description }
  246. yield put(updateProfileSuccess(updateUserProfile))
  247. const prevLoginUser = JSON.parse(localStorage.getItem('loginUser'))
  248. localStorage.setItem(
  249. 'loginUser',
  250. JSON.stringify({ ...prevLoginUser, ...updateUserProfile })
  251. )
  252. resolve(asyncData)
  253. } catch (err) {
  254. yield put(updateProfileError())
  255. errorHandler(err)
  256. }
  257. }
  258. export function* getCaptchaForResetPassword(
  259. action: IReduxActionStruct<IGetgetCaptchaParams>
  260. ) {
  261. const { type, ticket, resolve } = action.payload
  262. try {
  263. const httpResponse = yield call(request, {
  264. method: 'post',
  265. url: `${api.user}/forget/password/${type}`,
  266. data: {
  267. ticket
  268. }
  269. })
  270. const { payload } = httpResponse
  271. yield put(getCaptchaforResetPasswordSuccess(payload))
  272. resolve(payload)
  273. } catch (err) {
  274. yield put(getCaptchaforResetPasswordError(err))
  275. errorHandler(err)
  276. }
  277. }
  278. export function* resetPasswordUnlogged(
  279. action: IReduxActionStruct<IResetPasswordParams>
  280. ) {
  281. const { ticket, type, token, resolve, checkCode, password } = action.payload
  282. try {
  283. const httpResponse = yield call(request, {
  284. method: 'post',
  285. url: `${api.user}/reset/password/${type}/${token}`,
  286. data: {
  287. ticket,
  288. checkCode,
  289. password
  290. }
  291. })
  292. const { header } = httpResponse
  293. yield put(resetPasswordUnloggedSuccess(header))
  294. resolve(header)
  295. } catch (err) {
  296. yield put(resetPasswordUnloggedFail(err))
  297. errorHandler(err)
  298. }
  299. }
  300. export function* changeUserPassword({ payload }) {
  301. const { user } = payload
  302. try {
  303. const result = yield call(request, {
  304. method: 'put',
  305. url: `${api.user}/${user.id}/changepassword`,
  306. data: user
  307. })
  308. yield put(userPasswordChanged(payload.info))
  309. payload.resolve()
  310. } catch (err) {
  311. yield put(changeUserPasswordFail())
  312. errorHandler(err)
  313. }
  314. }
  315. export function* joinOrganization(action) {
  316. const { token, resolve, reject } = action.payload
  317. try {
  318. const asyncData = yield call(request, {
  319. method: 'post',
  320. url: `${api.organizations}/confirminvite/${token}`
  321. })
  322. switch (asyncData.header.code) {
  323. case 200:
  324. const detail = asyncData.payload
  325. yield put(joinOrganizationSuccess(detail))
  326. if (resolve) {
  327. resolve(detail)
  328. }
  329. return token
  330. default:
  331. yield put(joinOrganizationError())
  332. message.error(asyncData.header.msg)
  333. return null
  334. }
  335. } catch (error) {
  336. if (reject) {
  337. reject(error)
  338. }
  339. if (error.response) {
  340. switch (error.response.status) {
  341. case 403:
  342. removeToken()
  343. break
  344. case 400:
  345. message.error(error.response.data.header.msg, 3)
  346. break
  347. default:
  348. break
  349. }
  350. }
  351. }
  352. }
  353. export function* getDownloadList() {
  354. try {
  355. const result = yield call(request, `${api.download}/page`)
  356. yield put(downloadListLoaded(result.payload))
  357. } catch (err) {
  358. yield put(loadDownloadListFail(err))
  359. errorHandler(err)
  360. }
  361. }
  362. export function* downloadFile(action) {
  363. const { id } = action.payload
  364. try {
  365. location.href = `${api.download}/record/file/${id}/${getToken()}`
  366. yield put(fileDownloaded(id))
  367. } catch (err) {
  368. yield put(downloadFileFail(err))
  369. errorHandler(err)
  370. }
  371. }
  372. export function* getUserByToken(action) {
  373. const { token } = action.payload
  374. try {
  375. const result = yield call(request, `${api.user}/check/${token}`)
  376. const loginUser = result.payload
  377. yield put(getUserByTokenSuccess(loginUser))
  378. localStorage.setItem('loginUser', JSON.stringify(loginUser))
  379. } catch (err) {
  380. yield put(getUserByTokenFail(err))
  381. errorHandler(err)
  382. }
  383. }
  384. export default function* rootGroupSaga() {
  385. yield all([
  386. throttle(1000, CHECK_NAME, checkNameUnique),
  387. takeEvery(ACTIVE, activeUser),
  388. takeLatest(GET_EXTERNAL_AUTH_PROVIDERS, getExternalAuthProviders),
  389. takeEvery(TRY_EXTERNAL_AUTH, tryExternalAuth),
  390. takeEvery(LOGIN, login),
  391. takeEvery(LOGOUT, logout),
  392. takeEvery(UPDATE_PROFILE, updateProfile),
  393. takeEvery(CHANGE_USER_PASSWORD, changeUserPassword as any),
  394. takeEvery(
  395. GET_CAPTCHA_FOR_RESET_PASSWORD,
  396. getCaptchaForResetPassword as any
  397. ),
  398. takeEvery(RESET_PASSWORD_UNLOGGED, resetPasswordUnlogged as any),
  399. takeEvery(GET_USER_BY_TOKEN, getUserByToken),
  400. takeEvery(JOIN_ORGANIZATION, joinOrganization),
  401. takeLatest(LOAD_DOWNLOAD_LIST, getDownloadList),
  402. takeLatest(DOWNLOAD_FILE, downloadFile),
  403. takeLatest(GET_SERVER_CONFIGURATIONS, getServerConfigurations)
  404. ])
  405. }