From 41bbb9c497cc3254a333abe26877245c4004aa11 Mon Sep 17 00:00:00 2001 From: Sujal Lama Date: Wed, 28 Jul 2021 18:12:01 +0545 Subject: [PATCH 01/15] member-role --- .../controllers/communityUserController.js | 52 ++++++++++++++++++- api/src/middleware/memberPermit.js | 15 ++++++ .../20210728085949-alter_community_user.js | 14 +++++ api/src/models/communityUserModel.js | 4 ++ api/src/routes/communityUserRouter.js | 8 +-- 5 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 api/src/middleware/memberPermit.js create mode 100644 api/src/migrations/20210728085949-alter_community_user.js diff --git a/api/src/controllers/communityUserController.js b/api/src/controllers/communityUserController.js index 457a3c2a5..ecb6fb869 100644 --- a/api/src/controllers/communityUserController.js +++ b/api/src/controllers/communityUserController.js @@ -85,7 +85,7 @@ const getAllMembers = async (req, res) => { const data = await db.CommunityUser.findAll( { where: { communityId: req.params.id, active: true }, - attributes: ['userId'], + attributes: ['userId', "role"], include: [{ model: db.User, attributes: ['firstName'] @@ -101,6 +101,54 @@ const getAllMembers = async (req, res) => { } } +// @desc Get the community-users +// @route GET /api/community-users/community/:id/details +// @access Public + +const getAllMemberDetails = async (req, res) => { + try { + const data = await db.CommunityUser.findAll( + { + where: { communityId: req.params.id, active: true }, + attributes: ['id', 'userId', 'role'], + include: [{ + model: db.User, + attributes: ['firstName', 'lastName', 'email', "phone", "dateOfBirth"] + }], + required: true + } + ) + + // flattening the array to show only one object + const newArray = data.map(item => { + const {userId, role, id} = item.dataValues + const {...rest} = item.user + return {id, userId, role, ...rest.dataValues} + } + ) + + res.json({ + results: newArray + }) + } catch (error) { + res.status(400).json({ error }) + } +} + +// @desc Update the community users +// @route PUT /api/community-users/:memberId/community/:id/ +// @access Public + +const updateMemberRole = async (req, res) => { + try { + const {role} = req.body + await db.CommunityUser.update({role: role}, {where: {id: parseInt(req.params.memberId)}}) + res.json({message: 'Successfully role updated'}) + } catch (error) { + res.status(400).json({error}) + } +} + // @desc Search Name // @route POST /api/news/community/:id/search // @access Private @@ -129,4 +177,4 @@ const searchMemberName = (req, res) => { .catch(err => res.json({ error: err }).status(400)) } -module.exports = { getCommunityUsers, followCommunity, getAllMembers, searchMemberName } +module.exports = { getCommunityUsers, followCommunity, getAllMembers, searchMemberName, getAllMemberDetails, updateMemberRole } diff --git a/api/src/middleware/memberPermit.js b/api/src/middleware/memberPermit.js new file mode 100644 index 000000000..73824d1f4 --- /dev/null +++ b/api/src/middleware/memberPermit.js @@ -0,0 +1,15 @@ +const db = require("../models") + +const memberPermit = (role) => { + + return async (req, res, next) => { + const member = await db.CommunityUser.findOne({where: {userId: req.user.id, communityId: req.params.id}, attributes: ['role']}); + if (member.dataValues.role === role) { + next() + } else { + res.json({ error: 'Sorry, You don\'t have permission' }) + } + } +} + +module.exports = memberPermit \ No newline at end of file diff --git a/api/src/migrations/20210728085949-alter_community_user.js b/api/src/migrations/20210728085949-alter_community_user.js new file mode 100644 index 000000000..81b898387 --- /dev/null +++ b/api/src/migrations/20210728085949-alter_community_user.js @@ -0,0 +1,14 @@ +'use strict'; + +module.exports = { + up: async (queryInterface, Sequelize) => { + queryInterface.addColumn('communities_users', 'role', { + type: Sequelize.STRING, + defaultValue: 'member' + }) + }, + + down: async (queryInterface, Sequelize) => { + queryInterface.removeColumn('communities_users', 'role') + } +}; diff --git a/api/src/models/communityUserModel.js b/api/src/models/communityUserModel.js index 84b332fe5..322b6f9ab 100644 --- a/api/src/models/communityUserModel.js +++ b/api/src/models/communityUserModel.js @@ -15,6 +15,10 @@ module.exports = (sequelize, DataTypes) => { active: { type: DataTypes.INTEGER, defaultValue: true + }, + role: { + type: DataTypes.STRING, + defaultValue: 'manager' } }, { timestamps: true } diff --git a/api/src/routes/communityUserRouter.js b/api/src/routes/communityUserRouter.js index 0c448b74d..7308118ea 100644 --- a/api/src/routes/communityUserRouter.js +++ b/api/src/routes/communityUserRouter.js @@ -1,11 +1,13 @@ -const { getCommunityUsers, followCommunity, getAllMembers, searchMemberName } = require('../controllers/communityUserController') +const { getCommunityUsers, followCommunity, getAllMembers, searchMemberName, getAllMemberDetails, updateMemberRole } = require('../controllers/communityUserController') const protect = require('../middleware/authMiddleware') +const memberPermit = require('../middleware/memberPermit') const router = require('express').Router() router.get('/', getCommunityUsers) router.post('/follow', protect, followCommunity) -router.get('/community/:id', getAllMembers) +router.get('/community/:id', protect, memberPermit('manager'), getAllMembers) router.get('/community/:id/search', searchMemberName) +router.put('/:memberId/community/:id/', protect, memberPermit('manager'), updateMemberRole) // router.put('/:id', updateCommunityUsers); - +router.get('/community/:id/details', protect, memberPermit('manager'), getAllMemberDetails) module.exports = router From 30786be4ced732d395cdc08a6a81236fe9c860cd Mon Sep 17 00:00:00 2001 From: Sujal Lama Date: Wed, 28 Jul 2021 18:13:04 +0545 Subject: [PATCH 02/15] member role added --- src/App.jsx | 2 + src/screens/admin/ComMemberAdmin.jsx | 69 +++++++++++++++++++++++++++ src/screens/admin/ComMemberAdmin.scss | 38 +++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 src/screens/admin/ComMemberAdmin.jsx create mode 100644 src/screens/admin/ComMemberAdmin.scss diff --git a/src/App.jsx b/src/App.jsx index 2e71c6150..a7a5ad4b1 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -51,6 +51,7 @@ import UserVerification from './screens/verification/UserVerification' import AddTest from './screens/addTest/AddTest' import LogoutUser from './screens/logoutUser/LogoutUser' import PageNotFound from './screens/pageNotFound/PageNotFound' +import ComMemberAdmin from './screens/admin/ComMemberAdmin' function App () { return ( @@ -77,6 +78,7 @@ function App () { + diff --git a/src/screens/admin/ComMemberAdmin.jsx b/src/screens/admin/ComMemberAdmin.jsx new file mode 100644 index 000000000..e7bb2a567 --- /dev/null +++ b/src/screens/admin/ComMemberAdmin.jsx @@ -0,0 +1,69 @@ +import axios from 'axios'; +import React, { useEffect, useState } from 'react' +import { useDispatch } from 'react-redux' +import DashboardLayout from '../../layout/dashboardLayout/DashboardLayout' +import { configFunc, getApi } from '../../utils/apiFunc' +import './ComMemberAdmin.scss'; + +const ComMemberAdmin = () => { + const [data, setData] = useState([]); + const [success, setSuccess] = useState(null); + // fetching current community + const currentCommunity = localStorage.getItem('currentCommunity') + ? JSON.parse(localStorage.getItem('currentCommunity')) + : null + const dispatch = useDispatch(); + const config = configFunc() + + useEffect(() => { + getMemberDetails() + }, [success]) + + const getMemberDetails = async () => { + const { data } = await getApi( + dispatch, + `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/community/${currentCommunity.id}/details` + ) + setData(data.results) + } + + const allowAccess = async (id) => { + const {data} = await axios.put(`${process.env.REACT_APP_API_BASE_URL}/api/communities-users/${id}/community/${currentCommunity.id}`, + {role: "manager"}, config) + setSuccess(data) + } + + return ( + +
+
+ { + ["firstName", "lastName", "email", "phone", "dateOfBirth", "role", "options"].map(el => { + return ( +

{el}

+ ) + }) + } +
+ { + data.map(item => { + const {firstName, lastName, email, phone, dateOfBirth, role} = item + return ( +
+

{firstName ? firstName : 'name'}

+

{lastName ? lastName : 'lastname'}

+

{email ? email : 'email'}

+

{phone ? phone : 'phone'}

+

{dateOfBirth ? dateOfBirth : 'dateOfBirth'}

+

{role ? role : 'role'}

+

allowAccess(item.id)} />

+
+ ) + }) + } +
+
+ ) +} + +export default ComMemberAdmin diff --git a/src/screens/admin/ComMemberAdmin.scss b/src/screens/admin/ComMemberAdmin.scss new file mode 100644 index 000000000..73379e5b4 --- /dev/null +++ b/src/screens/admin/ComMemberAdmin.scss @@ -0,0 +1,38 @@ +.com-member-container { + width: 100%; + display: flex; + flex-direction: column; + color: #fff; +} + +.com-member-header { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + background: var(--primary-color); + padding: 12px; + text-align: center; + + p { + flex: 1; + } +} + +.com-member-item { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px; + text-align: center; + background: var(--dropdowns); + + p { + flex: 1; + } +} + +.access-btn { + cursor: pointer; +} \ No newline at end of file From 249f11c63fb796dade86a31cca18a8475b52b000 Mon Sep 17 00:00:00 2001 From: Sujal Lama Date: Wed, 28 Jul 2021 18:23:30 +0545 Subject: [PATCH 03/15] scss lint fix --- src/screens/admin/ComMemberAdmin.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/screens/admin/ComMemberAdmin.scss b/src/screens/admin/ComMemberAdmin.scss index 73379e5b4..a4e8391fb 100644 --- a/src/screens/admin/ComMemberAdmin.scss +++ b/src/screens/admin/ComMemberAdmin.scss @@ -35,4 +35,4 @@ .access-btn { cursor: pointer; -} \ No newline at end of file +} From 421343d511ca4ab4461deeb402de13a79e882d27 Mon Sep 17 00:00:00 2001 From: Sujal Lama Date: Thu, 29 Jul 2021 10:15:48 +0545 Subject: [PATCH 04/15] file name changed, putApi made, model changed --- .../controllers/communityUserController.js | 6 ++--- api/src/models/communityUserModel.js | 2 +- src/App.jsx | 4 ++-- ...mberAdmin.jsx => CommunityMemberAdmin.jsx} | 24 +++++++++++-------- ...erAdmin.scss => CommunityMemberAdmin.scss} | 0 src/utils/apiFunc.jsx | 13 ++++++++++ 6 files changed, 33 insertions(+), 16 deletions(-) rename src/screens/admin/{ComMemberAdmin.jsx => CommunityMemberAdmin.jsx} (77%) rename src/screens/admin/{ComMemberAdmin.scss => CommunityMemberAdmin.scss} (100%) diff --git a/api/src/controllers/communityUserController.js b/api/src/controllers/communityUserController.js index ecb6fb869..51419d741 100644 --- a/api/src/controllers/communityUserController.js +++ b/api/src/controllers/communityUserController.js @@ -85,7 +85,7 @@ const getAllMembers = async (req, res) => { const data = await db.CommunityUser.findAll( { where: { communityId: req.params.id, active: true }, - attributes: ['userId', "role"], + attributes: ['userId', 'role'], include: [{ model: db.User, attributes: ['firstName'] @@ -113,7 +113,7 @@ const getAllMemberDetails = async (req, res) => { attributes: ['id', 'userId', 'role'], include: [{ model: db.User, - attributes: ['firstName', 'lastName', 'email', "phone", "dateOfBirth"] + attributes: ['firstName', 'lastName', 'email', 'phone', 'dateOfBirth'] }], required: true } @@ -142,7 +142,7 @@ const getAllMemberDetails = async (req, res) => { const updateMemberRole = async (req, res) => { try { const {role} = req.body - await db.CommunityUser.update({role: role}, {where: {id: parseInt(req.params.memberId)}}) + await db.CommunityUser.update({role}, {where: {id: parseInt(req.params.memberId)}}) res.json({message: 'Successfully role updated'}) } catch (error) { res.status(400).json({error}) diff --git a/api/src/models/communityUserModel.js b/api/src/models/communityUserModel.js index 322b6f9ab..e5c0a30f5 100644 --- a/api/src/models/communityUserModel.js +++ b/api/src/models/communityUserModel.js @@ -18,7 +18,7 @@ module.exports = (sequelize, DataTypes) => { }, role: { type: DataTypes.STRING, - defaultValue: 'manager' + defaultValue: 'member' } }, { timestamps: true } diff --git a/src/App.jsx b/src/App.jsx index a7a5ad4b1..eb3039028 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -51,7 +51,7 @@ import UserVerification from './screens/verification/UserVerification' import AddTest from './screens/addTest/AddTest' import LogoutUser from './screens/logoutUser/LogoutUser' import PageNotFound from './screens/pageNotFound/PageNotFound' -import ComMemberAdmin from './screens/admin/ComMemberAdmin' +import CommunityMemberAdmin from './screens/admin/CommunityMemberAdmin' function App () { return ( @@ -78,7 +78,7 @@ function App () { - + diff --git a/src/screens/admin/ComMemberAdmin.jsx b/src/screens/admin/CommunityMemberAdmin.jsx similarity index 77% rename from src/screens/admin/ComMemberAdmin.jsx rename to src/screens/admin/CommunityMemberAdmin.jsx index e7bb2a567..d395bae42 100644 --- a/src/screens/admin/ComMemberAdmin.jsx +++ b/src/screens/admin/CommunityMemberAdmin.jsx @@ -2,18 +2,17 @@ import axios from 'axios'; import React, { useEffect, useState } from 'react' import { useDispatch } from 'react-redux' import DashboardLayout from '../../layout/dashboardLayout/DashboardLayout' -import { configFunc, getApi } from '../../utils/apiFunc' -import './ComMemberAdmin.scss'; +import { getApi, getCommunity, putApi } from '../../utils/apiFunc' +import './CommunityMemberAdmin.scss'; const ComMemberAdmin = () => { const [data, setData] = useState([]); const [success, setSuccess] = useState(null); - // fetching current community - const currentCommunity = localStorage.getItem('currentCommunity') - ? JSON.parse(localStorage.getItem('currentCommunity')) - : null + const dispatch = useDispatch(); - const config = configFunc() + + // getting current community from localstorage + const currentCommunity = getCommunity(); useEffect(() => { getMemberDetails() @@ -28,9 +27,14 @@ const ComMemberAdmin = () => { } const allowAccess = async (id) => { - const {data} = await axios.put(`${process.env.REACT_APP_API_BASE_URL}/api/communities-users/${id}/community/${currentCommunity.id}`, - {role: "manager"}, config) - setSuccess(data) + // const {data} = await axios.put(`${process.env.REACT_APP_API_BASE_URL}/api/communities-users/${id}/community/${currentCommunity.id}`, + // {role: "manager"}, config) + const {data} = await putApi( + dispatch, + `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/${id}/community/${currentCommunity.id}`, + {role: 'manager'} + ) + setSuccess(data) } return ( diff --git a/src/screens/admin/ComMemberAdmin.scss b/src/screens/admin/CommunityMemberAdmin.scss similarity index 100% rename from src/screens/admin/ComMemberAdmin.scss rename to src/screens/admin/CommunityMemberAdmin.scss diff --git a/src/utils/apiFunc.jsx b/src/utils/apiFunc.jsx index 5c6031c80..73d848f6a 100644 --- a/src/utils/apiFunc.jsx +++ b/src/utils/apiFunc.jsx @@ -8,6 +8,15 @@ export const configFunc = () => { return { headers } } +export const getCommunity = () => { + // fetching current community + const currentCommunity = localStorage.getItem('currentCommunity') + ? JSON.parse(localStorage.getItem('currentCommunity')) + : null + + return currentCommunity; +} + export const getApi = async (dispatch, url, config = configFunc()) => { return await axios.get(url, config) } @@ -15,3 +24,7 @@ export const getApi = async (dispatch, url, config = configFunc()) => { export const postApi = async (dispatch, url, data, config = configFunc()) => { return await axios.post(url, data, config) } + +export const putApi = async (dispatch, url, data, config = configFunc()) => { + return await axios.put(url, data, config) +} From b8cd91622997d64d98cf37432130cf6706e5c5b5 Mon Sep 17 00:00:00 2001 From: Laxman Maharjan Date: Fri, 30 Jul 2021 15:47:32 +0545 Subject: [PATCH 05/15] lint --- .../controllers/communityUserController.js | 16 +-- api/src/middleware/memberPermit.js | 7 +- .../20210728085949-alter_community_user.js | 6 +- src/screens/admin/CommunityMemberAdmin.jsx | 108 +++++++++--------- 4 files changed, 68 insertions(+), 69 deletions(-) diff --git a/api/src/controllers/communityUserController.js b/api/src/controllers/communityUserController.js index 51419d741..a2d67ee65 100644 --- a/api/src/controllers/communityUserController.js +++ b/api/src/controllers/communityUserController.js @@ -121,10 +121,10 @@ const getAllMemberDetails = async (req, res) => { // flattening the array to show only one object const newArray = data.map(item => { - const {userId, role, id} = item.dataValues - const {...rest} = item.user - return {id, userId, role, ...rest.dataValues} - } + const { userId, role, id } = item.dataValues + const { ...rest } = item.user + return { id, userId, role, ...rest.dataValues } + } ) res.json({ @@ -141,11 +141,11 @@ const getAllMemberDetails = async (req, res) => { const updateMemberRole = async (req, res) => { try { - const {role} = req.body - await db.CommunityUser.update({role}, {where: {id: parseInt(req.params.memberId)}}) - res.json({message: 'Successfully role updated'}) + const { role } = req.body + await db.CommunityUser.update({ role }, { where: { id: parseInt(req.params.memberId) } }) + res.json({ message: 'Successfully role updated' }) } catch (error) { - res.status(400).json({error}) + res.status(400).json({ error }) } } diff --git a/api/src/middleware/memberPermit.js b/api/src/middleware/memberPermit.js index 73824d1f4..93f1e3799 100644 --- a/api/src/middleware/memberPermit.js +++ b/api/src/middleware/memberPermit.js @@ -1,9 +1,8 @@ -const db = require("../models") +const db = require('../models') const memberPermit = (role) => { - return async (req, res, next) => { - const member = await db.CommunityUser.findOne({where: {userId: req.user.id, communityId: req.params.id}, attributes: ['role']}); + const member = await db.CommunityUser.findOne({ where: { userId: req.user.id, communityId: req.params.id }, attributes: ['role'] }) if (member.dataValues.role === role) { next() } else { @@ -12,4 +11,4 @@ const memberPermit = (role) => { } } -module.exports = memberPermit \ No newline at end of file +module.exports = memberPermit diff --git a/api/src/migrations/20210728085949-alter_community_user.js b/api/src/migrations/20210728085949-alter_community_user.js index 81b898387..e05727f59 100644 --- a/api/src/migrations/20210728085949-alter_community_user.js +++ b/api/src/migrations/20210728085949-alter_community_user.js @@ -1,8 +1,8 @@ -'use strict'; +'use strict' module.exports = { up: async (queryInterface, Sequelize) => { - queryInterface.addColumn('communities_users', 'role', { + queryInterface.addColumn('communities_users', 'role', { type: Sequelize.STRING, defaultValue: 'member' }) @@ -11,4 +11,4 @@ module.exports = { down: async (queryInterface, Sequelize) => { queryInterface.removeColumn('communities_users', 'role') } -}; +} diff --git a/src/screens/admin/CommunityMemberAdmin.jsx b/src/screens/admin/CommunityMemberAdmin.jsx index d395bae42..4449044ad 100644 --- a/src/screens/admin/CommunityMemberAdmin.jsx +++ b/src/screens/admin/CommunityMemberAdmin.jsx @@ -1,73 +1,73 @@ -import axios from 'axios'; +import axios from 'axios' import React, { useEffect, useState } from 'react' import { useDispatch } from 'react-redux' import DashboardLayout from '../../layout/dashboardLayout/DashboardLayout' -import { getApi, getCommunity, putApi } from '../../utils/apiFunc' -import './CommunityMemberAdmin.scss'; +import { getApi, getCommunity, putApi } from '../../utils/apiFunc' +import './CommunityMemberAdmin.scss' const ComMemberAdmin = () => { - const [data, setData] = useState([]); - const [success, setSuccess] = useState(null); - - const dispatch = useDispatch(); - - // getting current community from localstorage - const currentCommunity = getCommunity(); + const [data, setData] = useState([]) + const [success, setSuccess] = useState(null) - useEffect(() => { - getMemberDetails() - }, [success]) + const dispatch = useDispatch() - const getMemberDetails = async () => { - const { data } = await getApi( - dispatch, + // getting current community from localstorage + const currentCommunity = getCommunity() + + useEffect(() => { + getMemberDetails() + }, [success]) + + const getMemberDetails = async () => { + const { data } = await getApi( + dispatch, `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/community/${currentCommunity.id}/details` - ) - setData(data.results) - } + ) + setData(data.results) + } - const allowAccess = async (id) => { - // const {data} = await axios.put(`${process.env.REACT_APP_API_BASE_URL}/api/communities-users/${id}/community/${currentCommunity.id}`, - // {role: "manager"}, config) - const {data} = await putApi( - dispatch, + const allowAccess = async (id) => { + // const {data} = await axios.put(`${process.env.REACT_APP_API_BASE_URL}/api/communities-users/${id}/community/${currentCommunity.id}`, + // {role: "manager"}, config) + const { data } = await putApi( + dispatch, `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/${id}/community/${currentCommunity.id}`, - {role: 'manager'} - ) - setSuccess(data) - } + { role: 'manager' } + ) + setSuccess(data) + } - return ( - -
-
- { - ["firstName", "lastName", "email", "phone", "dateOfBirth", "role", "options"].map(el => { - return ( -

{el}

- ) + return ( + +
+
+ { + ['firstName', 'lastName', 'email', 'phone', 'dateOfBirth', 'role', 'options'].map(el => { + return ( +

{el}

+ ) }) } -
- { +
+ { data.map(item => { - const {firstName, lastName, email, phone, dateOfBirth, role} = item - return ( -
-

{firstName ? firstName : 'name'}

-

{lastName ? lastName : 'lastname'}

-

{email ? email : 'email'}

-

{phone ? phone : 'phone'}

-

{dateOfBirth ? dateOfBirth : 'dateOfBirth'}

-

{role ? role : 'role'}

-

allowAccess(item.id)} />

-
- ) + const { firstName, lastName, email, phone, dateOfBirth, role } = item + return ( +
+

{firstName || 'name'}

+

{lastName || 'lastname'}

+

{email || 'email'}

+

{phone || 'phone'}

+

{dateOfBirth || 'dateOfBirth'}

+

{role || 'role'}

+

allowAccess(item.id)} />

+
+ ) }) } -
- - ) +
+
+ ) } export default ComMemberAdmin From e6fbf8d9a7dc54c2e10a77e7cdce4a26fc77e371 Mon Sep 17 00:00:00 2001 From: Sujal Lama Date: Mon, 2 Aug 2021 12:09:53 +0545 Subject: [PATCH 06/15] moved member permission file and js lint fix: community member admin --- api/src/middleware/memberPermit.js | 14 ------ api/src/middleware/permission.js | 32 ++++++++++--- api/src/routes/communityUserRouter.js | 8 ++-- src/screens/admin/CommunityMemberAdmin.jsx | 52 +++++++++++----------- 4 files changed, 56 insertions(+), 50 deletions(-) delete mode 100644 api/src/middleware/memberPermit.js diff --git a/api/src/middleware/memberPermit.js b/api/src/middleware/memberPermit.js deleted file mode 100644 index 93f1e3799..000000000 --- a/api/src/middleware/memberPermit.js +++ /dev/null @@ -1,14 +0,0 @@ -const db = require('../models') - -const memberPermit = (role) => { - return async (req, res, next) => { - const member = await db.CommunityUser.findOne({ where: { userId: req.user.id, communityId: req.params.id }, attributes: ['role'] }) - if (member.dataValues.role === role) { - next() - } else { - res.json({ error: 'Sorry, You don\'t have permission' }) - } - } -} - -module.exports = memberPermit diff --git a/api/src/middleware/permission.js b/api/src/middleware/permission.js index 5bdd4be4e..a75648d3c 100644 --- a/api/src/middleware/permission.js +++ b/api/src/middleware/permission.js @@ -1,15 +1,33 @@ -const permit = (role) => { - return (req, res, next) => { - if (checkRole(req, role)) { +const db = require("../models") + +function checkRole (dbRole, roles) { + return roles.some(el => el === dbRole) +} + +// async function checkMemberRole(req, roles) { +// const member = await db.CommunityUser.findOne({ where: { userId: req.user.id, communityId: req.params.id }, attributes: ['role'] }) +// console.log(member.dataValues.role); +// console.log(checkRole(member.dataValues.role, roles)) +// if (checkRole(member.dataValues.role, roles)) { +// return true; +// } else { +// return false; +// } +// } + +const permit = (roles) => { + return async (req, res, next) => { + // getting member role + const member = await db.CommunityUser.findOne({ where: { userId: req.user.id, communityId: req.params.id }, attributes: ['role'] }) + + if (checkRole(member.dataValues.role, roles) || checkRole(req.user.role, roles)) { + console.log("hellonworld") next() } else { res.json({ error: 'Sorry, You don\'t have permission' }) + return; } } } -function checkRole (req, role) { - return role.some(el => el === req.user.role) -} - module.exports = permit diff --git a/api/src/routes/communityUserRouter.js b/api/src/routes/communityUserRouter.js index 7308118ea..99670455d 100644 --- a/api/src/routes/communityUserRouter.js +++ b/api/src/routes/communityUserRouter.js @@ -1,13 +1,13 @@ const { getCommunityUsers, followCommunity, getAllMembers, searchMemberName, getAllMemberDetails, updateMemberRole } = require('../controllers/communityUserController') const protect = require('../middleware/authMiddleware') -const memberPermit = require('../middleware/memberPermit') +const permit = require('../middleware/permission') const router = require('express').Router() router.get('/', getCommunityUsers) router.post('/follow', protect, followCommunity) -router.get('/community/:id', protect, memberPermit('manager'), getAllMembers) +router.get('/community/:id', protect, permit(['manager']), getAllMembers) router.get('/community/:id/search', searchMemberName) -router.put('/:memberId/community/:id/', protect, memberPermit('manager'), updateMemberRole) +router.put('/:memberId/community/:id/', protect, permit(['manager']), updateMemberRole) // router.put('/:id', updateCommunityUsers); -router.get('/community/:id/details', protect, memberPermit('manager'), getAllMemberDetails) +router.get('/community/:id/details', protect, permit(['manager']), getAllMemberDetails) module.exports = router diff --git a/src/screens/admin/CommunityMemberAdmin.jsx b/src/screens/admin/CommunityMemberAdmin.jsx index 4449044ad..8b6ac9c13 100644 --- a/src/screens/admin/CommunityMemberAdmin.jsx +++ b/src/screens/admin/CommunityMemberAdmin.jsx @@ -1,8 +1,7 @@ -import axios from 'axios' import React, { useEffect, useState } from 'react' import { useDispatch } from 'react-redux' import DashboardLayout from '../../layout/dashboardLayout/DashboardLayout' -import { getApi, getCommunity, putApi } from '../../utils/apiFunc' +import { getApi, putApi } from '../../utils/apiFunc' import './CommunityMemberAdmin.scss' const ComMemberAdmin = () => { @@ -11,8 +10,11 @@ const ComMemberAdmin = () => { const dispatch = useDispatch() - // getting current community from localstorage - const currentCommunity = getCommunity() + + // fetching current community + const currentCommunity = localStorage.getItem('currentCommunity') + ? JSON.parse(localStorage.getItem('currentCommunity')) + : null useEffect(() => { getMemberDetails() @@ -42,29 +44,29 @@ const ComMemberAdmin = () => {
{ - ['firstName', 'lastName', 'email', 'phone', 'dateOfBirth', 'role', 'options'].map(el => { - return ( -

{el}

- ) - }) - } + ['firstName', 'lastName', 'email', 'phone', 'dateOfBirth', 'role', 'options'].map(el => { + return ( +

{el}

+ ) + }) + }
{ - data.map(item => { - const { firstName, lastName, email, phone, dateOfBirth, role } = item - return ( -
-

{firstName || 'name'}

-

{lastName || 'lastname'}

-

{email || 'email'}

-

{phone || 'phone'}

-

{dateOfBirth || 'dateOfBirth'}

-

{role || 'role'}

-

allowAccess(item.id)} />

-
- ) - }) - } + data.map(item => { + const { firstName, lastName, email, phone, dateOfBirth, role } = item + return ( +
+

{firstName || 'name'}

+

{lastName || 'lastname'}

+

{email || 'email'}

+

{phone || 'phone'}

+

{dateOfBirth || 'dateOfBirth'}

+

{role || 'role'}

+

allowAccess(item.id)} />

+
+ ) + }) + }
) From a61e39cf4987360b77e1f80a1678a3824f452b5a Mon Sep 17 00:00:00 2001 From: Sujal Lama Date: Mon, 2 Aug 2021 12:59:57 +0545 Subject: [PATCH 07/15] community member data: table showing --- src/screens/admin/CommunityMemberAdmin.jsx | 57 +++++++++------------- src/utils/getCommunity.js | 5 ++ 2 files changed, 28 insertions(+), 34 deletions(-) create mode 100644 src/utils/getCommunity.js diff --git a/src/screens/admin/CommunityMemberAdmin.jsx b/src/screens/admin/CommunityMemberAdmin.jsx index 8b6ac9c13..80dfaf99a 100644 --- a/src/screens/admin/CommunityMemberAdmin.jsx +++ b/src/screens/admin/CommunityMemberAdmin.jsx @@ -1,7 +1,9 @@ import React, { useEffect, useState } from 'react' import { useDispatch } from 'react-redux' +import Table from '../../components/table/Table' import DashboardLayout from '../../layout/dashboardLayout/DashboardLayout' import { getApi, putApi } from '../../utils/apiFunc' +import { getCommunity } from '../../utils/getCommunity' import './CommunityMemberAdmin.scss' const ComMemberAdmin = () => { @@ -12,9 +14,7 @@ const ComMemberAdmin = () => { // fetching current community - const currentCommunity = localStorage.getItem('currentCommunity') - ? JSON.parse(localStorage.getItem('currentCommunity')) - : null + const currentCommunity = getCommunity(); useEffect(() => { getMemberDetails() @@ -23,51 +23,40 @@ const ComMemberAdmin = () => { const getMemberDetails = async () => { const { data } = await getApi( dispatch, - `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/community/${currentCommunity.id}/details` + `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/community/${currentCommunity.id}/details` ) setData(data.results) } + console.log(data); + const allowAccess = async (id) => { - // const {data} = await axios.put(`${process.env.REACT_APP_API_BASE_URL}/api/communities-users/${id}/community/${currentCommunity.id}`, - // {role: "manager"}, config) const { data } = await putApi( dispatch, - `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/${id}/community/${currentCommunity.id}`, - { role: 'manager' } + `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/${id}/community/${currentCommunity.id}`, + { role: 'manager' } ) setSuccess(data) } return ( -
-
- { - ['firstName', 'lastName', 'email', 'phone', 'dateOfBirth', 'role', 'options'].map(el => { - return ( -

{el}

- ) - }) - } -
- { - data.map(item => { - const { firstName, lastName, email, phone, dateOfBirth, role } = item - return ( -
-

{firstName || 'name'}

-

{lastName || 'lastname'}

-

{email || 'email'}

-

{phone || 'phone'}

-

{dateOfBirth || 'dateOfBirth'}

-

{role || 'role'}

-

allowAccess(item.id)} />

-
- ) - }) + {data.length && + />} ) } diff --git a/src/utils/getCommunity.js b/src/utils/getCommunity.js new file mode 100644 index 000000000..b64d4fc97 --- /dev/null +++ b/src/utils/getCommunity.js @@ -0,0 +1,5 @@ +export const getCommunity = () => { + return localStorage.getItem('currentCommunity') + ? JSON.parse(localStorage.getItem('currentCommunity')) + : null +} \ No newline at end of file From b9e18dabe74d233658aa2daff763384d01fa3ae1 Mon Sep 17 00:00:00 2001 From: Sujal Lama Date: Mon, 2 Aug 2021 14:14:28 +0545 Subject: [PATCH 08/15] member role add js lint fix --- api/src/middleware/permission.js | 4 +--- src/screens/admin/CommunityMemberAdmin.jsx | 13 +++++-------- src/utils/getCommunity.js | 4 ++-- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/api/src/middleware/permission.js b/api/src/middleware/permission.js index a75648d3c..e6a7eb668 100644 --- a/api/src/middleware/permission.js +++ b/api/src/middleware/permission.js @@ -1,4 +1,4 @@ -const db = require("../models") +const db = require('../models') function checkRole (dbRole, roles) { return roles.some(el => el === dbRole) @@ -21,11 +21,9 @@ const permit = (roles) => { const member = await db.CommunityUser.findOne({ where: { userId: req.user.id, communityId: req.params.id }, attributes: ['role'] }) if (checkRole(member.dataValues.role, roles) || checkRole(req.user.role, roles)) { - console.log("hellonworld") next() } else { res.json({ error: 'Sorry, You don\'t have permission' }) - return; } } } diff --git a/src/screens/admin/CommunityMemberAdmin.jsx b/src/screens/admin/CommunityMemberAdmin.jsx index 80dfaf99a..6946eea74 100644 --- a/src/screens/admin/CommunityMemberAdmin.jsx +++ b/src/screens/admin/CommunityMemberAdmin.jsx @@ -12,9 +12,8 @@ const ComMemberAdmin = () => { const dispatch = useDispatch() - // fetching current community - const currentCommunity = getCommunity(); + const currentCommunity = getCommunity() useEffect(() => { getMemberDetails() @@ -28,8 +27,6 @@ const ComMemberAdmin = () => { setData(data.results) } - console.log(data); - const allowAccess = async (id) => { const { data } = await putApi( dispatch, @@ -41,12 +38,12 @@ const ComMemberAdmin = () => { return ( - {data.length &&
{ } ] } - />} + />} ) } diff --git a/src/utils/getCommunity.js b/src/utils/getCommunity.js index b64d4fc97..dc7b67074 100644 --- a/src/utils/getCommunity.js +++ b/src/utils/getCommunity.js @@ -1,5 +1,5 @@ export const getCommunity = () => { - return localStorage.getItem('currentCommunity') + return localStorage.getItem('currentCommunity') ? JSON.parse(localStorage.getItem('currentCommunity')) : null -} \ No newline at end of file +} From bc6a177318b924aad02227997b24c52ca7a903ab Mon Sep 17 00:00:00 2001 From: Sujal Lama Date: Tue, 3 Aug 2021 17:57:27 +0545 Subject: [PATCH 09/15] drop down added --- .../controllers/communityUserController.js | 21 ++------ api/src/routes/communityUserRouter.js | 7 ++- src/actions/memberActions.js | 37 ++++++++++++-- src/components/dropDown/DropDown.jsx | 35 ++++++++++++++ src/components/dropDown/DropDown.scss | 45 +++++++++++++++++ src/components/table/Table.jsx | 16 +++++-- src/constants/memberConstants.js | 4 ++ src/reducers/memberReducers.js | 19 ++++++++ src/screens/admin/CommunityMemberAdmin.jsx | 48 +++++++++---------- src/store.js | 3 +- 10 files changed, 180 insertions(+), 55 deletions(-) create mode 100644 src/components/dropDown/DropDown.jsx create mode 100644 src/components/dropDown/DropDown.scss diff --git a/api/src/controllers/communityUserController.js b/api/src/controllers/communityUserController.js index a2d67ee65..9e7e41f0b 100644 --- a/api/src/controllers/communityUserController.js +++ b/api/src/controllers/communityUserController.js @@ -1,21 +1,6 @@ const { Op } = require('sequelize') const db = require('../models') -// @desc Get the community-users -// @route GET /api/community-users -// @access Public - -const getCommunityUsers = async (req, res) => { - try { - const data = await db.CommunityUser.findAll() - res.json({ - data - }) - } catch (error) { - res.status(400).json({ error }) - } -} - // @desc follow community // @route POST /api/community-users/follow // @access Public @@ -81,7 +66,7 @@ const followCommunity = async (req, res) => { // @access Public const getAllMembers = async (req, res) => { - try { + try { const data = await db.CommunityUser.findAll( { where: { communityId: req.params.id, active: true }, @@ -102,7 +87,7 @@ const getAllMembers = async (req, res) => { } // @desc Get the community-users -// @route GET /api/community-users/community/:id/details +// @route GET /api/community-users/admin/community/:id // @access Public const getAllMemberDetails = async (req, res) => { @@ -177,4 +162,4 @@ const searchMemberName = (req, res) => { .catch(err => res.json({ error: err }).status(400)) } -module.exports = { getCommunityUsers, followCommunity, getAllMembers, searchMemberName, getAllMemberDetails, updateMemberRole } +module.exports = { followCommunity, getAllMembers, searchMemberName, updateMemberRole, getAllMemberDetails } diff --git a/api/src/routes/communityUserRouter.js b/api/src/routes/communityUserRouter.js index 99670455d..b46f0b0b8 100644 --- a/api/src/routes/communityUserRouter.js +++ b/api/src/routes/communityUserRouter.js @@ -1,13 +1,12 @@ -const { getCommunityUsers, followCommunity, getAllMembers, searchMemberName, getAllMemberDetails, updateMemberRole } = require('../controllers/communityUserController') +const { followCommunity, getAllMembers, searchMemberName, updateMemberRole, getAllMemberDetails } = require('../controllers/communityUserController') const protect = require('../middleware/authMiddleware') const permit = require('../middleware/permission') const router = require('express').Router() -router.get('/', getCommunityUsers) router.post('/follow', protect, followCommunity) -router.get('/community/:id', protect, permit(['manager']), getAllMembers) +router.get('/community/:id', protect, getAllMembers) router.get('/community/:id/search', searchMemberName) router.put('/:memberId/community/:id/', protect, permit(['manager']), updateMemberRole) // router.put('/:id', updateCommunityUsers); -router.get('/community/:id/details', protect, permit(['manager']), getAllMemberDetails) +router.get('/admin/community/:id', protect, permit(['manager']), getAllMemberDetails) module.exports = router diff --git a/src/actions/memberActions.js b/src/actions/memberActions.js index 3e9b02af5..7c426784a 100644 --- a/src/actions/memberActions.js +++ b/src/actions/memberActions.js @@ -1,5 +1,8 @@ -import { getApi } from '../utils/apiFunc' +import { getApi, putApi } from '../utils/apiFunc' import { + MEMBER_ACCESS_FAIL, + MEMBER_ACCESS_REQUEST, + MEMBER_ACCESS_SUCCESS, MEMBER_LIST_FAIL, MEMBER_LIST_REQUEST, MEMBER_LIST_SUCCESS, MEMBER_SEARCH_FAIL, MEMBER_SEARCH_REQUEST, MEMBER_SEARCH_SUCCESS @@ -19,6 +22,8 @@ export const listMembers = () => async ( dispatch, `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/community/${currentCommunity.id}` ) + + console.log(data); dispatch({ type: MEMBER_LIST_SUCCESS, payload: data @@ -39,13 +44,12 @@ export const searchMembers = (search) => async ( ) => { try { dispatch({ type: MEMBER_SEARCH_REQUEST }) - const { data } = await getApi( + await getApi( dispatch, `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/community/${currentCommunity.id}/search?name=${search}` ) dispatch({ - type: MEMBER_SEARCH_SUCCESS, - payload: data.member + type: MEMBER_SEARCH_SUCCESS }) } catch (error) { dispatch({ @@ -57,3 +61,28 @@ export const searchMembers = (search) => async ( }) } } + +export const allowAccess = (id, role) => async ( + dispatch +) => { + try { + dispatch({ type: MEMBER_ACCESS_REQUEST }) + const {data} = await putApi( + dispatch, + `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/${id}/community/${currentCommunity.id}`, + { role } + ) + dispatch({ + type: MEMBER_ACCESS_SUCCESS, + payload: data + }) + } catch (error) { + dispatch({ + type: MEMBER_ACCESS_FAIL, + payload: + error.response && error.response.data.message + ? error.response.data.message + : error.message + }) + } +} diff --git a/src/components/dropDown/DropDown.jsx b/src/components/dropDown/DropDown.jsx new file mode 100644 index 000000000..22578f86e --- /dev/null +++ b/src/components/dropDown/DropDown.jsx @@ -0,0 +1,35 @@ +import React, { useState } from 'react' +import './DropDown.scss'; + +const DropDown = ({data, title, getRole, id, role}) => { + const[active, setActive] = useState() + + function clickHandler (item) { + setActive(false) + getRole(item, id) + } + + return ( +
+
setActive(!active)} className='dropdown-title'> + {title} + +
+ {active && ( +
    + {data.length > 0 && + data.filter(el => el !== role).map((item) => ( +
  • clickHandler(item)}>{item}
  • + )) + } +
+ ) + } +
+ ) +} + +export default DropDown diff --git a/src/components/dropDown/DropDown.scss b/src/components/dropDown/DropDown.scss new file mode 100644 index 000000000..05b955cec --- /dev/null +++ b/src/components/dropDown/DropDown.scss @@ -0,0 +1,45 @@ +.dropdown-wrapper { + width: 200px; + position: relative; + + .dropdown-title { + color: var(--primary-white); + display: flex; + justify-content: space-between; + align-items: center; + top: 10px; + z-index: 999; + border: 1px solid var(--primary-white); + cursor: pointer; + padding: 11px; + width: 100%; + text-transform: capitalize; + border-radius: 4px; + } + + .dropdown-lists { + color: var(--primary-white); + position: absolute; + top: 2.3em; + background: var(--background-color-light); + margin-top: 0.5em; + border: 1px solid var(--dropdowns); + border-radius: 4px; + z-index: 2000; + width: 100%; + list-style: none; + + li { + padding: 1em 2em; + width: 100%; + cursor: pointer; + background: var(--background-color); + color: #ffff; + text-transform: capitalize; + + &:hover { + background: var(--primary-color); + } + } + } + } diff --git a/src/components/table/Table.jsx b/src/components/table/Table.jsx index 033ecae4e..1142e9201 100644 --- a/src/components/table/Table.jsx +++ b/src/components/table/Table.jsx @@ -1,4 +1,6 @@ import React, { useEffect, useState } from 'react' +import DropDown from '../dropDown/DropDown' +import Filter from '../filter/Filter' import './Table.scss' // description: @@ -18,7 +20,7 @@ import './Table.scss' // img: the path of the image you want to show as button // action: this holds function that is executed when the button is clicked (fn: returns id of the item) -const Table = ({ addSymbolNumber, data = { tblData: [] }, options = [] }) => { +const Table = ({ addSymbolNumber, data = { tblData: [] }, options = [], dropdown= {dropdownList : []} }) => { const [property, setProperty] = useState([]) const [header, setHeader] = useState([]) const [tblData, setTblData] = useState([]) @@ -29,6 +31,10 @@ const Table = ({ addSymbolNumber, data = { tblData: [] }, options = [] }) => { setProperty(tblProperty || Object.keys(tblData[0])) }, []) + const getRole = (role, id) => { + dropdown.action(id, role) + } + return (
@@ -40,7 +46,8 @@ const Table = ({ addSymbolNumber, data = { tblData: [] }, options = [] }) => { return }) } - {options.length && } + {options.length > 0 && } + {dropdown.dropdownList.length > 0 && } @@ -54,7 +61,7 @@ const Table = ({ addSymbolNumber, data = { tblData: [] }, options = [] }) => { return }) } - {options.length && } + { + dropdown.dropdownList.length > 0 && + } ) }) diff --git a/src/constants/memberConstants.js b/src/constants/memberConstants.js index 23cd06a25..1ab519271 100644 --- a/src/constants/memberConstants.js +++ b/src/constants/memberConstants.js @@ -5,3 +5,7 @@ export const MEMBER_LIST_FAIL = 'MEMBER_LIST_FAIL' export const MEMBER_SEARCH_REQUEST = 'MEMBER_SEARCH_REQUEST' export const MEMBER_SEARCH_SUCCESS = 'MEMBER_SEARCH_SUCCESS' export const MEMBER_SEARCH_FAIL = 'MEMBER_SEARCH_FAIL' + +export const MEMBER_ACCESS_REQUEST = 'MEMBER_ACCESS_REQUEST' +export const MEMBER_ACCESS_SUCCESS = 'MEMBER_ACCESS_SUCCESS' +export const MEMBER_ACCESS_FAIL = 'MEMBER_ACCESS_FAIL' diff --git a/src/reducers/memberReducers.js b/src/reducers/memberReducers.js index 0d98695f2..9c4ae0528 100644 --- a/src/reducers/memberReducers.js +++ b/src/reducers/memberReducers.js @@ -1,4 +1,7 @@ import { + MEMBER_ACCESS_FAIL, + MEMBER_ACCESS_REQUEST, + MEMBER_ACCESS_SUCCESS, MEMBER_LIST_FAIL, MEMBER_LIST_REQUEST, MEMBER_LIST_SUCCESS, MEMBER_SEARCH_FAIL, MEMBER_SEARCH_REQUEST, MEMBER_SEARCH_SUCCESS @@ -32,3 +35,19 @@ export const memberListReducer = (state = { members: [] }, action) => { return state } } + +export const memberAccessReducer = (state = { success: false}, action) => { + switch (action.type) { + case MEMBER_ACCESS_REQUEST: + return { loading: true} + case MEMBER_ACCESS_SUCCESS: + return { + loading: false, + success: true + } + case MEMBER_ACCESS_FAIL: + return { loading: false, error: action.payload } + default: + return state + } +} diff --git a/src/screens/admin/CommunityMemberAdmin.jsx b/src/screens/admin/CommunityMemberAdmin.jsx index 6946eea74..85f779d1d 100644 --- a/src/screens/admin/CommunityMemberAdmin.jsx +++ b/src/screens/admin/CommunityMemberAdmin.jsx @@ -1,14 +1,17 @@ -import React, { useEffect, useState } from 'react' -import { useDispatch } from 'react-redux' +import React, { useEffect, useLayoutEffect, useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { allowAccess } from '../../actions/memberActions' import Table from '../../components/table/Table' import DashboardLayout from '../../layout/dashboardLayout/DashboardLayout' -import { getApi, putApi } from '../../utils/apiFunc' +import { getApi} from '../../utils/apiFunc' import { getCommunity } from '../../utils/getCommunity' import './CommunityMemberAdmin.scss' const ComMemberAdmin = () => { const [data, setData] = useState([]) - const [success, setSuccess] = useState(null) + const [success, setSuccess] = useState(0) + const memberData = useSelector(state => state.accessMember) + // const {success} = memberData const dispatch = useDispatch() @@ -17,23 +20,22 @@ const ComMemberAdmin = () => { useEffect(() => { getMemberDetails() + if(memberData) { + setSuccess(memberData.success) + } }, [success]) - + + const allowAccessFunc = async (id, role) => { + dispatch(allowAccess(id, role)); + } + console.log(success); const getMemberDetails = async () => { const { data } = await getApi( dispatch, - `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/community/${currentCommunity.id}/details` + `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/admin/community/${currentCommunity.id}` ) - setData(data.results) - } - const allowAccess = async (id) => { - const { data } = await putApi( - dispatch, - `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/${id}/community/${currentCommunity.id}`, - { role: 'manager' } - ) - setSuccess(data) + setData(data.results) } return ( @@ -42,17 +44,13 @@ const ComMemberAdmin = () => { addSymbolNumber data={{ tblData: data, - tblProperty: ['firstName', 'lastName', 'email', 'phone', 'dateOfBirth', 'role', 'options'], - tblHeader: ['First Name', 'Last Name', 'Email', 'Phone', 'Date of Birth', 'Role', 'options'] + tblProperty: ['firstName', 'lastName', 'email', 'phone', 'dateOfBirth', 'role'], + tblHeader: ['First Name', 'Last Name', 'Email', 'Phone', 'Date of Birth', 'Role'] + }} + dropdown={{ + dropdownList: ['member', 'manager', 'coach'], + action: allowAccessFunc }} - options={ - [ - { - img: '/img/edit-icon.svg', - action: allowAccess - } - ] - } />} ) diff --git a/src/store.js b/src/store.js index a30506543..036b2958f 100644 --- a/src/store.js +++ b/src/store.js @@ -61,7 +61,7 @@ import { communityDeleteReducer, communityUpdateReducer } from './reducers/communityReducers' -import { memberListReducer } from './reducers/memberReducers' +import { memberAccessReducer, memberListReducer } from './reducers/memberReducers' import { addEnrollReducer } from './reducers/enrollReducer' import { questionDeleteReducer, questionListReducer, questionUpdateReducer } from './reducers/questionReducers' import { @@ -110,6 +110,7 @@ const reducer = combineReducers({ newsDelete: newsDeleteReducer, newsUpdate: newsUpdateReducer, listMember: memberListReducer, + accessMember: memberAccessReducer, userLogin: userLoginReducer, userRegister: userRegisterReducer, userConfirmCode: userConfirmCodeReducer, From cd597f42d992700d5d0e77848c93e31f6154cfdf Mon Sep 17 00:00:00 2001 From: Sujal Lama Date: Wed, 4 Aug 2021 14:37:34 +0545 Subject: [PATCH 10/15] re-rendering table on change --- .../controllers/communityUserController.js | 72 +++++++------------ api/src/routes/communityUserRouter.js | 7 +- src/actions/memberActions.js | 2 - src/components/cardImage/CardImage.jsx | 3 +- src/reducers/memberReducers.js | 2 +- src/screens/admin/CommunityMemberAdmin.jsx | 38 +++++----- .../communityMembers/CommunityMembers.jsx | 2 +- 7 files changed, 49 insertions(+), 77 deletions(-) diff --git a/api/src/controllers/communityUserController.js b/api/src/controllers/communityUserController.js index 9e7e41f0b..9ee772cf3 100644 --- a/api/src/controllers/communityUserController.js +++ b/api/src/controllers/communityUserController.js @@ -67,54 +67,30 @@ const followCommunity = async (req, res) => { const getAllMembers = async (req, res) => { try { - const data = await db.CommunityUser.findAll( - { - where: { communityId: req.params.id, active: true }, - attributes: ['userId', 'role'], - include: [{ - model: db.User, - attributes: ['firstName'] - }], - required: true - } - ) - res.json({ - data - }) - } catch (error) { - res.status(400).json({ error }) - } -} - -// @desc Get the community-users -// @route GET /api/community-users/admin/community/:id -// @access Public - -const getAllMemberDetails = async (req, res) => { - try { - const data = await db.CommunityUser.findAll( - { - where: { communityId: req.params.id, active: true }, - attributes: ['id', 'userId', 'role'], - include: [{ - model: db.User, - attributes: ['firstName', 'lastName', 'email', 'phone', 'dateOfBirth'] - }], - required: true + const data = await db.CommunityUser.findAll( + { + where: { communityId: req.params.id, active: true }, + attributes: ['id', 'userId', 'role'], + include: [{ + model: db.User, + attributes: ['firstName', 'lastName', 'email', 'phone', 'dateOfBirth'] + }], + required: true + } + ) + + // flattening the array to show only one object + const newArray = data.map(item => { + const { userId, role, id } = item.dataValues + const { ...rest } = item.user + return { id, userId, role, ...rest.dataValues } } - ) - - // flattening the array to show only one object - const newArray = data.map(item => { - const { userId, role, id } = item.dataValues - const { ...rest } = item.user - return { id, userId, role, ...rest.dataValues } - } - ) - - res.json({ - results: newArray - }) + ) + + res.json({ + results : newArray + }) + return; } catch (error) { res.status(400).json({ error }) } @@ -162,4 +138,4 @@ const searchMemberName = (req, res) => { .catch(err => res.json({ error: err }).status(400)) } -module.exports = { followCommunity, getAllMembers, searchMemberName, updateMemberRole, getAllMemberDetails } +module.exports = { followCommunity, getAllMembers, searchMemberName, updateMemberRole} diff --git a/api/src/routes/communityUserRouter.js b/api/src/routes/communityUserRouter.js index b46f0b0b8..8279ee6d9 100644 --- a/api/src/routes/communityUserRouter.js +++ b/api/src/routes/communityUserRouter.js @@ -1,12 +1,11 @@ -const { followCommunity, getAllMembers, searchMemberName, updateMemberRole, getAllMemberDetails } = require('../controllers/communityUserController') +const { followCommunity, getAllMembers, searchMemberName, updateMemberRole } = require('../controllers/communityUserController') const protect = require('../middleware/authMiddleware') const permit = require('../middleware/permission') const router = require('express').Router() router.post('/follow', protect, followCommunity) -router.get('/community/:id', protect, getAllMembers) +router.get('/community/:id', protect, permit(['manager', 'member']), getAllMembers) router.get('/community/:id/search', searchMemberName) router.put('/:memberId/community/:id/', protect, permit(['manager']), updateMemberRole) -// router.put('/:id', updateCommunityUsers); -router.get('/admin/community/:id', protect, permit(['manager']), getAllMemberDetails) + module.exports = router diff --git a/src/actions/memberActions.js b/src/actions/memberActions.js index 7c426784a..c4bc47a5b 100644 --- a/src/actions/memberActions.js +++ b/src/actions/memberActions.js @@ -22,8 +22,6 @@ export const listMembers = () => async ( dispatch, `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/community/${currentCommunity.id}` ) - - console.log(data); dispatch({ type: MEMBER_LIST_SUCCESS, payload: data diff --git a/src/components/cardImage/CardImage.jsx b/src/components/cardImage/CardImage.jsx index b60283d83..eaeb87e76 100644 --- a/src/components/cardImage/CardImage.jsx +++ b/src/components/cardImage/CardImage.jsx @@ -34,6 +34,7 @@ const Follow = () => { function CardImage ({ data = [], className }) { const history = useHistory() + console.log(data) return ( <> {data.length > 0 && data.map((profile) => { @@ -43,7 +44,7 @@ function CardImage ({ data = [], className }) { group-profile
-
{profile?.user.firstName || 'anonymous'}
+
{profile.firstName || 'anonymous'}
{Follow()} diff --git a/src/reducers/memberReducers.js b/src/reducers/memberReducers.js index 9c4ae0528..24d8b9617 100644 --- a/src/reducers/memberReducers.js +++ b/src/reducers/memberReducers.js @@ -14,7 +14,7 @@ export const memberListReducer = (state = { members: [] }, action) => { case MEMBER_LIST_SUCCESS: return { loading: false, - members: action.payload, + members: action.payload.results, pages: action.payload.pages, page: action.payload.page } diff --git a/src/screens/admin/CommunityMemberAdmin.jsx b/src/screens/admin/CommunityMemberAdmin.jsx index 85f779d1d..aa5174655 100644 --- a/src/screens/admin/CommunityMemberAdmin.jsx +++ b/src/screens/admin/CommunityMemberAdmin.jsx @@ -1,6 +1,6 @@ import React, { useEffect, useLayoutEffect, useState } from 'react' import { useDispatch, useSelector } from 'react-redux' -import { allowAccess } from '../../actions/memberActions' +import { allowAccess, listMembers } from '../../actions/memberActions' import Table from '../../components/table/Table' import DashboardLayout from '../../layout/dashboardLayout/DashboardLayout' import { getApi} from '../../utils/apiFunc' @@ -8,42 +8,40 @@ import { getCommunity } from '../../utils/getCommunity' import './CommunityMemberAdmin.scss' const ComMemberAdmin = () => { - const [data, setData] = useState([]) - const [success, setSuccess] = useState(0) + const [data, setData] = useState([]); const memberData = useSelector(state => state.accessMember) - // const {success} = memberData - + const { members } = useSelector(state => state.listMember) + const {success} = memberData const dispatch = useDispatch() // fetching current community const currentCommunity = getCommunity() useEffect(() => { - getMemberDetails() - if(memberData) { - setSuccess(memberData.success) + dispatch(listMembers()) + if(members) { + setData(members) } - }, [success]) + }, [dispatch, success]) const allowAccessFunc = async (id, role) => { dispatch(allowAccess(id, role)); } - console.log(success); - const getMemberDetails = async () => { - const { data } = await getApi( - dispatch, - `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/admin/community/${currentCommunity.id}` - ) - - setData(data.results) - } + + // const getMemberDetails = async () => { + // const { data } = await getApi( + // dispatch, + // `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/community/${currentCommunity.id}` + // ) + // setData(data.results) + // } return ( - {data.length &&
{propKey}OptionsOptionsOptions
{item[propkey]} + {options.length > 0 &&
{ options.map(el => { @@ -63,6 +70,9 @@ const Table = ({ addSymbolNumber, data = { tblData: [] }, options = [] }) => { }
- {members && } + {members.length && }
From b2d31b3ff1dbfd86126c8143052795f0d3a2a9d1 Mon Sep 17 00:00:00 2001 From: Sujal Lama Date: Wed, 4 Aug 2021 17:44:24 +0545 Subject: [PATCH 11/15] creating single controller and dropdown button edit --- .../controllers/communityUserController.js | 28 ++++++++++--- api/src/middleware/permission.js | 42 +++++++++++-------- src/actions/memberActions.js | 1 + src/components/cardImage/CardImage.jsx | 3 +- src/components/dropDown/DropDown.jsx | 6 ++- src/components/table/Table.jsx | 1 - 6 files changed, 54 insertions(+), 27 deletions(-) diff --git a/api/src/controllers/communityUserController.js b/api/src/controllers/communityUserController.js index 9ee772cf3..0b61dac1d 100644 --- a/api/src/controllers/communityUserController.js +++ b/api/src/controllers/communityUserController.js @@ -67,6 +67,10 @@ const followCommunity = async (req, res) => { const getAllMembers = async (req, res) => { try { + const communityId = req.params.id; + const member = await db.CommunityUser.findOne({ where: { userId: req.user.id, communityId }, attributes: ['role'] }) + + if(member.dataValues.role === 'manager') { const data = await db.CommunityUser.findAll( { where: { communityId: req.params.id, active: true }, @@ -78,19 +82,33 @@ const getAllMembers = async (req, res) => { required: true } ) - + // flattening the array to show only one object const newArray = data.map(item => { const { userId, role, id } = item.dataValues - const { ...rest } = item.user - return { id, userId, role, ...rest.dataValues } - } - ) + return { id, userId, role, ...item.user.dataValues } + }) res.json({ results : newArray }) return; + } + + const newData = await db.CommunityUser.findAll( + { + where: { communityId, active: true }, + attributes: ['userId', 'role'], + include: [{ + model: db.User, + attributes: ['firstName'] + }], + required: true + } + ) + return res.json({ + results: newData + }) } catch (error) { res.status(400).json({ error }) } diff --git a/api/src/middleware/permission.js b/api/src/middleware/permission.js index e6a7eb668..8e172bf7c 100644 --- a/api/src/middleware/permission.js +++ b/api/src/middleware/permission.js @@ -1,31 +1,37 @@ const db = require('../models') -function checkRole (dbRole, roles) { - return roles.some(el => el === dbRole) -} - -// async function checkMemberRole(req, roles) { -// const member = await db.CommunityUser.findOne({ where: { userId: req.user.id, communityId: req.params.id }, attributes: ['role'] }) -// console.log(member.dataValues.role); -// console.log(checkRole(member.dataValues.role, roles)) -// if (checkRole(member.dataValues.role, roles)) { -// return true; -// } else { -// return false; -// } -// } - const permit = (roles) => { return async (req, res, next) => { // getting member role const member = await db.CommunityUser.findOne({ where: { userId: req.user.id, communityId: req.params.id }, attributes: ['role'] }) - if (checkRole(member.dataValues.role, roles) || checkRole(req.user.role, roles)) { - next() + if(member.dataValues.role) { + checkMemberRoles(roles, member, next, res) } else { - res.json({ error: 'Sorry, You don\'t have permission' }) + checkUserRoles(roles, next, res, req) } + } } +const checkRole = (roles, dbRole) => { + return roles.includes(dbRole) +} + +const checkMemberRoles = (roles, member, next, res) => { + if (checkRole(roles, member.dataValues.role)) { + next() + } else { + res.json({ error: 'Sorry, You don\'t have permission' }) + } +} + +const checkUserRoles = (roles, next, res, req) => { + if (checkRole(roles, req.user.role)) { + next() + } else { + res.json({ error: 'Sorry, You don\'t have permission' }) + } +} + module.exports = permit diff --git a/src/actions/memberActions.js b/src/actions/memberActions.js index c4bc47a5b..d92df1086 100644 --- a/src/actions/memberActions.js +++ b/src/actions/memberActions.js @@ -22,6 +22,7 @@ export const listMembers = () => async ( dispatch, `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/community/${currentCommunity.id}` ) + console.log(data); dispatch({ type: MEMBER_LIST_SUCCESS, payload: data diff --git a/src/components/cardImage/CardImage.jsx b/src/components/cardImage/CardImage.jsx index eaeb87e76..ff5880c45 100644 --- a/src/components/cardImage/CardImage.jsx +++ b/src/components/cardImage/CardImage.jsx @@ -34,7 +34,6 @@ const Follow = () => { function CardImage ({ data = [], className }) { const history = useHistory() - console.log(data) return ( <> {data.length > 0 && data.map((profile) => { @@ -44,7 +43,7 @@ function CardImage ({ data = [], className }) { group-profile
-
{profile.firstName || 'anonymous'}
+
{profile.user !== undefined ? (profile.user.firstName || 'anonymous') : (profile.firstName || 'anonymous')}
{Follow()} diff --git a/src/components/dropDown/DropDown.jsx b/src/components/dropDown/DropDown.jsx index 22578f86e..89080482a 100644 --- a/src/components/dropDown/DropDown.jsx +++ b/src/components/dropDown/DropDown.jsx @@ -1,8 +1,12 @@ import React, { useState } from 'react' +import useHideOnClick from '../../utils/useHideOnClick'; import './DropDown.scss'; const DropDown = ({data, title, getRole, id, role}) => { const[active, setActive] = useState() + const domNode = useHideOnClick(() => { + setActive(false) + }) function clickHandler (item) { setActive(false) @@ -10,7 +14,7 @@ const DropDown = ({data, title, getRole, id, role}) => { } return ( -
+
setActive(!active)} className='dropdown-title'> {title} Date: Wed, 4 Aug 2021 17:48:51 +0545 Subject: [PATCH 12/15] lint fix of js --- .../controllers/communityUserController.js | 24 ++++++++--------- api/src/middleware/permission.js | 21 +++++++-------- src/actions/memberActions.js | 4 +-- src/components/dropDown/DropDown.jsx | 26 +++++++++---------- src/components/table/Table.jsx | 4 +-- 5 files changed, 38 insertions(+), 41 deletions(-) diff --git a/api/src/controllers/communityUserController.js b/api/src/controllers/communityUserController.js index 0b61dac1d..2edef3d10 100644 --- a/api/src/controllers/communityUserController.js +++ b/api/src/controllers/communityUserController.js @@ -66,11 +66,11 @@ const followCommunity = async (req, res) => { // @access Public const getAllMembers = async (req, res) => { - try { - const communityId = req.params.id; - const member = await db.CommunityUser.findOne({ where: { userId: req.user.id, communityId }, attributes: ['role'] }) - - if(member.dataValues.role === 'manager') { + try { + const communityId = req.params.id + const member = await db.CommunityUser.findOne({ where: { userId: req.user.id, communityId }, attributes: ['role'] }) + + if (member.dataValues.role === 'manager') { const data = await db.CommunityUser.findAll( { where: { communityId: req.params.id, active: true }, @@ -82,18 +82,18 @@ const getAllMembers = async (req, res) => { required: true } ) - + // flattening the array to show only one object const newArray = data.map(item => { const { userId, role, id } = item.dataValues return { id, userId, role, ...item.user.dataValues } }) - + res.json({ - results : newArray + results: newArray }) - return; - } + return + } const newData = await db.CommunityUser.findAll( { @@ -106,7 +106,7 @@ const getAllMembers = async (req, res) => { required: true } ) - return res.json({ + return res.json({ results: newData }) } catch (error) { @@ -156,4 +156,4 @@ const searchMemberName = (req, res) => { .catch(err => res.json({ error: err }).status(400)) } -module.exports = { followCommunity, getAllMembers, searchMemberName, updateMemberRole} +module.exports = { followCommunity, getAllMembers, searchMemberName, updateMemberRole } diff --git a/api/src/middleware/permission.js b/api/src/middleware/permission.js index 8e172bf7c..faf9774f9 100644 --- a/api/src/middleware/permission.js +++ b/api/src/middleware/permission.js @@ -5,12 +5,11 @@ const permit = (roles) => { // getting member role const member = await db.CommunityUser.findOne({ where: { userId: req.user.id, communityId: req.params.id }, attributes: ['role'] }) - if(member.dataValues.role) { + if (member.dataValues.role) { checkMemberRoles(roles, member, next, res) } else { checkUserRoles(roles, next, res, req) } - } } @@ -20,18 +19,18 @@ const checkRole = (roles, dbRole) => { const checkMemberRoles = (roles, member, next, res) => { if (checkRole(roles, member.dataValues.role)) { - next() - } else { - res.json({ error: 'Sorry, You don\'t have permission' }) - } + next() + } else { + res.json({ error: 'Sorry, You don\'t have permission' }) + } } const checkUserRoles = (roles, next, res, req) => { - if (checkRole(roles, req.user.role)) { - next() - } else { - res.json({ error: 'Sorry, You don\'t have permission' }) - } + if (checkRole(roles, req.user.role)) { + next() + } else { + res.json({ error: 'Sorry, You don\'t have permission' }) + } } module.exports = permit diff --git a/src/actions/memberActions.js b/src/actions/memberActions.js index d92df1086..3fb4345fe 100644 --- a/src/actions/memberActions.js +++ b/src/actions/memberActions.js @@ -22,7 +22,7 @@ export const listMembers = () => async ( dispatch, `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/community/${currentCommunity.id}` ) - console.log(data); + console.log(data) dispatch({ type: MEMBER_LIST_SUCCESS, payload: data @@ -66,7 +66,7 @@ export const allowAccess = (id, role) => async ( ) => { try { dispatch({ type: MEMBER_ACCESS_REQUEST }) - const {data} = await putApi( + const { data } = await putApi( dispatch, `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/${id}/community/${currentCommunity.id}`, { role } diff --git a/src/components/dropDown/DropDown.jsx b/src/components/dropDown/DropDown.jsx index 89080482a..fa1b6297b 100644 --- a/src/components/dropDown/DropDown.jsx +++ b/src/components/dropDown/DropDown.jsx @@ -1,12 +1,12 @@ import React, { useState } from 'react' -import useHideOnClick from '../../utils/useHideOnClick'; -import './DropDown.scss'; +import useHideOnClick from '../../utils/useHideOnClick' +import './DropDown.scss' -const DropDown = ({data, title, getRole, id, role}) => { - const[active, setActive] = useState() +const DropDown = ({ data, title, getRole, id, role }) => { + const [active, setActive] = useState() const domNode = useHideOnClick(() => { - setActive(false) - }) + setActive(false) + }) function clickHandler (item) { setActive(false) @@ -18,22 +18,20 @@ const DropDown = ({data, title, getRole, id, role}) => {
setActive(!active)} className='dropdown-title'> {title}
{active && (
    - {data.length > 0 && + {data.length > 0 && data.filter(el => el !== role).map((item) => (
  • clickHandler(item)}>{item}
  • - )) - } + ))}
- ) - } + )}
- ) + ) } export default DropDown diff --git a/src/components/table/Table.jsx b/src/components/table/Table.jsx index 24e15574a..6db5c1901 100644 --- a/src/components/table/Table.jsx +++ b/src/components/table/Table.jsx @@ -19,7 +19,7 @@ import './Table.scss' // img: the path of the image you want to show as button // action: this holds function that is executed when the button is clicked (fn: returns id of the item) -const Table = ({ addSymbolNumber, data = { tblData: [] }, options = [], dropdown= {dropdownList : []} }) => { +const Table = ({ addSymbolNumber, data = { tblData: [] }, options = [], dropdown = { dropdownList: [] } }) => { const [property, setProperty] = useState([]) const [header, setHeader] = useState([]) const [tblData, setTblData] = useState([]) @@ -70,7 +70,7 @@ const Table = ({ addSymbolNumber, data = { tblData: [] }, options = [], dropdown
} { - dropdown.dropdownList.length > 0 &&
+ dropdown.dropdownList.length > 0 && } ) From 3b98b1f320d27ce1aaf06543e5c7d5674495c159 Mon Sep 17 00:00:00 2001 From: Sujal Lama Date: Wed, 4 Aug 2021 17:55:11 +0545 Subject: [PATCH 13/15] unused code replaced in community user controller --- api/src/controllers/communityUserController.js | 1 - 1 file changed, 1 deletion(-) diff --git a/api/src/controllers/communityUserController.js b/api/src/controllers/communityUserController.js index 2edef3d10..86f04513e 100644 --- a/api/src/controllers/communityUserController.js +++ b/api/src/controllers/communityUserController.js @@ -133,7 +133,6 @@ const updateMemberRole = async (req, res) => { // @access Private const searchMemberName = (req, res) => { const { name } = req.query - const order = req.query.order || 'ASC' db.CommunityUser.findAll( { From 41b81e6878870e2ec1f52a1511a2e47af5cba912 Mon Sep 17 00:00:00 2001 From: Sujal Lama Date: Thu, 5 Aug 2021 10:21:19 +0545 Subject: [PATCH 14/15] permission.js refactored --- api/src/middleware/permission.js | 28 +++++++++++++++++++-------- api/src/routes/categoriesRouter.js | 4 ++-- api/src/routes/communityUserRouter.js | 4 ++-- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/api/src/middleware/permission.js b/api/src/middleware/permission.js index faf9774f9..d693b3c6b 100644 --- a/api/src/middleware/permission.js +++ b/api/src/middleware/permission.js @@ -1,15 +1,26 @@ const db = require('../models') -const permit = (roles) => { +const permit = (category, roles) => { return async (req, res, next) => { - // getting member role - const member = await db.CommunityUser.findOne({ where: { userId: req.user.id, communityId: req.params.id }, attributes: ['role'] }) - if (member.dataValues.role) { - checkMemberRoles(roles, member, next, res) - } else { - checkUserRoles(roles, next, res, req) + switch(category) { + case 'community-member': + checkMemberRoles(roles, next, res, req) + break; + case 'user': + checkUserRoles(roles, next, res, req) + break; + default: + res.json({ error: 'Sorry, You don\'t have permission' }) } + // // getting member role + // const member = await db.CommunityUser.findOne({ where: { userId: req.user.id, communityId: req.params.id }, attributes: ['role'] }) + + // if (member.dataValues.role) { + // checkMemberRoles(roles, member, next, res) + // } else { + // checkUserRoles(roles, next, res, req) + // } } } @@ -17,7 +28,8 @@ const checkRole = (roles, dbRole) => { return roles.includes(dbRole) } -const checkMemberRoles = (roles, member, next, res) => { +const checkMemberRoles = async (roles, next, res, req) => { + const member = await db.CommunityUser.findOne({ where: { userId: req.user.id, communityId: req.params.id }, attributes: ['role'] }) if (checkRole(roles, member.dataValues.role)) { next() } else { diff --git a/api/src/routes/categoriesRouter.js b/api/src/routes/categoriesRouter.js index 22482b388..83a91ba44 100644 --- a/api/src/routes/categoriesRouter.js +++ b/api/src/routes/categoriesRouter.js @@ -10,7 +10,7 @@ const { } = require('../controllers/categoryController') const permit = require('../middleware/permission') -router.route('/').get(protect, getCategories).post(protect, permit(['sysadmin']), addCategory) -router.route('/:id').get(getSingleCategory).put(protect, permit(['sysadmin']), updateCategory).delete(protect, permit(['sysadmin']), deleteCategory) +router.route('/').get(protect, getCategories).post(protect, permit('user', ['sysadmin']), addCategory) +router.route('/:id').get(getSingleCategory).put(protect, permit('user', ['sysadmin']), updateCategory).delete(protect, permit(['sysadmin']), deleteCategory) module.exports = router diff --git a/api/src/routes/communityUserRouter.js b/api/src/routes/communityUserRouter.js index 8279ee6d9..67638bb0d 100644 --- a/api/src/routes/communityUserRouter.js +++ b/api/src/routes/communityUserRouter.js @@ -4,8 +4,8 @@ const permit = require('../middleware/permission') const router = require('express').Router() router.post('/follow', protect, followCommunity) -router.get('/community/:id', protect, permit(['manager', 'member']), getAllMembers) +router.get('/community/:id', protect, permit('community-member', ['manager','member']), getAllMembers) router.get('/community/:id/search', searchMemberName) -router.put('/:memberId/community/:id/', protect, permit(['manager']), updateMemberRole) +router.put('/:memberId/community/:id/', protect, permit('community-member', ['manager']), updateMemberRole) module.exports = router From dd29d0071e40bd696c5fd90ebb750bc40d13c42d Mon Sep 17 00:00:00 2001 From: Sujal Lama Date: Thu, 5 Aug 2021 10:51:10 +0545 Subject: [PATCH 15/15] dropdown edit --- src/actions/memberActions.js | 1 - src/components/dropDown/DropDown.jsx | 8 +++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/actions/memberActions.js b/src/actions/memberActions.js index 3fb4345fe..778d14164 100644 --- a/src/actions/memberActions.js +++ b/src/actions/memberActions.js @@ -22,7 +22,6 @@ export const listMembers = () => async ( dispatch, `${process.env.REACT_APP_API_BASE_URL}/api/communities-users/community/${currentCommunity.id}` ) - console.log(data) dispatch({ type: MEMBER_LIST_SUCCESS, payload: data diff --git a/src/components/dropDown/DropDown.jsx b/src/components/dropDown/DropDown.jsx index fa1b6297b..b2687cab2 100644 --- a/src/components/dropDown/DropDown.jsx +++ b/src/components/dropDown/DropDown.jsx @@ -1,4 +1,6 @@ import React, { useState } from 'react' +import { useEffect } from 'react' +import { useRef } from 'react' import useHideOnClick from '../../utils/useHideOnClick' import './DropDown.scss' @@ -12,10 +14,14 @@ const DropDown = ({ data, title, getRole, id, role }) => { setActive(false) getRole(item, id) } + + function showDropdown () { + setActive(!active) + } return (
-
setActive(!active)} className='dropdown-title'> +
{title}