diff --git a/actions/adminActions.js b/actions/adminActions.js new file mode 100644 index 0000000..c0f697c --- /dev/null +++ b/actions/adminActions.js @@ -0,0 +1,77 @@ +import axios from 'axios'; +import { Cookies } from 'react-cookie'; +import Router from 'next/router'; +import moment from 'moment'; + +import * as actionTypes from '../constants/actionTypes'; +import * as currentState from '../reducers/initialState'; + +export const getUsers = ({ dispatch }) => +{ + console.log("ACTION", "getUsers()"); + + return new Promise((resolve, reject) => + { + axios.post(`${ process.env.NEXT_PUBLIC_SELF_API_HOST }/api/admin/`, {}) + .then(async (response) => + { + console.log("getContractRules", "response.data", response.data); + dispatch({ type: actionTypes.ADMIN, data: { users: response.data.users } }); + + resolve(); + }) + .catch((error) => + { + console.error("ACTION", "getUsers()", "error"); + console.error(error); + + reject(); + }); + }); +} + +export const sendInvite = ({ name, email, companies }) => +{ + console.log("ACTION", "sendInvite()", { name, email, companies }); + + return new Promise((resolve, reject) => + { + axios.post(`${ process.env.NEXT_PUBLIC_SELF_API_HOST }/api/admin/invite`, { name, email, companies }) + .then(async (response) => + { + console.log("ACTION", "sendInvite()", "response.data", response.data); + + resolve(); + }) + .catch((error) => + { + console.error("ACTION", "sendInvite()", "error"); + console.error(error); + + reject(); + }); + }); +} + +export const removeUser = ({ email }) => +{ + console.log("ACTION", "removeUser()", { name, email, companies }); + + return new Promise((resolve, reject) => + { + axios.post(`${ process.env.NEXT_PUBLIC_SELF_API_HOST }/api/admin/remove`, { name, email, companies }) + .then(async (response) => + { + console.log("ACTION", "removeUser()", "response.data", response.data); + + resolve(); + }) + .catch((error) => + { + console.error("ACTION", "removeUser()", "error"); + console.error(error); + + reject(); + }); + }); +} \ No newline at end of file diff --git a/actions/authActions.js b/actions/authActions.js index 7b0cd19..fb547b8 100644 --- a/actions/authActions.js +++ b/actions/authActions.js @@ -223,7 +223,7 @@ export const getUsers = ({ dispatch }) => return new Promise((resolve, reject) => { - axios.post(`${ process.env.NEXT_PUBLIC_SELF_API_HOST }/api/auth/admin/`, {}) + axios.post(`${ process.env.NEXT_PUBLIC_SELF_API_HOST }/api/admin/`, {}) .then(async (response) => { console.log("getContractRules", "response.data", response.data); diff --git a/pages/api/auth/admin.js b/pages/api/admin/index.js similarity index 100% rename from pages/api/auth/admin.js rename to pages/api/admin/index.js diff --git a/pages/api/admin/invite.js b/pages/api/admin/invite.js new file mode 100644 index 0000000..75a4a76 --- /dev/null +++ b/pages/api/admin/invite.js @@ -0,0 +1,82 @@ +// Next.js API route support: https://nextjs.org/docs/api-routes/introduction +import axios from 'axios'; +import { Cookies } from 'react-cookie'; +import cookie from 'cookie'; +import moment from 'moment'; +import jwt from 'jsonwebtoken'; + +import { cors } from '../../../lib/cors'; + +export default async function handler(req, res) +{ + await cors(req, res); + let { name, email, companies } = req.body; + + console.log("API", "admin/invite"); + if(req.headers.cookie !== undefined) + { + const cookies = cookie.parse(req.headers?.cookie ? req.headers?.cookie : ""); + + if(cookies.jwt !== undefined && cookies.jwt !== null) + { + let allow = false; + let company = {}; + let client_jwt_decoded = jwt.verify(cookies.jwt, process.env.JWT_SECRET_CLIENT); + + console.log("API", "admin/invite", "client_jwt_decoded", client_jwt_decoded); + + const admin_companies = client_jwt_decoded.companies; + const allowed_companies = []; + + if(admin_companies !== undefined && admin_companies !== null) + { + if(companies !== undefined && companies !== null) + { + for(let c in companies) + { + for(let ac in admin_companies) + { + if(admin_companies[ac].acc_number === companies[c]) + { + allowed_companies.push(companies[c]); + } + } + } + + if(allowed_companies.length > 0) + { + const payload = { name, email, companies, }; + console.log("payload"); + console.log(payload); + + const crm_jwt = jwt.sign(payload, process.env.JWT_SECRET_CRM, { noTimestamp: true }); + + res.status(200).send({ + status: "success", + }); + } + else + { + res.status(403).json(); + } + } + else + { + res.status(403).json(); + } + } + else + { + res.status(403).json(); + } + } + else + { + res.status(403).json(); + } + } + else + { + res.status(403).json(); + } +} \ No newline at end of file diff --git a/pages/api/admin/remove.js b/pages/api/admin/remove.js new file mode 100644 index 0000000..fa72bd5 --- /dev/null +++ b/pages/api/admin/remove.js @@ -0,0 +1,35 @@ +// Next.js API route support: https://nextjs.org/docs/api-routes/introduction +import axios from 'axios'; +import { Cookies } from 'react-cookie'; +import cookie from 'cookie'; +import moment from 'moment'; +import jwt from 'jsonwebtoken'; + +import { cors } from '../../../lib/cors'; + +export default async function handler(req, res) +{ + await cors(req, res); + let { email } = req.body; + + console.log("API", "admin/remove"); + if(req.headers.cookie !== undefined) + { + const cookies = cookie.parse(req.headers?.cookie ? req.headers?.cookie : ""); + + if(cookies.jwt !== undefined && cookies.jwt !== null) + { + res.status(200).send({ + status: "success", + }); + } + else + { + res.status(403).json(); + } + } + else + { + res.status(403).json(); + } +} \ No newline at end of file diff --git a/pages/settings/admin.js b/pages/settings/admin.js index eca5c9f..788b367 100644 --- a/pages/settings/admin.js +++ b/pages/settings/admin.js @@ -36,12 +36,18 @@ class Form extends React.Component _handle_onChange = (field, value) => { - this.setState({ [ field ]: value }); + this.setState({ [ field ]: value }, () => + { + this.props.onForm(this.state); + }); } _handle_onCompaniesSelection = () => { - this.setState({ selection: this.state.selection ? false : true }); + this.setState({ selection: this.state.selection ? false : true }, () => + { + this.props.onForm(this.state); + }); } _handle_onChangeCompanies_all = () => @@ -60,7 +66,10 @@ class Form extends React.Component } } - this.setState({ selected_companies_all: selected_companies_all ? false : true, selected_companies_list: selected_companies }); + this.setState({ selected_companies_all: selected_companies_all ? false : true, selected_companies_list: selected_companies }, () => + { + this.props.onForm(this.state); + }); } _handle_onCompanySelect = (company) => @@ -92,7 +101,10 @@ class Form extends React.Component all = true; } - this.setState({ selected_companies_all: all, selected_companies_list: selected_companies }); + this.setState({ selected_companies_all: all, selected_companies_list: selected_companies }, () => + { + this.props.onForm(this.state); + }); } render() @@ -166,7 +178,9 @@ class AdminPage extends React.Component users: null, companies: null, add: false, - edit: false, + edit: false, + save: false, + form: {}, }; } @@ -207,6 +221,10 @@ class AdminPage extends React.Component _handle_onSave = () => { + const { form } = this.state; + console.log("form"); + console.log(form); + this.setState({ add: false, edit: false }); } @@ -215,9 +233,33 @@ class AdminPage extends React.Component this.setState({ add: false, edit: false }); } + _onFormEdit = (form) => + { + console.log("_onFormEdit", form); + + let save = true; + if(form.name === "") + { + save = false; + } + if(form.email === "") + { + save = false; + } + if(!form.selected_companies_all) + { + if(form.selected_companies_list.length === 0) + { + save = false; + } + } + + this.setState({ form, save }); + } + render() { - const { user, users, companies, add, edit } = this.state; + const { user, users, companies, add, edit, save } = this.state; console.log("users"); console.log(users); @@ -255,7 +297,7 @@ class AdminPage extends React.Component { add || edit ? ( <> - + ) : ( <> @@ -344,7 +386,7 @@ class AdminPage extends React.Component {*/} { add && ( -
+ ) } {/*} {*/}