Showing
10 changed files
with
113 additions
and
27 deletions
... | @@ -13,19 +13,20 @@ const BJIDFormBlock = styled.div` | ... | @@ -13,19 +13,20 @@ const BJIDFormBlock = styled.div` |
13 | } | 13 | } |
14 | `; | 14 | `; |
15 | 15 | ||
16 | -const BJIDForm = ({ onChange, onBJIDSubmit, profile }) => { | 16 | +const BJIDForm = ({ onChange, onBJIDSubmit, profile, onSyncBJIDSubmit }) => { |
17 | return ( | 17 | return ( |
18 | <BJIDFormBlock> | 18 | <BJIDFormBlock> |
19 | <h4>백준 아이디</h4> | 19 | <h4>백준 아이디</h4> |
20 | + <form onSubmit={onBJIDSubmit}> | ||
20 | <input | 21 | <input |
21 | name="userBJID" | 22 | name="userBJID" |
22 | onChange={onChange} | 23 | onChange={onChange} |
23 | value={profile.userBJID} | 24 | value={profile.userBJID} |
24 | placeholder="백준 아이디" | 25 | placeholder="백준 아이디" |
25 | /> | 26 | /> |
26 | - <button type="submit" onSubmit={onBJIDSubmit}> | 27 | + <button type="submit">등록</button> |
27 | - 등록 | 28 | + </form> |
28 | - </button> | 29 | + <button onClick={onSyncBJIDSubmit}>동기화</button> |
29 | </BJIDFormBlock> | 30 | </BJIDFormBlock> |
30 | ); | 31 | ); |
31 | }; | 32 | }; | ... | ... |
... | @@ -33,8 +33,7 @@ const SectionContainer = styled.div` | ... | @@ -33,8 +33,7 @@ const SectionContainer = styled.div` |
33 | display: flex; | 33 | display: flex; |
34 | `; | 34 | `; |
35 | 35 | ||
36 | -const SettingForm = ({ onChange, onBJIDSubmit, profile }) => { | 36 | +const SettingForm = ({ onChange, onBJIDSubmit, profile, onSyncBJIDSubmit }) => { |
37 | - console.log(profile); | ||
38 | return ( | 37 | return ( |
39 | <SettingFormBlock> | 38 | <SettingFormBlock> |
40 | <SectionContainer> | 39 | <SectionContainer> |
... | @@ -47,6 +46,7 @@ const SettingForm = ({ onChange, onBJIDSubmit, profile }) => { | ... | @@ -47,6 +46,7 @@ const SettingForm = ({ onChange, onBJIDSubmit, profile }) => { |
47 | profile={profile} | 46 | profile={profile} |
48 | onChange={onChange} | 47 | onChange={onChange} |
49 | onBJIDSubmit={onBJIDSubmit} | 48 | onBJIDSubmit={onBJIDSubmit} |
49 | + onSyncBJIDSubmit={onSyncBJIDSubmit} | ||
50 | /> | 50 | /> |
51 | </SectionContainer> | 51 | </SectionContainer> |
52 | 52 | ... | ... |
1 | import React, { useEffect, useState } from 'react'; | 1 | import React, { useEffect, useState } from 'react'; |
2 | import { useDispatch, useSelector } from 'react-redux'; | 2 | import { useDispatch, useSelector } from 'react-redux'; |
3 | import { withRouter } from 'react-router-dom'; | 3 | import { withRouter } from 'react-router-dom'; |
4 | -import { changeField, setBJID } from '../../modules/profile'; | 4 | +import { |
5 | + changeField, | ||
6 | + setBJID, | ||
7 | + getPROFILE, | ||
8 | + syncBJID, | ||
9 | +} from '../../modules/profile'; | ||
5 | import SettingForm from '../../components/setting/SettingForm'; | 10 | import SettingForm from '../../components/setting/SettingForm'; |
11 | +import { sync } from '../../../node_modules/fast-glob/index'; | ||
6 | const SettingContainer = ({ history }) => { | 12 | const SettingContainer = ({ history }) => { |
7 | const dispatch = useDispatch(); | 13 | const dispatch = useDispatch(); |
8 | const [error, setError] = useState(null); | 14 | const [error, setError] = useState(null); |
... | @@ -21,16 +27,25 @@ const SettingContainer = ({ history }) => { | ... | @@ -21,16 +27,25 @@ const SettingContainer = ({ history }) => { |
21 | ); | 27 | ); |
22 | }; | 28 | }; |
23 | 29 | ||
30 | + const onSyncBJIDSubmit = (e) => { | ||
31 | + e.preventDefault(); | ||
32 | + let username = profile.username; | ||
33 | + dispatch(syncBJID({ username })); | ||
34 | + }; | ||
35 | + | ||
24 | const onBJIDSubmit = (e) => { | 36 | const onBJIDSubmit = (e) => { |
25 | e.preventDefault(); | 37 | e.preventDefault(); |
26 | let username = profile.username; | 38 | let username = profile.username; |
27 | let userBJID = profile.userBJID; | 39 | let userBJID = profile.userBJID; |
40 | + | ||
28 | dispatch(setBJID({ username, userBJID })); | 41 | dispatch(setBJID({ username, userBJID })); |
29 | }; | 42 | }; |
30 | 43 | ||
31 | useEffect(() => { | 44 | useEffect(() => { |
45 | + console.log('1'); | ||
46 | + let username = JSON.parse(user).username; | ||
47 | + dispatch(getPROFILE({ username })); | ||
32 | //Do Init Form | 48 | //Do Init Form |
33 | - console.log(profile); | ||
34 | }, [dispatch]); | 49 | }, [dispatch]); |
35 | 50 | ||
36 | return ( | 51 | return ( |
... | @@ -38,6 +53,7 @@ const SettingContainer = ({ history }) => { | ... | @@ -38,6 +53,7 @@ const SettingContainer = ({ history }) => { |
38 | type="setting" | 53 | type="setting" |
39 | onChange={onChange} | 54 | onChange={onChange} |
40 | onBJIDSubmit={onBJIDSubmit} | 55 | onBJIDSubmit={onBJIDSubmit} |
56 | + onSyncBJIDSubmit={onSyncBJIDSubmit} | ||
41 | profile={profile} | 57 | profile={profile} |
42 | ></SettingForm> | 58 | ></SettingForm> |
43 | ); | 59 | ); | ... | ... |
1 | import client from './client'; | 1 | import client from './client'; |
2 | 2 | ||
3 | -export const setBJID = ({ username, BJID }) => | 3 | +export const setBJID = ({ username, userBJID }) => |
4 | - client.post('api/profile/setprofile', { username, BJID }); | 4 | + client.post('api/profile/setprofile', { |
5 | + username: username, | ||
6 | + userBJID: userBJID, | ||
7 | + }); | ||
8 | + | ||
9 | +export const getPROFILE = ({ username }) => | ||
10 | + client.post('api/profile/getprofile', { username }); | ||
11 | + | ||
12 | +export const syncBJ = ({ username }) => | ||
13 | + client.patch('api/profile/syncBJ', { username }); | ... | ... |
... | @@ -8,14 +8,27 @@ import { takeLatest } from 'redux-saga/effects'; | ... | @@ -8,14 +8,27 @@ import { takeLatest } from 'redux-saga/effects'; |
8 | 8 | ||
9 | const INITIALIZE = 'profile/INITIALIZE'; | 9 | const INITIALIZE = 'profile/INITIALIZE'; |
10 | const CHANGE_FIELD = 'profile/CHANGE_FIELD'; | 10 | const CHANGE_FIELD = 'profile/CHANGE_FIELD'; |
11 | - | ||
12 | const [SET_BJID, SET_BJID_SUCCESS, SET_BJID_FAILURE] = createRequestActionTypes( | 11 | const [SET_BJID, SET_BJID_SUCCESS, SET_BJID_FAILURE] = createRequestActionTypes( |
13 | 'profile/SET_BJID', | 12 | 'profile/SET_BJID', |
14 | ); | 13 | ); |
14 | +const [ | ||
15 | + GET_PROFILE, | ||
16 | + GET_PROFILE_SUCCESS, | ||
17 | + GET_PROFILE_FAILURE, | ||
18 | +] = createRequestActionTypes('profile/GET_PROFILE'); | ||
19 | + | ||
20 | +const [ | ||
21 | + SYNC_BJID, | ||
22 | + SYNC_BJID_SUCCESS, | ||
23 | + SYNC_BJID_FAILURE, | ||
24 | +] = createRequestActionTypes('profile/SYNC_BJID'); | ||
15 | 25 | ||
16 | -export const setBJID = createAction(SET_BJID, ({ username, BJID }) => ({ | 26 | +export const syncBJID = createAction(SYNC_BJID, ({ username }) => ({ |
27 | + username, | ||
28 | +})); | ||
29 | +export const setBJID = createAction(SET_BJID, ({ username, userBJID }) => ({ | ||
17 | username, | 30 | username, |
18 | - BJID, | 31 | + userBJID, |
19 | })); | 32 | })); |
20 | 33 | ||
21 | export const changeField = createAction(CHANGE_FIELD, ({ key, value }) => ({ | 34 | export const changeField = createAction(CHANGE_FIELD, ({ key, value }) => ({ |
... | @@ -23,17 +36,23 @@ export const changeField = createAction(CHANGE_FIELD, ({ key, value }) => ({ | ... | @@ -23,17 +36,23 @@ export const changeField = createAction(CHANGE_FIELD, ({ key, value }) => ({ |
23 | value, | 36 | value, |
24 | })); | 37 | })); |
25 | 38 | ||
39 | +export const getPROFILE = createAction(GET_PROFILE, ({ username }) => ({ | ||
40 | + username, | ||
41 | +})); | ||
26 | const initialState = { | 42 | const initialState = { |
27 | username: '', | 43 | username: '', |
28 | userBJID: '', | 44 | userBJID: '', |
29 | solvedBJ: '', | 45 | solvedBJ: '', |
30 | friendList: [], | 46 | friendList: [], |
31 | - BJIDError: '', | 47 | + profileError: '', |
32 | }; | 48 | }; |
33 | - | 49 | +const getPROFILESaga = createRequestSaga(GET_PROFILE, profileAPI.getPROFILE); |
34 | const setBJIDSaga = createRequestSaga(SET_BJID, profileAPI.setBJID); | 50 | const setBJIDSaga = createRequestSaga(SET_BJID, profileAPI.setBJID); |
51 | +const syncBJIDSaga = createRequestSaga(SYNC_BJID, profileAPI.syncBJ); | ||
35 | export function* profileSaga() { | 52 | export function* profileSaga() { |
36 | yield takeLatest(SET_BJID, setBJIDSaga); | 53 | yield takeLatest(SET_BJID, setBJIDSaga); |
54 | + yield takeLatest(GET_PROFILE, getPROFILESaga); | ||
55 | + yield takeLatest(SYNC_BJID, syncBJIDSaga); | ||
37 | } | 56 | } |
38 | 57 | ||
39 | export default handleActions( | 58 | export default handleActions( |
... | @@ -43,15 +62,39 @@ export default handleActions( | ... | @@ -43,15 +62,39 @@ export default handleActions( |
43 | produce(state, (draft) => { | 62 | produce(state, (draft) => { |
44 | draft[key] = value; | 63 | draft[key] = value; |
45 | }), | 64 | }), |
65 | + [GET_PROFILE_SUCCESS]: ( | ||
66 | + state, | ||
67 | + { payload: { username, userBJID, solvedBJ, friendList } }, | ||
68 | + ) => ({ | ||
69 | + ...state, | ||
70 | + username: username, | ||
71 | + userBJID: userBJID, | ||
72 | + solvedBJ: solvedBJ, | ||
73 | + friendList: friendList, | ||
74 | + profileError: null, | ||
75 | + }), | ||
76 | + [GET_PROFILE_FAILURE]: (state, { payload: error }) => ({ | ||
77 | + ...state, | ||
78 | + profileError: error, | ||
79 | + }), | ||
46 | 80 | ||
47 | - [SET_BJID_SUCCESS]: (state, { payload: BJID }) => ({ | 81 | + [SET_BJID_SUCCESS]: (state, { payload: { userBJID } }) => ({ |
48 | ...state, | 82 | ...state, |
49 | - BJID, | 83 | + userBJID: userBJID, |
50 | - BJIDError: null, | 84 | + profileError: null, |
51 | }), | 85 | }), |
52 | [SET_BJID_FAILURE]: (state, { payload: error }) => ({ | 86 | [SET_BJID_FAILURE]: (state, { payload: error }) => ({ |
53 | ...state, | 87 | ...state, |
54 | - BJIDError: error, | 88 | + profileError: error, |
89 | + }), | ||
90 | + [SYNC_BJID_SUCCESS]: (state, { payload: { solvedBJ } }) => ({ | ||
91 | + ...state, | ||
92 | + solvedBJ, | ||
93 | + profileError: null, | ||
94 | + }), | ||
95 | + [SYNC_BJID_FAILURE]: (state, { payload: error }) => ({ | ||
96 | + ...state, | ||
97 | + profileError: error, | ||
55 | }), | 98 | }), |
56 | }, | 99 | }, |
57 | initialState, | 100 | initialState, | ... | ... |
... | @@ -19,7 +19,7 @@ | ... | @@ -19,7 +19,7 @@ |
19 | ## API Table | 19 | ## API Table |
20 | 20 | ||
21 | | group | description | method | URL | Detail | Auth | | 21 | | group | description | method | URL | Detail | Auth | |
22 | -| ------- | --------------------------- | ------ | ------------------------ | -------- | --------- | | 22 | +| ------- | --------------------------- | --------- | ------------------------ | -------- | --------- | |
23 | | user | 유저 등록 | POST | api/user | 바로가기 | JWT Token | | 23 | | user | 유저 등록 | POST | api/user | 바로가기 | JWT Token | |
24 | | user | 유저 삭제 | DELETE | api/user:id | 바로가기 | JWT Token | | 24 | | user | 유저 삭제 | DELETE | api/user:id | 바로가기 | JWT Token | |
25 | | user | 특정 유저 조회 | GET | api/user:id | 바로가기 | None | | 25 | | user | 특정 유저 조회 | GET | api/user:id | 바로가기 | None | |
... | @@ -29,8 +29,10 @@ | ... | @@ -29,8 +29,10 @@ |
29 | | profile | 유저가 푼 문제 조회(백준) | GET | api/profile/solvedBJ:id | 바로가기 | None | | 29 | | profile | 유저가 푼 문제 조회(백준) | GET | api/profile/solvedBJ:id | 바로가기 | None | |
30 | | profile | 유저가 푼 문제 동기화(백준) | PATCH | api/profile/syncBJ | 바로가기 | None | | 30 | | profile | 유저가 푼 문제 동기화(백준) | PATCH | api/profile/syncBJ | 바로가기 | None | |
31 | | profile | 유저 정보 수정 | POST | api/profile/setprofile | 바로가기 | JWT TOKEN | | 31 | | profile | 유저 정보 수정 | POST | api/profile/setprofile | 바로가기 | JWT TOKEN | |
32 | +| profile | 유저 정보 받아오기 | POST | api/profile/getprofile | 바로가기 | JWT | | ||
32 | | profile | 추천 문제 조회 | GET | api/profile/recommend:id | 바로가기 | None | | 33 | | profile | 추천 문제 조회 | GET | api/profile/recommend:id | 바로가기 | None | |
33 | -| notify | 슬랙 메시지 전송 요청 | POST | api/notify/slack | 바로가기 | Jwt Token | | 34 | +| notify | 슬랙 메시지 전송 요청 | POST | api/notify/ | |
35 | +| slack | 바로가기 | Jwt Token | | ||
34 | | auth | 로그인 | POST | api/auth/login | 바로가기 | None | | 36 | | auth | 로그인 | POST | api/auth/login | 바로가기 | None | |
35 | | auth | 로그아웃 | POST | api/auth/logout | 바로가기 | JWT Token | | 37 | | auth | 로그아웃 | POST | api/auth/logout | 바로가기 | JWT Token | |
36 | | auth | 회원가입 | POST | api/auth/register | 바로가기 | None | | 38 | | auth | 회원가입 | POST | api/auth/register | 바로가기 | None | | ... | ... |
... | @@ -88,7 +88,6 @@ exports.login = async (ctx) => { | ... | @@ -88,7 +88,6 @@ exports.login = async (ctx) => { |
88 | GET api/auth/check | 88 | GET api/auth/check |
89 | */ | 89 | */ |
90 | exports.check = async (ctx) => { | 90 | exports.check = async (ctx) => { |
91 | - console.log(ctx.state); | ||
92 | const { user } = ctx.state; | 91 | const { user } = ctx.state; |
93 | if (!user) { | 92 | if (!user) { |
94 | ctx.status = 401; | 93 | ctx.status = 401; | ... | ... |
... | @@ -7,4 +7,5 @@ profile.get("/solvednum:id"); | ... | @@ -7,4 +7,5 @@ profile.get("/solvednum:id"); |
7 | profile.get("/recommendps:id"); | 7 | profile.get("/recommendps:id"); |
8 | profile.patch("/syncBJ", profileCtrl.syncBJ); | 8 | profile.patch("/syncBJ", profileCtrl.syncBJ); |
9 | profile.post("/setprofile", profileCtrl.setProfile); | 9 | profile.post("/setprofile", profileCtrl.setProfile); |
10 | +profile.post("/getprofile", profileCtrl.getProfile); | ||
10 | module.exports = profile; | 11 | module.exports = profile; | ... | ... |
... | @@ -13,6 +13,24 @@ exports.checkObjectId = (ctx, next) => { | ... | @@ -13,6 +13,24 @@ exports.checkObjectId = (ctx, next) => { |
13 | } | 13 | } |
14 | return next(); | 14 | return next(); |
15 | }; | 15 | }; |
16 | +/*POST /api/profile/getprofile | ||
17 | +{ | ||
18 | + username: "username" | ||
19 | +} | ||
20 | +*/ | ||
21 | +exports.getProfile = async (ctx) => { | ||
22 | + try { | ||
23 | + const { username } = ctx.request.body; | ||
24 | + const profile = await Profile.findByUsername(username); | ||
25 | + if (!profile) { | ||
26 | + ctx.status = 401; | ||
27 | + return; | ||
28 | + } | ||
29 | + ctx.body = profile; | ||
30 | + } catch (e) { | ||
31 | + ctx.throw(500, e); | ||
32 | + } | ||
33 | +}; | ||
16 | /* | 34 | /* |
17 | POST /api/proflie/setprofile | 35 | POST /api/proflie/setprofile |
18 | { | 36 | { | ... | ... |
... | @@ -3,14 +3,11 @@ const User = require("../models/user"); | ... | @@ -3,14 +3,11 @@ const User = require("../models/user"); |
3 | 3 | ||
4 | const jwtMiddleware = async (ctx, next) => { | 4 | const jwtMiddleware = async (ctx, next) => { |
5 | const token = ctx.cookies.get("access_token"); | 5 | const token = ctx.cookies.get("access_token"); |
6 | - console.log("1"); | 6 | + |
7 | - console.log(token); | ||
8 | if (!token) { | 7 | if (!token) { |
9 | - console.log("1"); | ||
10 | return next(); | 8 | return next(); |
11 | } | 9 | } |
12 | try { | 10 | try { |
13 | - console.log("1"); | ||
14 | const decoded = jwt.verify(token, process.env.JWT_SECRET); | 11 | const decoded = jwt.verify(token, process.env.JWT_SECRET); |
15 | ctx.state.user = { | 12 | ctx.state.user = { |
16 | _id: decoded._id, | 13 | _id: decoded._id, |
... | @@ -25,7 +22,7 @@ const jwtMiddleware = async (ctx, next) => { | ... | @@ -25,7 +22,7 @@ const jwtMiddleware = async (ctx, next) => { |
25 | httpOnly: true, | 22 | httpOnly: true, |
26 | }); | 23 | }); |
27 | } | 24 | } |
28 | - console.log(decoded); | 25 | + |
29 | return next(); | 26 | return next(); |
30 | } catch (e) { | 27 | } catch (e) { |
31 | return next(); | 28 | return next(); | ... | ... |
-
Please register or login to post a comment