Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

- Added product remove from stock after success pay. #103

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions backend/controllers/productController.js
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,25 @@ const updateProduct = asyncHandler(async (req, res) => {
}
})

// @desc Update a product
// @route PUT /api/products/:id
// @access Private/Admin
const updateProductStock = asyncHandler(async (req, res) => {
const { countInStock } = req.body

const product = await Product.findById(req.params.id)

if (product) {
product.countInStock = countInStock

const updatedProductStock = await product.save()
res.json(updatedProductStock)
} else {
res.status(404)
throw new Error('Product not found')
}
})

// @desc Create new review
// @route POST /api/products/:id/reviews
// @access Private
Expand Down Expand Up @@ -163,6 +182,7 @@ export {
deleteProduct,
createProduct,
updateProduct,
updateProductStock,
createProductReview,
getTopProducts,
}
1 change: 1 addition & 0 deletions backend/models/orderModel.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const orderSchema = mongoose.Schema(
qty: { type: Number, required: true },
image: { type: String, required: true },
price: { type: Number, required: true },
countInStock: { type: Number, required: true },
product: {
type: mongoose.Schema.Types.ObjectId,
required: true,
Expand Down
3 changes: 3 additions & 0 deletions backend/routes/productRoutes.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
deleteProduct,
createProduct,
updateProduct,
updateProductStock,
createProductReview,
getTopProducts,
} from '../controllers/productController.js'
Expand All @@ -19,5 +20,7 @@ router
.get(getProductById)
.delete(protect, admin, deleteProduct)
.put(protect, admin, updateProduct)
router.route('/:id/updatestock').put(protect, updateProductStock)
router.route('/:id/stock').put(protect, updateProductStock)

export default router
12 changes: 6 additions & 6 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 0 additions & 6 deletions frontend/src/actions/orderActions.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import axios from 'axios'
import { CART_CLEAR_ITEMS } from '../constants/cartConstants'
import {
ORDER_CREATE_REQUEST,
ORDER_CREATE_SUCCESS,
Expand Down Expand Up @@ -45,11 +44,6 @@ export const createOrder = (order) => async (dispatch, getState) => {
type: ORDER_CREATE_SUCCESS,
payload: data,
})
dispatch({
type: CART_CLEAR_ITEMS,
payload: data,
})
localStorage.removeItem('cartItems')
} catch (error) {
const message =
error.response && error.response.data.message
Expand Down
41 changes: 41 additions & 0 deletions frontend/src/actions/productActions.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ import {
PRODUCT_TOP_REQUEST,
PRODUCT_TOP_SUCCESS,
PRODUCT_TOP_FAIL,
PRODUCT_UPDATE_STOCK_REQUEST,
PRODUCT_UPDATE_STOCK_SUCCESS,
PRODUCT_UPDATE_STOCK_FAIL,
} from '../constants/productConstants'
import { logout } from './userActions'

Expand Down Expand Up @@ -186,6 +189,44 @@ export const updateProduct = (product) => async (dispatch, getState) => {
}
}

