|
1 | 1 | import { delay, SagaIterator } from 'redux-saga' |
2 | | -import { call, put, takeEvery } from 'redux-saga/effects' |
| 2 | +import { call, put, select, takeEvery } from 'redux-saga/effects' |
3 | 3 |
|
4 | 4 | import * as actions from '../actions' |
5 | 5 | import * as actionTypes from '../actions/actionTypes' |
| 6 | +import { IAssessmentOverview } from '../components/assessment/assessmentShape' |
| 7 | +import { IState } from '../reducers/states' |
6 | 8 | import { BACKEND_URL } from '../utils/constants' |
7 | 9 | import { history } from '../utils/history' |
8 | 10 |
|
9 | 11 | function* backendSaga(): SagaIterator { |
10 | 12 | yield takeEvery(actionTypes.FETCH_AUTH, function*(action) { |
11 | 13 | const ivleToken = (action as actionTypes.IAction).payload |
12 | | - const resp = yield call(request, 'auth', { |
13 | | - method: 'POST', |
14 | | - body: JSON.stringify({ login: { ivle_token: ivleToken } }), |
15 | | - headers: new Headers({ |
16 | | - Accept: 'application/json', |
17 | | - 'Content-Type': 'application/json' |
18 | | - }) |
19 | | - }) |
| 14 | + const resp = yield call(callAuth, ivleToken) |
20 | 15 | const tokens = { |
21 | 16 | accessToken: resp.access_token, |
22 | 17 | refreshToken: resp.refresh_token |
23 | 18 | } |
24 | | - const user = yield getUser(tokens.accessToken) |
| 19 | + const user = yield call(authorizedGet, 'user', tokens.accessToken) |
25 | 20 | yield put(actions.setTokens(tokens)) |
26 | 21 | yield put(actions.setRole(user.role)) |
27 | 22 | yield put(actions.setUsername(user.name)) |
28 | 23 | yield delay(2000) |
29 | 24 | yield history.push('/academy') |
30 | 25 | }) |
| 26 | + |
| 27 | + yield takeEvery(actionTypes.FETCH_ASSESSMENT_OVERVIEWS, function*() { |
| 28 | + const accessToken = yield select((state: IState) => state.session.accessToken) |
| 29 | + const assessmentOverviews = yield call(callAssessments, accessToken) |
| 30 | + yield put(actions.updateAssessmentOverviews(assessmentOverviews)) |
| 31 | + }) |
| 32 | + |
| 33 | + yield takeEvery(actionTypes.FETCH_ASSESSMENT, function*(action) { |
| 34 | + const accessToken = yield select((state: IState) => state.session.accessToken) |
| 35 | + const id = (action as actionTypes.IAction).payload |
| 36 | + const assessment = yield call(callAssessmentsId, id, accessToken) |
| 37 | + yield put(actions.updateAssessment(assessment)) |
| 38 | + }) |
31 | 39 | } |
32 | 40 |
|
33 | | -function* getUser(accessToken: string) { |
34 | | - const resp = yield call(request, 'user', { |
| 41 | +const callAuth = (ivleToken: string) => |
| 42 | + request('auth', { |
| 43 | + method: 'POST', |
| 44 | + body: JSON.stringify({ login: { ivle_token: ivleToken } }), |
| 45 | + headers: new Headers({ |
| 46 | + Accept: 'application/json', |
| 47 | + 'Content-Type': 'application/json' |
| 48 | + }) |
| 49 | + }) |
| 50 | + |
| 51 | +const callAssessments = async (accessToken: string) => { |
| 52 | + const assessmentOverviews: any = await authorizedGet('assessments', accessToken) |
| 53 | + return assessmentOverviews.map((overview: any) => { |
| 54 | + // backend has property -> type: 'mission' | 'sidequest' | 'path' | 'contest' |
| 55 | + // we have -> category: 'Mission' | 'Sidequest' | 'Path' | 'Contest' |
| 56 | + overview.category = capitalise(overview.type) |
| 57 | + delete overview.type |
| 58 | + return overview as IAssessmentOverview |
| 59 | + }) |
| 60 | +} |
| 61 | + |
| 62 | +const callAssessmentsId = async (id: number, accessToken: string) => { |
| 63 | + const assessment: any = await authorizedGet(`assessments/${id}`, accessToken) |
| 64 | + assessment.category = capitalise(assessment.type) |
| 65 | + delete assessment.type |
| 66 | + return assessment |
| 67 | +} |
| 68 | + |
| 69 | +const authorizedGet = (path: string, accessToken: string) => |
| 70 | + request(path, { |
35 | 71 | method: 'GET', |
36 | 72 | headers: new Headers({ |
37 | 73 | Authorization: `Bearer ${accessToken}`, |
38 | 74 | Accept: 'application/json' |
39 | 75 | }) |
40 | 76 | }) |
41 | | - return resp |
42 | | -} |
43 | 77 |
|
44 | | -function request(path: string, opts: {}) { |
45 | | - return fetch(`${BACKEND_URL}/v1/${path}`, opts) |
| 78 | +const request = (path: string, opts: {}) => |
| 79 | + fetch(`${BACKEND_URL}/v1/${path}`, opts) |
46 | 80 | .then(data => data.json()) |
47 | | - .catch(err => err) |
48 | | -} |
| 81 | + .catch(_ => null) |
| 82 | + |
| 83 | +const capitalise = (text: string) => text.charAt(0).toUpperCase() + text.slice(1) |
49 | 84 |
|
50 | 85 | export default backendSaga |
0 commit comments