From 765992a8da2de687ba501bd9e2d88dff3fa8c106 Mon Sep 17 00:00:00 2001 From: Mallik Date: Mon, 15 Feb 2021 19:28:38 -0600 Subject: [PATCH 1/5] Create endpoints for editing categories --- api/src/api/admin.js | 18 ++++++++++++++ client/src/utils/api.js | 52 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/api/src/api/admin.js b/api/src/api/admin.js index c376414a..d7c3271e 100644 --- a/api/src/api/admin.js +++ b/api/src/api/admin.js @@ -166,6 +166,24 @@ router.post( }), ); +// Edit an existing category +router.put( + '/categories/:id', + errorWrap(async (req, res) => { + const { id } = req.params; + const updatedCategory = await Category.findByIdAndUpdate(id, req.body, { + new: true, + runValidators: true, + }); + res.json({ + code: 200, + message: `Successfully updated category ${id}`, + success: true, + result: updatedCategory, + }); + }), +); + // Delete a category router.delete( '/categories/:id', diff --git a/client/src/utils/api.js b/client/src/utils/api.js index 110a3445..68da4070 100644 --- a/client/src/utils/api.js +++ b/client/src/utils/api.js @@ -174,3 +174,55 @@ export const deleteResource = (id: string): ApiResponse => { }, ); }; + +export const addCategory = (category: Category): ApiResponse => + instance + .post('/api/admin/categories', category, { + headers: { + token: localStorage.getItem('token'), + }, + }) + .then( + (res) => res.data, + (err) => { + console.error(err); + return null; + }, + ); + +export const editCategory = ( + id: string, + category: Category, +): ApiResponse => { + const requestExtension = `/api/admin/categories/${id}`; + return instance + .put(requestExtension, category, { + headers: { + token: localStorage.getItem('token'), + }, + }) + .then( + (res) => res.data, + (err) => { + console.error(err); + return null; + }, + ); +}; + +export const deleteCategory = (id: string): ApiResponse => { + const requestExtension = `/api/admin/categories/${id}`; + return instance + .delete(requestExtension, { + headers: { + token: localStorage.getItem('token'), + }, + }) + .then( + (res) => res.data, + (err) => { + console.error(err); + return null; + }, + ); +}; \ No newline at end of file From 58dd71186ce2e06569327b087dd8f6d253f7ee60 Mon Sep 17 00:00:00 2001 From: Mallik Date: Fri, 19 Feb 2021 17:57:38 -0600 Subject: [PATCH 2/5] Update endpoints after dev night with Neha --- api/src/api/admin.js | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/api/src/api/admin.js b/api/src/api/admin.js index d7c3271e..31a74a29 100644 --- a/api/src/api/admin.js +++ b/api/src/api/admin.js @@ -166,7 +166,6 @@ router.post( }), ); -// Edit an existing category router.put( '/categories/:id', errorWrap(async (req, res) => { @@ -175,11 +174,20 @@ router.put( new: true, runValidators: true, }); + + const updatedResources = await Resource.updateMany( + { category: req.body.currentName }, + { $set: { 'category.$': req.body.newName } }, + ); + res.json({ code: 200, message: `Successfully updated category ${id}`, success: true, - result: updatedCategory, + result: { + updatedCategory, + updatedResources + } }); }), ); @@ -190,11 +198,17 @@ router.delete( errorWrap(async (req, res) => { const { id } = req.params; await Category.findByIdAndDelete(id); + + const updatedResources = await Resource.updateMany( + { category: req.body.currentName }, + { $pull: { 'category': req.body.currentName } }, + ); + res.json({ code: 200, message: `Successfully deleted category ${id}`, success: true, - result: null, + result: updatedResources, }); }), ); From b233b383aa3a721c03c3fc0128d90ca2af57cdd0 Mon Sep 17 00:00:00 2001 From: nehakonjeti Date: Mon, 22 Feb 2021 22:20:50 -0600 Subject: [PATCH 3/5] Add subcategory endpoints --- api/src/api/admin.js | 98 +++++++++++++++++++++++++++++++++++++++-- client/src/utils/api.js | 58 +++++++++++++++++++++++- 2 files changed, 152 insertions(+), 4 deletions(-) diff --git a/api/src/api/admin.js b/api/src/api/admin.js index 31a74a29..9b4b6a3f 100644 --- a/api/src/api/admin.js +++ b/api/src/api/admin.js @@ -186,8 +186,8 @@ router.put( success: true, result: { updatedCategory, - updatedResources - } + updatedResources, + }, }); }), ); @@ -201,7 +201,7 @@ router.delete( const updatedResources = await Resource.updateMany( { category: req.body.currentName }, - { $pull: { 'category': req.body.currentName } }, + { $pull: { category: req.body.currentName } }, ); res.json({ @@ -213,4 +213,96 @@ router.delete( }), ); +// Create a new subcategory +router.post( + '/subcategories/:id', + errorWrap(async (req, res) => { + const { id } = req.params; + const updatedCategory = await Category.findByIdAndUpdate( + id, + { $push: { subcategories: req.body.name } }, + { + new: true, + runValidators: true, + }, + ); + res.status(201).json({ + code: 201, + message: `Successfully created new category ${req.body.name}`, + success: true, + result: updatedCategory, + }); + }), +); + +// renaming subcategory +router.put( + '/subcategories/:id', + errorWrap(async (req, res) => { + const { id } = req.params; + + const updatedCategory = await Category.findOneAndUpdate( + { + _id: req.params.id, + subcategories: req.body.currentName, + }, + { + $set: { 'subcategories.$': req.body.newName }, + }, + { + new: true, + runValidators: true, + }, + ); + + const updatedResources = await Resource.updateMany( + { category: req.body.category, subcategory: req.body.currentName }, + { $set: { 'subcategory.$': req.body.newName } }, + ); + + res.json({ + code: 200, + message: `Successfully updated subcategory ${req.body.newName}`, + success: true, + result: { + updatedCategory, + updatedResources, + }, + }); + }), +); + +// Delete a subcategory +router.delete( + '/subcategories/:id', + errorWrap(async (req, res) => { + const { id } = req.params; + const updatedCategory = await Category.findByIdAndUpdate( + id, + { + $pull: { subcategories: req.body.subcategory }, + }, + { + new: true, + runValidators: true, + }, + ); + + const updatedResources = await Resource.updateMany( + { category: req.body.category, subcategory: req.body.subcategory }, + { $pull: { subcategory: req.body.subcategory } }, + ); + + res.json({ + code: 200, + message: `Successfully deleted category ${id}`, + success: true, + result: { + updatedCategory, + updatedResources, + }, + }); + }), +); + module.exports = router; diff --git a/client/src/utils/api.js b/client/src/utils/api.js index 68da4070..dd2f4646 100644 --- a/client/src/utils/api.js +++ b/client/src/utils/api.js @@ -8,7 +8,8 @@ import type { Category, HomePage, Resource } from '../types/models'; import type { ApiResponse } from '../types/apiResponse'; const instance = axios.create({ - baseURL: 'https://nawc-staging.vercel.app', + //baseURL: 'https://nawc-staging.vercel.app', + baseURL: 'http://localhost:9000', }); export const imageToLink = ( @@ -225,4 +226,59 @@ export const deleteCategory = (id: string): ApiResponse => { return null; }, ); +}; + +export const addSubcategory = ( + id: string, + category: Category +): ApiResponse => + instance + .post(`/api/admin/subcategories/${id}`, category, { + headers: { + token: localStorage.getItem('token'), + }, + }) + .then( + (res) => res.data, + (err) => { + console.error(err); + return null; + }, + ); + +export const editSubcategory = ( + id: string, + category: Category, +): ApiResponse => { + const requestExtension = `/api/admin/subcategories/${id}`; + return instance + .put(requestExtension, category, { + headers: { + token: localStorage.getItem('token'), + }, + }) + .then( + (res) => res.data, + (err) => { + console.error(err); + return null; + }, + ); +}; + +export const deleteSubcategory = (id: string): ApiResponse => { + const requestExtension = `/api/admin/subcategories/${id}`; + return instance + .delete(requestExtension, { + headers: { + token: localStorage.getItem('token'), + }, + }) + .then( + (res) => res.data, + (err) => { + console.error(err); + return null; + }, + ); }; \ No newline at end of file From 7e27fdf6321595c80091ec6df8bb589480bdc0cb Mon Sep 17 00:00:00 2001 From: nehakonjeti Date: Thu, 25 Feb 2021 21:25:25 -0600 Subject: [PATCH 4/5] Resolve Jackie's comments and fix linting errors --- api/src/api/admin.js | 34 ++++++++++++++++++---------------- client/src/utils/api.js | 37 +++++++++++++++++++++++-------------- 2 files changed, 41 insertions(+), 30 deletions(-) diff --git a/api/src/api/admin.js b/api/src/api/admin.js index 9b4b6a3f..d26232eb 100644 --- a/api/src/api/admin.js +++ b/api/src/api/admin.js @@ -166,16 +166,21 @@ router.post( }), ); +// Rename an existing category router.put( '/categories/:id', errorWrap(async (req, res) => { const { id } = req.params; - const updatedCategory = await Category.findByIdAndUpdate(id, req.body, { - new: true, - runValidators: true, - }); + const updatedCategory = await Category.findByIdAndUpdate( + id, + { $set: { name: req.body.newName } }, + { + new: true, + runValidators: true, + }, + ); - const updatedResources = await Resource.updateMany( + await Resource.updateMany( { category: req.body.currentName }, { $set: { 'category.$': req.body.newName } }, ); @@ -186,7 +191,6 @@ router.put( success: true, result: { updatedCategory, - updatedResources, }, }); }), @@ -199,16 +203,16 @@ router.delete( const { id } = req.params; await Category.findByIdAndDelete(id); - const updatedResources = await Resource.updateMany( - { category: req.body.currentName }, - { $pull: { category: req.body.currentName } }, + await Resource.updateMany( + { category: req.body.categoryName }, + { $pull: { category: req.body.categoryName } }, ); res.json({ code: 200, message: `Successfully deleted category ${id}`, success: true, - result: updatedResources, + result: null, }); }), ); @@ -228,14 +232,14 @@ router.post( ); res.status(201).json({ code: 201, - message: `Successfully created new category ${req.body.name}`, + message: `Successfully created new subcategory ${req.body.name}`, success: true, result: updatedCategory, }); }), ); -// renaming subcategory +// Rename an existing subcategory router.put( '/subcategories/:id', errorWrap(async (req, res) => { @@ -255,7 +259,7 @@ router.put( }, ); - const updatedResources = await Resource.updateMany( + await Resource.updateMany( { category: req.body.category, subcategory: req.body.currentName }, { $set: { 'subcategory.$': req.body.newName } }, ); @@ -266,7 +270,6 @@ router.put( success: true, result: { updatedCategory, - updatedResources, }, }); }), @@ -288,7 +291,7 @@ router.delete( }, ); - const updatedResources = await Resource.updateMany( + await Resource.updateMany( { category: req.body.category, subcategory: req.body.subcategory }, { $pull: { subcategory: req.body.subcategory } }, ); @@ -299,7 +302,6 @@ router.delete( success: true, result: { updatedCategory, - updatedResources, }, }); }), diff --git a/client/src/utils/api.js b/client/src/utils/api.js index dd2f4646..d909045a 100644 --- a/client/src/utils/api.js +++ b/client/src/utils/api.js @@ -8,8 +8,7 @@ import type { Category, HomePage, Resource } from '../types/models'; import type { ApiResponse } from '../types/apiResponse'; const instance = axios.create({ - //baseURL: 'https://nawc-staging.vercel.app', - baseURL: 'http://localhost:9000', + baseURL: 'https://nawc-staging.vercel.app', }); export const imageToLink = ( @@ -230,14 +229,18 @@ export const deleteCategory = (id: string): ApiResponse => { export const addSubcategory = ( id: string, - category: Category + name: string, ): ApiResponse => instance - .post(`/api/admin/subcategories/${id}`, category, { - headers: { - token: localStorage.getItem('token'), + .post( + `/api/admin/subcategories/${id}`, + { name }, + { + headers: { + token: localStorage.getItem('token'), + }, }, - }) + ) .then( (res) => res.data, (err) => { @@ -246,17 +249,23 @@ export const addSubcategory = ( }, ); -export const editSubcategory = ( +export const renameSubcategory = ( id: string, - category: Category, + category: string, + currentName: string, + newName: string, ): ApiResponse => { const requestExtension = `/api/admin/subcategories/${id}`; return instance - .put(requestExtension, category, { - headers: { - token: localStorage.getItem('token'), + .put( + requestExtension, + { category, newName, currentName }, + { + headers: { + token: localStorage.getItem('token'), + }, }, - }) + ) .then( (res) => res.data, (err) => { @@ -281,4 +290,4 @@ export const deleteSubcategory = (id: string): ApiResponse => { return null; }, ); -}; \ No newline at end of file +}; From 774ee58863312fc0ba01d4efda9768b5972c0cb0 Mon Sep 17 00:00:00 2001 From: nehakonjeti Date: Mon, 1 Mar 2021 13:17:25 -0600 Subject: [PATCH 5/5] Change subcategory naming in model and backend --- api/src/api/admin.js | 8 ++++---- api/src/models/resource.js | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/api/src/api/admin.js b/api/src/api/admin.js index 988503a6..b364d4e5 100644 --- a/api/src/api/admin.js +++ b/api/src/api/admin.js @@ -259,8 +259,8 @@ router.put( ); await Resource.updateMany( - { category: req.body.category, subcategory: req.body.currentName }, - { $set: { 'subcategory.$': req.body.newName } }, + { category: req.body.category, subcategories: req.body.currentName }, + { $set: { 'subcategories.$': req.body.newName } }, ); res.json({ @@ -289,8 +289,8 @@ router.delete( ); await Resource.updateMany( - { category: req.body.category, subcategory: req.body.subcategory }, - { $pull: { subcategory: req.body.subcategory } }, + { category: req.body.category, subcategories: req.body.subcategory }, + { $pull: { subcategories: req.body.subcategory } }, ); res.json({ diff --git a/api/src/models/resource.js b/api/src/models/resource.js index 27022fa7..99680f23 100644 --- a/api/src/models/resource.js +++ b/api/src/models/resource.js @@ -31,7 +31,7 @@ const HoursSchema = new mongoose.Schema({ const Resource = new mongoose.Schema({ category: { type: [String], required: true }, - subcategory: { type: [String], required: true }, + subcategories: { type: [String], required: true }, name: { type: String, required: true }, description: { type: String, required: true }, website: { type: String, required: false },