export const updateProductStock = (product) => async (dispatch, getState) => {
try {
dispatch({
type: PRODUCT_UPDATE_STOCK_REQUEST,
})

const {
userLogin: { userInfo },
} = getState()

const config = {
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${userInfo.token}`,
},
}

const { data } = await axios.put(
`/api/products/${product._id}/stock`,
product,
config
)

dispatch({
type: PRODUCT_UPDATE_STOCK_SUCCESS,
payload: data,
})
} catch (error) {
dispatch({
type: PRODUCT_UPDATE_STOCK_FAIL,
payload:
error.response && error.response.data.message
? error.response.data.message
: error.message,
})
}
}

export const createProductReview = (productId, review) => async (
dispatch,
getState
Expand Down
1 change: 0 additions & 1 deletion frontend/src/constants/cartConstants.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
export const CART_ADD_ITEM = 'CART_ADD_ITEM'
export const CART_CLEAR_ITEMS = 'CART_RESET'
export const CART_REMOVE_ITEM = 'CART_REMOVE_ITEM'
export const CART_SAVE_SHIPPING_ADDRESS = 'CART_SAVE_SHIPPING_ADDRESS'
export const CART_SAVE_PAYMENT_METHOD = 'CART_SAVE_PAYMENT_METHOD'
5 changes: 5 additions & 0 deletions frontend/src/constants/productConstants.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ export const PRODUCT_UPDATE_SUCCESS = 'PRODUCT_UPDATE_SUCCESS'
export const PRODUCT_UPDATE_FAIL = 'PRODUCT_UPDATE_FAIL'
export const PRODUCT_UPDATE_RESET = 'PRODUCT_UPDATE_RESET'

export const PRODUCT_UPDATE_STOCK_REQUEST = 'PRODUCT_UPDATE_STOCK_REQUEST'
export const PRODUCT_UPDATE_STOCK_SUCCESS = 'PRODUCT_UPDATE_STOCK_SUCCESS'
export const PRODUCT_UPDATE_STOCK_FAIL = 'PRODUCT_UPDATE_STOCK_FAIL'
export const PRODUCT_UPDATE_STOCK_RESET = 'PRODUCT_UPDATE_STOCK_RESET'

export const PRODUCT_CREATE_REVIEW_REQUEST = 'PRODUCT_CREATE_REVIEW_REQUEST'
export const PRODUCT_CREATE_REVIEW_SUCCESS = 'PRODUCT_CREATE_REVIEW_SUCCESS'
export const PRODUCT_CREATE_REVIEW_FAIL = 'PRODUCT_CREATE_REVIEW_FAIL'
Expand Down
6 changes: 0 additions & 6 deletions frontend/src/reducers/cartReducers.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import {
CART_REMOVE_ITEM,
CART_SAVE_SHIPPING_ADDRESS,
CART_SAVE_PAYMENT_METHOD,
CART_CLEAR_ITEMS,
} from '../constants/cartConstants'

export const cartReducer = (
Expand Down Expand Up @@ -44,11 +43,6 @@ export const cartReducer = (
...state,
paymentMethod: action.payload,
}
case CART_CLEAR_ITEMS:
return {
...state,
cartItems: [],
}
default:
return state
}
Expand Down
21 changes: 20 additions & 1 deletion frontend/src/reducers/productReducers.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ import {
PRODUCT_TOP_REQUEST,
PRODUCT_TOP_SUCCESS,
PRODUCT_TOP_FAIL,
PRODUCT_UPDATE_STOCK_REQUEST,
PRODUCT_UPDATE_STOCK_SUCCESS,
PRODUCT_UPDATE_STOCK_FAIL,
PRODUCT_UPDATE_STOCK_RESET,
} from '../constants/productConstants'

export const productListReducer = (state = { products: [] }, action) => {
Expand Down Expand Up @@ -87,7 +91,7 @@ export const productCreateReducer = (state = {}, action) => {
}
}

export const productUpdateReducer = (state = { product: {} }, action) => {
export const productUpdateStockReducer = (state = { product: {} }, action) => {
switch (action.type) {
case PRODUCT_UPDATE_REQUEST:
return { loading: true }
Expand All @@ -102,6 +106,21 @@ export const productUpdateReducer = (state = { product: {} }, action) => {
}
}

export const productUpdateReducer = (state = { product: {} }, action) => {
switch (action.type) {
case PRODUCT_UPDATE_STOCK_REQUEST:
return { loading: true }
case PRODUCT_UPDATE_STOCK_SUCCESS:
return { loading: false, success: true, product: action.payload }
case PRODUCT_UPDATE_STOCK_FAIL:
return { loading: false, error: action.payload }
case PRODUCT_UPDATE_STOCK_RESET:
return { product: {} }
default:
return state
}
}

export const productReviewCreateReducer = (state = {}, action) => {
switch (action.type) {
case PRODUCT_CREATE_REVIEW_REQUEST:
Expand Down
54 changes: 53 additions & 1 deletion frontend/src/screens/OrderScreen.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@ import {
import {
ORDER_PAY_RESET,
ORDER_DELIVER_RESET,
ORDER_LIST_MY_RESET,
} from '../constants/orderConstants'
import { PRODUCT_UPDATE_STOCK_RESET } from '../constants/productConstants'
import { removeFromCart } from '../actions/cartActions'
import { updateProductStock } from '../actions/productActions'

const OrderScreen = ({ match, history }) => {
const orderId = match.params.id
Expand All @@ -23,6 +27,16 @@ const OrderScreen = ({ match, history }) => {

const dispatch = useDispatch()

const cart = useSelector((state) => state.cart)
const { cartItems } = cart

// console.log(cartItems);

const [countInStock, setCountInStock] = useState(0)

const productUpdateStock = useSelector((state) => state.productUpdateStock)
const { success: successStockUpdate } = productUpdateStock

const orderDetails = useSelector((state) => state.orderDetails)
const { order, loading, error } = orderDetails

Expand Down Expand Up @@ -74,7 +88,45 @@ const OrderScreen = ({ match, history }) => {
setSdkReady(true)
}
}
}, [dispatch, orderId, successPay, successDeliver, order])

if (successStockUpdate) {
console.log('PRODUCT_UPDATE_STOCK_RESET')
dispatch({ type: PRODUCT_UPDATE_STOCK_RESET })
}

if (order && successPay) {
console.log('sale del loop')
order.orderItems.forEach((item, i) => {
console.log(
`countinstock: ${cartItems[i].countInStock}
-
qty: ${item.qty}
Equals: ${cartItems[i].countInStock - item.qty}`
)
const updatedStock = cartItems[i].countInStock - item.qty
setCountInStock(cartItems[i].countInStock - item.qty)
dispatch(
updateProductStock({
_id: item.product,
countInStock: updatedStock,
})
)
dispatch(removeFromCart(item.product))
})
dispatch({ type: ORDER_LIST_MY_RESET })
}
}, [
history,
userInfo,
dispatch,
orderId,
successPay,
successDeliver,
order,
cartItems,
countInStock,
successStockUpdate,
])

const successPaymentHandler = (paymentResult) => {
console.log(paymentResult)
Expand Down
16 changes: 13 additions & 3 deletions frontend/src/screens/ProductScreen.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ import {
listProductDetails,
createProductReview,
} from '../actions/productActions'
import { PRODUCT_CREATE_REVIEW_RESET } from '../constants/productConstants'
import {
PRODUCT_CREATE_REVIEW_RESET,
PRODUCT_UPDATE_STOCK_RESET,
} from '../constants/productConstants'

const ProductScreen = ({ history, match }) => {
const [qty, setQty] = useState(1)
Expand All @@ -19,6 +22,9 @@ const ProductScreen = ({ history, match }) => {

const dispatch = useDispatch()

const productUpdateStock = useSelector((state) => state.productUpdateStock)
const { success: successStockUpdate } = productUpdateStock

const productDetails = useSelector((state) => state.productDetails)
const { loading, error, product } = productDetails

Expand All @@ -33,15 +39,19 @@ const ProductScreen = ({ history, match }) => {
} = productReviewCreate

useEffect(() => {
if (successStockUpdate) {
dispatch({ type: PRODUCT_UPDATE_STOCK_RESET })
}

if (successProductReview) {
setRating(0)
setComment('')
}
if (!product._id || product._id !== match.params.id) {
dispatch(listProductDetails(match.params.id))
dispatch({ type: PRODUCT_CREATE_REVIEW_RESET })
}
}, [dispatch, match, successProductReview])
dispatch(listProductDetails(match.params.id))
}, [dispatch, match, successProductReview, product._id, successStockUpdate])

const addToCartHandler = () => {
history.push(`/cart/${match.params.id}?qty=${qty}`)
Expand Down
2 changes: 2 additions & 0 deletions frontend/src/store.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
productDeleteReducer,
productCreateReducer,
productUpdateReducer,
productUpdateStockReducer,
productReviewCreateReducer,
productTopRatedReducer,
} from './reducers/productReducers'
Expand Down Expand Up @@ -35,6 +36,7 @@ const reducer = combineReducers({
productDelete: productDeleteReducer,
productCreate: productCreateReducer,
productUpdate: productUpdateReducer,
productUpdateStock: productUpdateStockReducer,
productReviewCreate: productReviewCreateReducer,
productTopRated: productTopRatedReducer,
cart: cartReducer,
Expand Down
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading