Skip to content

Commit fc7808a

Browse files
authored
Video-39-Delete-Product (#39)
1 parent 06a5711 commit fc7808a

3 files changed

Lines changed: 51 additions & 1 deletion

File tree

backend/routers/productRouter.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,19 @@ productRouter.put(
6767
}
6868
})
6969
);
70+
productRouter.delete(
71+
'/:id',
72+
isAuth,
73+
isAdmin,
74+
expressAysncHandler(async (req, res) => {
75+
const product = await Product.findById(req.params.id);
76+
if (product) {
77+
const deletedProduct = await product.remove();
78+
res.send({ message: 'Product Deleted', product: deletedProduct });
79+
} else {
80+
res.status(404).send({ message: 'Product Not Found' });
81+
}
82+
})
83+
);
84+
7085
export default productRouter;

frontend/src/api.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,25 @@ export const createProduct = async () => {
5858
return { error: err.response.data.message || err.message };
5959
}
6060
};
61+
export const deleteProduct = async (productId) => {
62+
try {
63+
const { token } = getUserInfo();
64+
const response = await axios({
65+
url: `${apiUrl}/api/products/${productId}`,
66+
method: 'DELETE',
67+
headers: {
68+
'Content-Type': 'application/json',
69+
Authorization: `Bearer ${token}`,
70+
},
71+
});
72+
if (response.statusText !== 'OK') {
73+
throw new Error(response.data.message);
74+
}
75+
return response.data;
76+
} catch (err) {
77+
return { error: err.response.data.message || err.message };
78+
}
79+
};
6180

6281
export const updateProduct = async (product) => {
6382
try {

frontend/src/srceens/ProductListScreen.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import DashboardMenu from '../components/DashboardMenu';
2-
import { getProducts, createProduct } from '../api';
2+
import { getProducts, createProduct, deleteProduct } from '../api';
3+
import { showLoading, hideLoading, rerender, showMessage } from '../utils';
34

45
const ProductListScreen = {
56
after_render: () => {
@@ -15,6 +16,21 @@ const ProductListScreen = {
1516
document.location.hash = `/product/${editButton.id}/edit`;
1617
});
1718
});
19+
const deleteButtons = document.getElementsByClassName('delete-button');
20+
Array.from(deleteButtons).forEach((deleteButton) => {
21+
deleteButton.addEventListener('click', async () => {
22+
if (confirm('Are you sure to delete this product?')) {
23+
showLoading();
24+
const data = await deleteProduct(deleteButton.id);
25+
if (data.error) {
26+
showMessage(data.error);
27+
} else {
28+
rerender(ProductListScreen);
29+
}
30+
hideLoading();
31+
}
32+
});
33+
});
1834
},
1935
render: async () => {
2036
const products = await getProducts();

0 commit comments

Comments
 (0)