From 26bc7e35a5311b8c408c2571d0efc2e106f1a791 Mon Sep 17 00:00:00 2001 From: Skile Date: Wed, 19 Jun 2019 17:32:48 +0900 Subject: [PATCH 1/3] Add 'GetPayment' logic to RoomPage --- backend/src/dutch_broomstick/urls.py | 2 +- .../components/organisms/PaymentList/index.js | 4 +-- .../src/components/pages/RoomPage/index.js | 10 ++++-- frontend/src/containers/PaymentList.js | 2 +- frontend/src/containers/RoomPage.js | 2 +- frontend/src/store/payment/actions.js | 31 ++++++++++++++++++- frontend/src/store/payment/reducer.js | 24 ++++++++++++-- frontend/src/store/payment/sagas.js | 23 ++++++++++++-- frontend/src/store/room/sagas.js | 3 +- 9 files changed, 86 insertions(+), 15 deletions(-) diff --git a/backend/src/dutch_broomstick/urls.py b/backend/src/dutch_broomstick/urls.py index b7bea4e..ec44a6f 100644 --- a/backend/src/dutch_broomstick/urls.py +++ b/backend/src/dutch_broomstick/urls.py @@ -26,7 +26,7 @@ views.LayerDetailView.as_view()), # payment urls - path('rooms//layers//payments', + path('rooms//layers//payments/', views.PaymentCreateView.as_view()), path('rooms//layers//payments/', views.PaymentDetailView.as_view()), diff --git a/frontend/src/components/organisms/PaymentList/index.js b/frontend/src/components/organisms/PaymentList/index.js index 6f4e4aa..2d40c12 100644 --- a/frontend/src/components/organisms/PaymentList/index.js +++ b/frontend/src/components/organisms/PaymentList/index.js @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' import { Link } from 'react-router-dom' -import { Button, List, Block } from 'components' +import { Button, List, ListItem, Block } from 'components' const PaymentList = ({ paymentlist, roomurl }) => ( @@ -15,7 +15,7 @@ const PaymentList = ({ paymentlist, roomurl }) => ( { paymentlist && paymentlist.map( ({ forWhat, fromWho, total }, idx) => ( - + ) ) } diff --git a/frontend/src/components/pages/RoomPage/index.js b/frontend/src/components/pages/RoomPage/index.js index 5a7b4dc..c6fb203 100644 --- a/frontend/src/components/pages/RoomPage/index.js +++ b/frontend/src/components/pages/RoomPage/index.js @@ -7,15 +7,19 @@ import { getMemberDebtList, getSimplifiedGraph } from 'services/simplifier' import { Link } from 'react-router-dom' const RoomPage = props => { - const { room, members, showPayment, onClickMember, onToggle } = props + const { room, members, showPayment, payments, onClickMember, onToggle } = props if (!room) return Loading... - - // const graph = getSimplifiedGraph(getMemberDebtList(props.payments)) + const graph = { nodes: (members || []).map(m => ({ id: m.membername, label: m.membername })), edges: [], } + if (payments) { + const { edges } = getSimplifiedGraph(getMemberDebtList(payments)) + graph.edges = edges + } + const events = { selectNode(evt) { const nodeId = evt.nodes.find(() => true) diff --git a/frontend/src/containers/PaymentList.js b/frontend/src/containers/PaymentList.js index 42f4582..848325f 100644 --- a/frontend/src/containers/PaymentList.js +++ b/frontend/src/containers/PaymentList.js @@ -22,7 +22,7 @@ const PaymentListContainer = (props) => { const mapStateToProps = (state) => ({ username : state.user.username, roomname : state.room.room.roomname, - paymentlist : state.payment.paymentlist, + paymentlist : state.payment.payments, roomurl : state.room.room.url, }) diff --git a/frontend/src/containers/RoomPage.js b/frontend/src/containers/RoomPage.js index ad0f7c7..ab1cb63 100644 --- a/frontend/src/containers/RoomPage.js +++ b/frontend/src/containers/RoomPage.js @@ -33,7 +33,7 @@ const mapStateToProps = state => ({ room: state.room.room, member: state.room.member, members: state.member.members, - payments: state.room.payments, + payments: state.payment.payments, showPayment: state.room.showPayment, }) diff --git a/frontend/src/store/payment/actions.js b/frontend/src/store/payment/actions.js index 7565b75..acdb777 100644 --- a/frontend/src/store/payment/actions.js +++ b/frontend/src/store/payment/actions.js @@ -1,6 +1,7 @@ export const PAYMENT_CREATE_REQUEST = "PAYMENT_CREATE_REQUEST" export const PAYMENT_CREATE_SUCCESS = "PAYMENT_CREATE_SUCCESS" +export const PAYMENT_CREATE_FAILED = "PAYMENT_CREATE_FAILED" export const paymentCreateRequest = (room, payment) => ({ type: PAYMENT_CREATE_REQUEST, @@ -9,5 +10,33 @@ export const paymentCreateRequest = (room, payment) => ({ }) export const paymentCreateSuccess = (room, payment) => ({ - + type: PAYMENT_CREATE_SUCCESS, + room, + payment, +}) + +export const paymentCreateFailed = error => ({ + tpe: PAYMENT_CREATE_FAILED, + error, +}) + + +export const PAYMENT_GET_REQUEST = "PAYMENT_GET_REQUEST" +export const PAYMENT_GET_SUCCESS = "PAYMENT_GET_SUCCESS" +export const PAYMENT_GET_FAILED = "PAYMENT_GET_FAILED" + +export const paymentGetRequest = room => ({ + type: PAYMENT_GET_REQUEST, + room, +}) + +export const paymentGetSuccess = (room, payments) => ({ + type: PAYMENT_GET_SUCCESS, + room, + payments, +}) + +export const paymentGetFailed = error => ({ + type: PAYMENT_GET_FAILED, + error, }) diff --git a/frontend/src/store/payment/reducer.js b/frontend/src/store/payment/reducer.js index 44de6f7..ebfb661 100644 --- a/frontend/src/store/payment/reducer.js +++ b/frontend/src/store/payment/reducer.js @@ -1,6 +1,7 @@ import { - } from 'store/actions' -import { } from './actions'; + ROOM_LEAVE, +} from 'store/actions' +import * as actions from './actions'; const initialState = { //after simplify, if room -> individual, update a member's send or get datas @@ -11,10 +12,29 @@ import { } from './actions'; //if individual -> account, update a senddata and call data's member's account senddata : null, accounts : null, + + payments: null, // 방의 결제 정보 } const paymentReducer = (state = initialState, action) => { switch(action.type) { + case actions.PAYMENT_CREATE_SUCCESS: + return { + ...state, + payments: [ + ...(state.payments || []), + action.payment, + ] + } + case actions.PAYMENT_GET_SUCCESS: + return { + ...state, + payments: action.payments, + } + case ROOM_LEAVE: + return { + ...initialState, + } default: return state } diff --git a/frontend/src/store/payment/sagas.js b/frontend/src/store/payment/sagas.js index 30af91d..8284d13 100644 --- a/frontend/src/store/payment/sagas.js +++ b/frontend/src/store/payment/sagas.js @@ -5,9 +5,10 @@ import * as actions from './actions' function* createRequest({ room, payment }) { try { - yield api.post(`/rooms/${room.url}/layers/0/payments`, { ...payment }) + const newPayment = yield api.post(`/rooms/${room.url}/layers/0/payments/`, { ...payment }) + yield put(actions.paymentCreateSuccess(room, newPayment)) } catch(e) { - console.log(e) + yield put(actions.paymentCreateFailed(yield e.response.json())) } } @@ -15,6 +16,22 @@ function* watchPaymentCreateRequest() { yield takeEvery(actions.PAYMENT_CREATE_REQUEST, createRequest) } + +function* getRequest({ room, }) { + try { + const payments = yield api.get(`/rooms/${room.url}/layers/0/payments/`) + yield put(actions.paymentGetSuccess(room, payments)) + } catch(e) { + yield put(actions.paymentGetFailed(yield e.response.json())) + } +} + +function* watchPaymentGetRequest() { + yield takeEvery(actions.PAYMENT_GET_REQUEST, getRequest) +} + + export default function* () { yield fork(watchPaymentCreateRequest) -} \ No newline at end of file + yield fork(watchPaymentGetRequest) +} diff --git a/frontend/src/store/room/sagas.js b/frontend/src/store/room/sagas.js index 722ea52..2e92846 100644 --- a/frontend/src/store/room/sagas.js +++ b/frontend/src/store/room/sagas.js @@ -7,7 +7,7 @@ import api from 'services/api' */ import * as actions from './actions' -import { memberGetRequest } from 'store/actions' +import { memberGetRequest, paymentGetRequest } from 'store/actions' /* Room Create Request */ @@ -57,6 +57,7 @@ function* getRequest({ url }) { const room = yield api.get(`/rooms/${url}/`) yield put(actions.roomGetSuccess(room)) yield put(memberGetRequest(url)) + yield put(paymentGetRequest(room)) } catch(e) { yield put(actions.roomGetFailed(e)) } From fdf1c421bbbab382aae1dd02d39891a1639eaeab Mon Sep 17 00:00:00 2001 From: Skile Date: Wed, 19 Jun 2019 17:43:50 +0900 Subject: [PATCH 2/3] Resolve Test --- backend/src/dutch_broomstick/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/dutch_broomstick/tests.py b/backend/src/dutch_broomstick/tests.py index d019d35..aaefb1e 100644 --- a/backend/src/dutch_broomstick/tests.py +++ b/backend/src/dutch_broomstick/tests.py @@ -151,7 +151,7 @@ def test_create_payment(self): # Payment 생성 요청 response = self.client.post( - f"/api/rooms/{room_json.get('url')}/layers/0/payments", + f"/api/rooms/{room_json.get('url')}/layers/0/payments/", { 'fromWho': 'test1', 'forWhat': "고깃집", From c32cdc339af8762612a09181358494626d32bc4f Mon Sep 17 00:00:00 2001 From: Skile Date: Wed, 19 Jun 2019 18:08:44 +0900 Subject: [PATCH 3/3] Update roomSetMember actions to accept sendlist/getlist --- frontend/src/components/pages/RoomPage/index.js | 7 ++++++- frontend/src/containers/RoomPage.js | 4 +++- frontend/src/store/payment/reducer.js | 7 +++++++ frontend/src/store/room/actions.js | 4 +++- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/pages/RoomPage/index.js b/frontend/src/components/pages/RoomPage/index.js index c6fb203..df8b3e3 100644 --- a/frontend/src/components/pages/RoomPage/index.js +++ b/frontend/src/components/pages/RoomPage/index.js @@ -23,7 +23,12 @@ const RoomPage = props => { const events = { selectNode(evt) { const nodeId = evt.nodes.find(() => true) - onClickMember(members.find(m => m.membername === nodeId)) + const member = members.find(m => m.membername === nodeId) + onClickMember( + member, + graph.edges.filter(({from}) => from === nodeId), + graph.edges.filter(({to}) => to === nodeId), + ) } } diff --git a/frontend/src/containers/RoomPage.js b/frontend/src/containers/RoomPage.js index ab1cb63..e927caf 100644 --- a/frontend/src/containers/RoomPage.js +++ b/frontend/src/containers/RoomPage.js @@ -40,7 +40,9 @@ const mapStateToProps = state => ({ const mapDispatchToProps = dispatch => ({ onGetRoom: (url) => dispatch(roomGetRequest(url)), onLeave: () => dispatch(roomLeave()), - onClickMember: member => dispatch(roomSetMember(member)), + onClickMember: (member, sendlist, getlist) => { + dispatch(roomSetMember(member, sendlist, getlist)) + }, onToggle: () => dispatch(roomToggleContents()), }) diff --git a/frontend/src/store/payment/reducer.js b/frontend/src/store/payment/reducer.js index ebfb661..06b6803 100644 --- a/frontend/src/store/payment/reducer.js +++ b/frontend/src/store/payment/reducer.js @@ -1,5 +1,6 @@ import { ROOM_LEAVE, + ROOM_SET_MEMBER, } from 'store/actions' import * as actions from './actions'; @@ -35,6 +36,12 @@ import * as actions from './actions'; return { ...initialState, } + case ROOM_SET_MEMBER: + return { + ...state, + sendlist: action.sendlist, + getlist: action.getlist, + } default: return state } diff --git a/frontend/src/store/room/actions.js b/frontend/src/store/room/actions.js index ecc3ede..e1b2464 100644 --- a/frontend/src/store/room/actions.js +++ b/frontend/src/store/room/actions.js @@ -89,9 +89,11 @@ export const roomLeave = () => ({ type: ROOM_LEAVE }) export const ROOM_SET_MEMBER = "ROOM_SET_MEMBER" -export const roomSetMember = member => ({ +export const roomSetMember = (member, sendlist, getlist) => ({ type: ROOM_SET_MEMBER, member, + sendlist, + getlist, })