sagas.ts 10 KB

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