From ae1c3cc79e8daee341167374721f94b4fa31cf33 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 24 Oct 2018 13:48:08 +0200 Subject: [PATCH] Removes a set of folders outside SRC and implements the changes needed to fix #7 --- client/components/About.js | 51 --- client/components/Browse.js | 14 - client/components/Contact.js | 52 --- client/components/DescendentsTree.js | 258 ----------- client/components/Home.js | 104 ----- client/components/LoggedInUser.js | 135 ------ client/components/NavBar.js | 151 ------- client/components/ProfileImages.js | 52 --- client/components/ProfileSheet.js | 497 ---------------------- client/components/Search.js | 37 -- client/components/User.js | 14 - client/components/UserList.js | 185 -------- client/components/UserProfile.js | 112 ----- client/components/UserSearch.js | 267 ------------ client/components/UserTabs.js | 85 ---- client/components/YourDescendents.js | 86 ---- client/components/YourReferrer.js | 145 ------- client/img/aa-logo-dark-8.png | Bin 801 -> 0 bytes client/img/aa-logo.png | Bin 4770 -> 0 bytes client/img/auth0-logo.png | Bin 7493 -> 0 bytes client/img/email.png | Bin 472 -> 0 bytes client/img/github-head-negative.png | Bin 40621 -> 0 bytes client/img/github-head.png | Bin 41025 -> 0 bytes client/img/github-logo.png | Bin 27632 -> 0 bytes client/img/github-negative.png | Bin 9042 -> 0 bytes client/img/github.png | Bin 7157 -> 0 bytes client/img/portrait.jpg | Bin 21688 -> 0 bytes client/index.js | 86 ---- client/public/favicon.ico | Bin 758 -> 0 bytes client/public/index.html | 57 --- client/public/manifest.json | 15 - client/queries/queries.js | 165 ------- client/src/components/ProfileSheet.js | 1 - client/src/components/YourReferrer.js | 1 - client/src/queries/queries.js | 25 +- client/theme.js | 65 --- server/app.js | 13 +- server/package-lock.json | 210 +++++++++ server/package.json | 3 +- server/schema/schema.js | 86 ++-- {client => server}/utils/local-storage.js | 0 {client/config => server/utils}/logger.js | 0 42 files changed, 265 insertions(+), 2707 deletions(-) delete mode 100644 client/components/About.js delete mode 100644 client/components/Browse.js delete mode 100644 client/components/Contact.js delete mode 100644 client/components/DescendentsTree.js delete mode 100644 client/components/Home.js delete mode 100644 client/components/LoggedInUser.js delete mode 100644 client/components/NavBar.js delete mode 100644 client/components/ProfileImages.js delete mode 100644 client/components/ProfileSheet.js delete mode 100644 client/components/Search.js delete mode 100644 client/components/User.js delete mode 100644 client/components/UserList.js delete mode 100644 client/components/UserProfile.js delete mode 100644 client/components/UserSearch.js delete mode 100644 client/components/UserTabs.js delete mode 100644 client/components/YourDescendents.js delete mode 100644 client/components/YourReferrer.js delete mode 100644 client/img/aa-logo-dark-8.png delete mode 100644 client/img/aa-logo.png delete mode 100644 client/img/auth0-logo.png delete mode 100644 client/img/email.png delete mode 100644 client/img/github-head-negative.png delete mode 100644 client/img/github-head.png delete mode 100644 client/img/github-logo.png delete mode 100644 client/img/github-negative.png delete mode 100644 client/img/github.png delete mode 100644 client/img/portrait.jpg delete mode 100644 client/index.js delete mode 100644 client/public/favicon.ico delete mode 100644 client/public/index.html delete mode 100644 client/public/manifest.json delete mode 100644 client/queries/queries.js delete mode 100644 client/theme.js rename {client => server}/utils/local-storage.js (100%) rename {client/config => server/utils}/logger.js (100%) diff --git a/client/components/About.js b/client/components/About.js deleted file mode 100644 index bed14f40e..000000000 --- a/client/components/About.js +++ /dev/null @@ -1,51 +0,0 @@ -import React from 'react' -import Button from '@material-ui/core/Button' -import Dialog from '@material-ui/core/Dialog' -import DialogActions from '@material-ui/core/DialogActions' -import DialogContent from '@material-ui/core/DialogContent' -import DialogContentText from '@material-ui/core/DialogContentText' -import DialogTitle from '@material-ui/core/DialogTitle' -import CssBaseline from '@material-ui/core/CssBaseline' - -class About extends React.Component { - state = { - open: true - } - - handleClickOpen = () => { - this.setState({ open: true }) - } - - handleClose = () => { - this.setState({ open: false }) - } - - render () { - return ( - - - - - {"Section under development."} - - - - The functionality of this section has not been developed yet. We expect to have it for November 2018. Thanks for your understanding. - - - - - - - - ) - } -} - -export default About diff --git a/client/components/Browse.js b/client/components/Browse.js deleted file mode 100644 index 2231b1f8b..000000000 --- a/client/components/Browse.js +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react' -import UserList from './UserList' -import CssBaseline from '@material-ui/core/CssBaseline' - -const Browse = () => { - return ( - - - - - ) -} - -export default Browse diff --git a/client/components/Contact.js b/client/components/Contact.js deleted file mode 100644 index 268efeaee..000000000 --- a/client/components/Contact.js +++ /dev/null @@ -1,52 +0,0 @@ -import React from 'react' -import Button from '@material-ui/core/Button' -import Dialog from '@material-ui/core/Dialog' -import DialogActions from '@material-ui/core/DialogActions' -import DialogContent from '@material-ui/core/DialogContent' -import DialogContentText from '@material-ui/core/DialogContentText' -import DialogTitle from '@material-ui/core/DialogTitle' -import CssBaseline from '@material-ui/core/CssBaseline' - -class Contact extends React.Component { - state = { - open: true - } - - handleClickOpen = () => { - this.setState({ open: true }) - } - - handleClose = () => { - this.setState({ open: false }) - } - - render () { - return ( - - - - - - {"Section under development."} - - - - The functionality of this section has not been developed yet. We expect to have it for November 2018. Thanks for your understanding. - - - - - - - - ) - } -} - -export default Contact diff --git a/client/components/DescendentsTree.js b/client/components/DescendentsTree.js deleted file mode 100644 index 9a1cb06ea..000000000 --- a/client/components/DescendentsTree.js +++ /dev/null @@ -1,258 +0,0 @@ -import React, { Component } from 'react' -import {graphql, compose} from 'react-apollo' -import {getDescendentsQuery} from '../queries/queries' - -// Materia UI - -import { withStyles } from '@material-ui/core/styles' -import Card from '@material-ui/core/Card' -import CardActionArea from '@material-ui/core/CardActionArea' -import CardActions from '@material-ui/core/CardActions' -import CardContent from '@material-ui/core/CardContent' -import CardMedia from '@material-ui/core/CardMedia' -import Typography from '@material-ui/core/Typography' -import Grid from '@material-ui/core/Grid' - -// Material UI Nestled Lists -import ListSubheader from '@material-ui/core/ListSubheader'; -import List from '@material-ui/core/List'; -import ListItem from '@material-ui/core/ListItem'; -import ListItemIcon from '@material-ui/core/ListItemIcon'; -import ListItemText from '@material-ui/core/ListItemText'; -import Collapse from '@material-ui/core/Collapse'; -import ExpandLess from '@material-ui/icons/ExpandLess'; -import ExpandMore from '@material-ui/icons/ExpandMore'; -import StarBorder from '@material-ui/icons/StarBorder'; - -// Images -import PortraitImage from '../img/portrait.jpg' - -const styles = theme => ({ - card: { - maxWidth: 300, - minWidth: 300, - paddingTop: '30' - }, - media: { - height: 0, - paddingTop: '56.25%', // 16:9, - marginTop: '30', - minWidth: 300 - }, - typography: { - maxWidth: 345, - minWidth: 300, - paddingTop: '30' - }, - appBar: { - position: 'relative' - }, - flex: { - flex: 1 - }, - grid: { - paddingTop: '30', - marginTop: 30 - }, - list: { - width: '80%', - marginLeft: '10%', - marginTop: 25 - }, - button: { - margin: theme.spacing.unit, - marginTop: theme.spacing.unit * 3 - }, - nested: { - paddingLeft: theme.spacing.unit * 4, - }, -}) - -class DescendentsTree extends Component { - - constructor (props) { - super(props) - - this.state = { - id: '', - open: true - } - } - - handleClick = () => { - this.setState(state => ({ open: !state.open })); -}; - - displayIcons(amount) { - - switch (amount) { - case 1: return ( -
- - - -
- ) - case 2: return ( -
- - - - - - -
- ) - case 3: return ( -
- - - - - - - - - -
- ) - default: return(
) - } - } - - displayNestedListItems(node, level) { - - const { classes } = this.props - return node.descendents.map(descendent => { - return ( -
- - {this.displayIcons(level)} - - - - - - {descendent.alias} - - - - - - - - - - - {this.displayNestedList(descendent, level)} -
- ) - } - ) - } - - displayNestedList(descendent, level) { - const primaryText = "Children of " + descendent.alias - if (descendent.descendents !== undefined) { - if (descendent.descendents.length > 0) { - return( - - { - this.setState(state => ({ [descendent.alias]: !state[descendent.alias] })); - } - }> - - {this.state[descendent.alias] ? : } - - - {this.displayNestedListItems(descendent, level + 1)} - - - ) - } else { - return (
) - } - } - } - - - displayTopList () { - let data = this.props.data - const { classes } = this.props - - if (data.loading) { - return (
Loading Descendents...
) - } else { - if (data.users_Descendents === undefined) { - return (
No Descendents to Display
) - } else { - return data.users_Descendents.map(descendent => { - return ( -
- - - {this.displayIcons(1)} - - - - - - {descendent.alias} - - - - - - - - - - - - {this.displayNestedList(descendent, 1)} - -
- ) - }) - } - } - } - - render () { - const { classes } = this.props - return ( -
- } - className={classes.list} - > - {this.displayTopList()} - -
- ) - } -} - -export default compose( - graphql(getDescendentsQuery, { // What follows is the way to pass a parameter to a query. - options: (props) => { - return { - variables: { - name: 'getDescendentsQuery', - id: props.userId - } - } - }}), - withStyles(styles) -)(DescendentsTree) // This technique binds more than one query to a single component. diff --git a/client/components/Home.js b/client/components/Home.js deleted file mode 100644 index bb829f8dd..000000000 --- a/client/components/Home.js +++ /dev/null @@ -1,104 +0,0 @@ -import React, { Component } from 'react' -import { compose } from 'recompose' -import { withStyles } from '@material-ui/core/styles' -import Grid from '@material-ui/core/Grid' -import Typography from '@material-ui/core/Typography' -import CssBaseline from '@material-ui/core/CssBaseline' - -const styles = theme => ({ - root: { - flexGrow: 1, - padding: 100 - }, - grid: { - margin: theme.spacing.unit, - width: '50%' - }, - typography: { - width: '100%', - marginTop: 20, - marginBottom: 20 - }, - '@global': { - body: { - backgroundColor: theme.palette.common.white - } - }, - layout: { - width: 'auto', - marginLeft: theme.spacing.unit * 3, - marginRight: theme.spacing.unit * 3, - [theme.breakpoints.up(900 + theme.spacing.unit * 3 * 2)]: { - width: 900, - marginLeft: 'auto', - marginRight: 'auto' - } - }, - heroContent: { - maxWidth: 600, - margin: '0 auto', - padding: `${theme.spacing.unit * 8}px 0 ${theme.spacing.unit * 6}px` - } -}) - -class Home extends Component { - - render () { - const { classes } = this.props - return ( - - -
-
- - Collaborate. Innovate. Evolve. - - - Welcome to Advanced Algos Users Module - -
-
- - - - - Intro - - - This module is responsible for managing users across the Advanced Algos system. Here you can browse the Users Directory, search for users and get to their profiles. You can create your own User profile if you sign up, or manage it if you already have one by logging in. - - - Development Status - - - This module is is currently under development. Implementation started 1st of September 2018 and this is the result of the 3rd sprint of 2 weeks of work each. - - - What can you do? - - - Currently you can use the Browse section to list all registered users. At the Search page you can searh for users by name. Clicking on View Profile you can see some more info about that user. You can signup with your Github account and manage your profile information while logged in. While loggedin, you can edit your profile info, define your referrer and view your descendants. You will find all features under develpment with a dialog indicating it is not ready. - - - - - -
- - ) - } -} - -export default compose( - withStyles(styles) -)(Home) diff --git a/client/components/LoggedInUser.js b/client/components/LoggedInUser.js deleted file mode 100644 index 933394e43..000000000 --- a/client/components/LoggedInUser.js +++ /dev/null @@ -1,135 +0,0 @@ -import React, { Component } from 'react' -import {graphql, compose} from 'react-apollo' -import {getUserByAuthIdQuery} from '../queries/queries' -import { withStyles } from '@material-ui/core/styles' -import classNames from 'classnames' - -import Button from '@material-ui/core/Button' -import IconButton from '@material-ui/core/IconButton' - -// icons -import UserIcon from '@material-ui/icons/Person' -import { Link } from 'react-router-dom' - -const UserLink = props => - -const styles = theme => ({ - root: { - flexGrow: 1 - }, - flex: { - flexGrow: 1, - marginLeft: 30 - }, - menuButton: { - marginLeft: -12, - marginRight: 20 - }, - cssRoot: { - color: '#FFFFFF', - backgroundColor: theme.palette.secondary, - '&:hover': { - backgroundColor: theme.palette.dark - }, - whiteSpace: 'nowrap', - paddingRight: 2 * theme.spacing.unit, - paddingLeft: 2 * theme.spacing.unit - }, - button: { - margin: theme.spacing.unit - }, - leftIcon: { - marginRight: theme.spacing.unit - }, - rightIcon: { - marginLeft: theme.spacing.unit - }, - iconSmall: { - fontSize: 20 - } -}) - -class LoggedInUser extends Component { - - displayLoggedInUser () { - const user = this.props.data.users_UserByAuthId - const { classes, match } = this.props - - if (user) { - let displayName = 'No Display Name' - - if ( - user.alias !== null && - user.alias !== '' - ) { displayName = user.alias } - - if ( - user.firstName !== null && - user.firstName !== '' - ) { displayName = user.firstName } - - if ( - user.firstName !== null && - user.firstName !== '' && - user.lastName !== null && - user.lastName !== '' - ) { displayName = user.firstName + ' ' + user.lastName } - - let authArray = this.props.authId.split('|') - let identityProvider = authArray[0] - - return ( -
- -
- ) - } else { - return ( -
- ) - } - } - - componentDidMount () { - - } - - render () { - if (this.loggedInUserStored !== true) { - let user = this.props.data.users_UserByAuthId - - if (user !== undefined) { - localStorage.setItem('loggedInUser', JSON.stringify(this.props.data.users_UserByAuthId)) - this.loggedInUserStored = true - } - } - - return ( -
- {this.displayLoggedInUser()} -
- ) - } -} - -export default compose( - graphql(getUserByAuthIdQuery, { // What follows is the way to pass a parameter to a query. - options: (props) => { - return { - variables: { - authId: props.authId - } - } - } - }), - withStyles(styles) -)(LoggedInUser) diff --git a/client/components/NavBar.js b/client/components/NavBar.js deleted file mode 100644 index 09d4edf3b..000000000 --- a/client/components/NavBar.js +++ /dev/null @@ -1,151 +0,0 @@ -import React, { Component } from 'react' -import PropTypes from 'prop-types' -import { withStyles } from '@material-ui/core/styles' -import classNames from 'classnames' -import AppBar from '@material-ui/core/AppBar' -import Toolbar from '@material-ui/core/Toolbar' -import Typography from '@material-ui/core/Typography' -import Button from '@material-ui/core/Button' - -// icons -import UsersIcon from '@material-ui/icons/People' -import BrowseIcon from '@material-ui/icons/ImportContacts' -import SearchIcon from '@material-ui/icons/Search' -import ContactIcon from '@material-ui/icons/ContactMail' -import AboutIcon from '@material-ui/icons/FormatShapes' - -import { Link } from 'react-router-dom' - -// components -import LoggedInUser from './LoggedInUser' - -const HomeLink = props => -const BrowseLink = props => -const SearchLink = props => -const AboutLink = props => - -const styles = theme => ({ - root: { - flexGrow: 1 - }, - flex: { - flexGrow: 1, - marginLeft: 30 - }, - menuButton: { - marginLeft: -12, - marginRight: 20 - }, - cssRoot: { - color: '#FFFFFF', - backgroundColor: theme.palette.secondary, - '&:hover': { - backgroundColor: theme.palette.dark - }, - whiteSpace: 'nowrap', - paddingRight: 2 * theme.spacing.unit, - paddingLeft: 2 * theme.spacing.unit - }, - button: { - margin: theme.spacing.unit - }, - leftIcon: { - marginRight: theme.spacing.unit - }, - rightIcon: { - marginLeft: theme.spacing.unit - }, - iconSmall: { - fontSize: 20 - } -}) - -class NavBar extends Component { - - constructor (props) { - super(props) - this.state = { - authId: null - } - } - - componentDidMount () { - let user = localStorage.getItem('user') - let authId - - if (user !== null && user !== undefined && user !== 'undefined') { - user = JSON.parse(user) - authId = user.authId - } - - if (authId !== null && authId !== undefined && authId !== 'undefined') { - this.setState({ authId: authId }) - } - } - - render () { - const { classes, user, match } = this.props - console.log('NavBar: ', user, match) - return ( -
- - - - Users Module - - - - - - - - -
- ) - } -} - -NavBar.propTypes = { - classes: PropTypes.object.isRequired, - user: PropTypes.object, - match: PropTypes.object -} - -export default withStyles(styles)(NavBar) - diff --git a/client/components/ProfileImages.js b/client/components/ProfileImages.js deleted file mode 100644 index 268efeaee..000000000 --- a/client/components/ProfileImages.js +++ /dev/null @@ -1,52 +0,0 @@ -import React from 'react' -import Button from '@material-ui/core/Button' -import Dialog from '@material-ui/core/Dialog' -import DialogActions from '@material-ui/core/DialogActions' -import DialogContent from '@material-ui/core/DialogContent' -import DialogContentText from '@material-ui/core/DialogContentText' -import DialogTitle from '@material-ui/core/DialogTitle' -import CssBaseline from '@material-ui/core/CssBaseline' - -class Contact extends React.Component { - state = { - open: true - } - - handleClickOpen = () => { - this.setState({ open: true }) - } - - handleClose = () => { - this.setState({ open: false }) - } - - render () { - return ( - - - - - - {"Section under development."} - - - - The functionality of this section has not been developed yet. We expect to have it for November 2018. Thanks for your understanding. - - - - - - - - ) - } -} - -export default Contact diff --git a/client/components/ProfileSheet.js b/client/components/ProfileSheet.js deleted file mode 100644 index 1d81a4368..000000000 --- a/client/components/ProfileSheet.js +++ /dev/null @@ -1,497 +0,0 @@ -import React, { Component } from 'react' -import {graphql, compose} from 'react-apollo' -import {getRolesQuery, updateUserMutation, getUsersQuery} from '../queries/queries' - -// Material-ui - -import { withStyles } from '@material-ui/core/styles' -import MenuItem from '@material-ui/core/MenuItem' -import TextField from '@material-ui/core/TextField' -import FormControl from '@material-ui/core/FormControl' -import InputLabel from '@material-ui/core/InputLabel' -import Input from '@material-ui/core/Input' -import Button from '@material-ui/core/Button' -import FormControlLabel from '@material-ui/core/FormControlLabel' -import Checkbox from '@material-ui/core/Checkbox' -import FormGroup from '@material-ui/core/FormGroup' -import Select from '@material-ui/core/Select' -import FormHelperText from '@material-ui/core/FormHelperText' -import Paper from '@material-ui/core/Paper' -import Grid from '@material-ui/core/Grid' -import Typography from '@material-ui/core/Typography' - -// Images -import GithubLogo from '../img/github-logo.png' -import Auth0Logo from '../img/auth0-logo.png' -import AALogo from '../img/aa-logo.png' - -const styles = theme => ({ - root: { - width: '50%', - flexGrow: 1, - padding: 10, - marginLeft: '25%', - marginTop: '2%' - }, - inputField: { - width: '80%', - marginLeft: '10%', - marginTop: 25 - }, - typography: { - width: '80%', - marginLeft: '10%', - marginTop: 40 - }, - checkbox: { - width: 150, - marginLeft: '0%', - marginTop: 20 - }, - selectEmpty: { - marginTop: theme.spacing.unit * 2 - }, - button: { - margin: theme.spacing.unit, - marginTop: theme.spacing.unit * 3 - }, - img: { - display: 'block', - marginTop: 20, - maxWidth: 120, - maxHeight: 24 - } -}) - -class ProfileSheet extends Component { - - constructor (props) { - super(props) - - this.defaultValuesSet = false - - this.state = { - id: '', - firstName: '', - middleName: '', - lastName: '', - bio: '', - email: '', - emailVerified: 0, - isDeveloper: 0, - isTrader: 0, - isDataAnalyst: 0, - roleId: '1', - firstNameError: false, - middleNameError: false, - lastNameError: false, - bioError: false - } - } - - displayRoles () { - var data = this.props.getRolesQuery // When there is more than one query binded to a single componente 'data' is replaced by thename of the query given below at the binding operation. - if (data.loading) { - return ( - Loading roles - ) - } else { - return data.users_Roles.map(role => { - return ( - { role.name } - ) - }) - } - } - - submitForm (e) { - e.preventDefault() - this.props.updateUserMutation({ - variables: { - firstName: this.state.firstName, - middleName: this.state.middleName, - lastName: this.state.lastName, - bio: this.state.bio, - isDeveloper: this.state.isDeveloper, - isTrader: this.state.isTrader, - isDataAnalyst: this.state.isDataAnalyst, - roleId: this.state.roleId - }, - refetchQueries: [{ query: getUsersQuery}] // This allow us to re run whatever queries are necesary after the mutation. - }) - - /* Before we are done, we need to update the state of the local storage. */ - - let user = JSON.parse(localStorage.getItem('loggedInUser')) - - user.firstName = this.state.firstName - user.middleName = this.state.middleName - user.lastName = this.state.lastName - user.bio = this.state.bio - user.isDeveloper = this.state.isDeveloper - user.isTrader = this.state.isTrader - user.isDataAnalyst = this.state.isDataAnalyst - user.role.id = this.state.roleId - - localStorage.setItem('loggedInUser', JSON.stringify(user)) - } - - handleCheckBoxes (e) { - let fieldValue - if (e.target.checked === true) { - fieldValue = 1 - } else { - fieldValue = 0 - - /* When the user unchecks one of the checkboxes, we need to make sure that that Role is not the one selected at the SELECT, - and if it is, then we need to automatically select another one */ - - switch (e.target.id) { - case 'isDeveloper': - if (this.state.roleId === '2') { - this.setState({ roleId: '1'}) - } - break - - case 'isTrader': - if (this.state.roleId === '3') { - this.setState({ roleId: '1'}) - } - break - - case 'isDataAnalyst': - if (this.state.roleId === '4') { - this.setState({ roleId: '1'}) - } - break - default: - } - } - this.setState({ [e.target.id]: fieldValue}) - } - - handleSelect (e) { - /* - Whenever the select component changes its value, we need to activate the type of role selected. - To do so, we change the state of the corresponding type of role here. - */ - - switch (e.target.value) { - case '2': - this.setState({ isDeveloper: 1}) - break - case '3': - this.setState({ isTrader: 1}) - break - case '4': - this.setState({ isDataAnalyst: 1}) - break - default: - } - - this.setState({ roleId: e.target.value }) - } - - handleTextField (e) { - /* - We will do some basic input validations here. If something is wrong we will turn on the error sign on the textfield. - */ - - let value = e.target.value - - switch (e.target.id) { - case 'firstName': - if (value.length > 30) { - this.setState({firstNameError: true}) - } else { - this.setState({firstNameError: false, firstName: value}) - } - break - case 'middleName': - if (value.length > 30) { - this.setState({middleNameError: true}) - } else { - this.setState({middleNameError: false, middleName: value}) - } - break - case 'lastName': - if (value.length > 50) { - this.setState({lastNameError: true}) - } else { - this.setState({lastNameError: false, lastName: value}) - } - break - case 'bio': - if (value.length > 250) { - this.setState({bioError: true}) - } else { - this.setState({bioError: false, bio: value}) - } - break - default: - } - } - - rightCheckboxValue (stateValue) { - if (stateValue === 1) { - return true - } else { return false } - } - - componentWillMount () { - if (this.defaultValuesSet === false) { - let authId = localStorage.getItem('authId') - let userData = localStorage.getItem('loggedInUser') - - if (userData === 'undefined' || userData === null) { return } - - let user = JSON.parse(userData) - this.defaultValuesSet = true - - /* To avoid console warning, we need to take care of the fields that are null. */ - - if (user.firstName === null) { user.firstName = '' } - if (user.middleName === null) { user.middleName = '' } - if (user.lastName === null) { user.lastName = '' } - if (user.bio === null) { user.bio = '' } - - /* Now we are ready to set the initial state. */ - - this.setState({ - id: user.id, - alias: user.alias, - email: user.email, - emailVerified: user.emailVerified, - firstName: user.firstName, - middleName: user.middleName, - lastName: user.lastName, - bio: user.bio, - isDeveloper: user.isDeveloper, - isTrader: user.isTrader, - isDataAnalyst: user.isDataAnalyst, - roleId: user.role.id, - authId: authId - }) - } - } - - displayIdentityProvider () { - const { classes } = this.props - let authId = this.state.authId - - if (authId !== undefined && authId !== null) { - let authArray = this.state.authId.split('|') - let identityProvider = authArray[0] - - switch (identityProvider) { - case 'github': - return ( - Github - ) - break - case 'auth0': - return ( - Auth0 - ) - break - default: - - } - } - } - - render () { - const { classes } = this.props - return ( - - - Profile Sheet - -
- - - Use this form to control the information you keep at the Advanced Algos system about yourself. - - - - - {this.displayIdentityProvider()} - - - - - This is your basic information we have gotten from the identity provider you used to sign up. This information can not be changed. - - - - - - - - } - label='Email Verified' - /> - - - - Advanced Algos - - - - - Complete your profile with the following optional information. Providing your real name might help other users trust you more. - - - - - - - - - - If you wish, you can add a short paragraph with your Bio or anything you would like to communicate to whoever finds your user profile. - - - - - - Check the following options to enable specialized tools designed for each role. You can allways come back and change these settings later. - - - - - - - } - label='Developer' - /> - - - - } - label='Trader' - /> - - - - } - label='Data Analyst' - /> - - - - -

Your current role determines how the system is going to optimize its user interface to best serves your current needs.

- - - - Current Role - - - Select from the list your current role - - - - - - - - -
- - ) - } -} - -export default compose( - graphql(getRolesQuery, {name: 'getRolesQuery'}), - graphql(updateUserMutation, {name: 'updateUserMutation'}), - withStyles(styles) -)(ProfileSheet) // This technique binds more than one query to a single component. diff --git a/client/components/Search.js b/client/components/Search.js deleted file mode 100644 index c62f79384..000000000 --- a/client/components/Search.js +++ /dev/null @@ -1,37 +0,0 @@ -import React, { Component } from 'react' -import UserSearch from './UserSearch' -import {compose} from 'react-apollo' -import CssBaseline from '@material-ui/core/CssBaseline' - -// Materia UI - -import { withStyles } from '@material-ui/core/styles' - -const styles = theme => ({ - root: { - flexGrow: 1, - padding: 60, - margin: 2 - } -}) - -class Search extends Component { - - constructor (props) { - super(props) - this.state = { - } - } - render () { - return ( - - - - - ) - } -} - -export default compose( - withStyles(styles) -)(Search) diff --git a/client/components/User.js b/client/components/User.js deleted file mode 100644 index 043f3ddaf..000000000 --- a/client/components/User.js +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react' -import UserTabs from './UserTabs' -import CssBaseline from '@material-ui/core/CssBaseline' - -const User = () => { - return ( - - - - - ) -} - -export default User diff --git a/client/components/UserList.js b/client/components/UserList.js deleted file mode 100644 index 4e5751836..000000000 --- a/client/components/UserList.js +++ /dev/null @@ -1,185 +0,0 @@ -import React, { Component } from 'react'; -import {graphql, compose} from 'react-apollo'; -import {getUsersQuery} from '../queries/queries'; - -// Materia UI - -import { withStyles } from '@material-ui/core/styles'; -import Card from '@material-ui/core/Card'; -import CardActionArea from '@material-ui/core/CardActionArea'; -import CardActions from '@material-ui/core/CardActions'; -import CardContent from '@material-ui/core/CardContent'; -import CardMedia from '@material-ui/core/CardMedia'; -import Button from '@material-ui/core/Button'; -import Typography from '@material-ui/core/Typography'; -import Grid from '@material-ui/core/Grid'; -import Paper from '@material-ui/core/Paper'; - -// Full screen dialog imports (still Material UI) - -import PropTypes from 'prop-types'; -import Dialog from '@material-ui/core/Dialog'; -import AppBar from '@material-ui/core/AppBar'; -import Toolbar from '@material-ui/core/Toolbar'; -import IconButton from '@material-ui/core/IconButton'; - -import CloseIcon from '@material-ui/icons/Close'; -import Slide from '@material-ui/core/Slide'; - -// components -import UserProfile from './UserProfile'; - -// Images -import PortraitImage from '../img/portrait.jpg' - -const styles = theme => ({ - root: { - flexGrow: 1, - padding: 60, - margin: 2, - }, - card: { - maxWidth: 345, - minWidth: 300, - paddingTop:'30' - }, - media: { - height: 0, - paddingTop: '56.25%', // 16:9, - marginTop:'30', - minWidth: 300 - }, - typography: { - maxWidth: 345, - minWidth: 300, - paddingTop:'30' - }, - appBar: { - position: 'relative', - }, - flex: { - flex: 1, - }, - grid: { - paddingTop: 30, - marginTop:'30' - }, -}); - -function Transition(props) { - return ; -} - -class UserList extends Component { - - constructor(props){ - super(props); - this.state = { - selected: null, - open: false - } - } - - handleClickOpen = () => { - this.setState({ open: true }); - }; - - handleClose = () => { - this.setState({ open: false }); - }; - - displayUsers(){ - - let data = this.props.getUsersQuery; - const { classes } = this.props; - - if(data.loading){ - return (
Loading Users...
); - } else { - return data.users_Users.map(user => { - - return ( - - - { - this.setState({ selected: user.id}); - } - }> - - - - - {user.alias} - - - {user.bio} - - - - - - - - - - - - - - - User Profile - - - - - - - - - - - - - - - - - ) - }); - } - } - - render() { - const { classes } = this.props; - return ( - - - {this.displayUsers()} - - - ); - } -} - -UserList.propTypes = { - classes: PropTypes.object.isRequired, -}; - -export default compose( - graphql(getUsersQuery, {name: "getUsersQuery"}), - withStyles(styles) -) (UserList); // This technique binds more than one query to a single component. diff --git a/client/components/UserProfile.js b/client/components/UserProfile.js deleted file mode 100644 index 21906da18..000000000 --- a/client/components/UserProfile.js +++ /dev/null @@ -1,112 +0,0 @@ -import React, { Component } from 'react' -import {graphql, compose} from 'react-apollo' -import {getUserProfileQuery} from '../queries/queries' - -// Materia UI - -import { withStyles } from '@material-ui/core/styles' -import Grid from '@material-ui/core/Grid' -import Card from '@material-ui/core/Card' -import CardActionArea from '@material-ui/core/CardActionArea' -import CardContent from '@material-ui/core/CardContent' -import CardMedia from '@material-ui/core/CardMedia' -import Typography from '@material-ui/core/Typography' -import Divider from '@material-ui/core/Divider' - -// Images -import PortraitImage from '../img/portrait.jpg' - -const styles = theme => ({ - root: { - flexGrow: 1, - padding: 60, - margin: 2 - }, - card: { - width: '80%', - paddingTop: '30' - }, - media: { - height: 0, - paddingTop: '56.25%', // 16:9, - marginTop: '30', - minWidth: '80%' - }, - grid: { - paddingTop: '30', - marginTop: '30' - }, - typography: { - width: '100%', - marginTop: 20, - marginBottom: 20 - } - -}) - -class UserProfile extends Component { - - displayUserProfile () { - const user = this.props.data.users_User - const { classes } = this.props - - if (user) { - return ( - - - { - this.setState({ selected: user.id}) - } - }> - - - - - { user.firstName } { user.lastName } ( {user.alias} ) - - - - - { user.role.name } - - - - - { user.bio } - - - - - - ) - } else { - return (
No User selected...
) - } - } - - render () { - return ( - - {this.displayUserProfile()} - - ) - } -} - -export default compose( - graphql(getUserProfileQuery, { // What follows is the way to pass a parameter to a query. - options: (props) => { - return { - variables: { - name: 'getUserProfileQuery', - id: props.userId - } - } - }}), - withStyles(styles) -)(UserProfile) // This technique binds more than one query to a single component. diff --git a/client/components/UserSearch.js b/client/components/UserSearch.js deleted file mode 100644 index 6f184df2e..000000000 --- a/client/components/UserSearch.js +++ /dev/null @@ -1,267 +0,0 @@ -import React, { Component } from 'react' -import {graphql, compose} from 'react-apollo' -import {getUsersBySearchFields} from '../queries/queries' - -// Materia UI - -import { withStyles } from '@material-ui/core/styles' -import Card from '@material-ui/core/Card' -import CardActionArea from '@material-ui/core/CardActionArea' -import CardActions from '@material-ui/core/CardActions' -import CardContent from '@material-ui/core/CardContent' -import CardMedia from '@material-ui/core/CardMedia' -import Button from '@material-ui/core/Button' -import Typography from '@material-ui/core/Typography' -import Grid from '@material-ui/core/Grid' - -import TextField from '@material-ui/core/TextField' - -// Images -import PortraitImage from '../img/portrait.jpg' - -const styles = theme => ({ - card: { - maxWidth: 150, - minWidth: 150, - paddingTop: '30', - marginBottom: 40 - }, - media: { - height: 0, - paddingTop: '56.25%', // 16:9, - marginTop: '30', - minWidth: 300 - }, - typography: { - maxWidth: 345, - minWidth: 300, - paddingTop: '30' - }, - appBar: { - position: 'relative' - }, - flex: { - flex: 1 - }, - grid: { - paddingTop: '30', - marginTop: 30 - }, - inputField: { - width: '80%', - marginLeft: '10%', - marginTop: 25 - }, - formTypography: { - width: '80%', - marginLeft: '10%', - marginTop: 40 - }, - button: { - margin: theme.spacing.unit, - marginTop: theme.spacing.unit * 3 - } -}) - -class UserSearch extends Component { - - constructor (props) { - super(props) - - this.state = { - alias: '', - firstName: '', - middleName: '', - lastName: '' - } - } - - submitForm (e) { - e.preventDefault() - - this.props.getUsersBySearchFields.variables.alias = this.state.alias - this.props.getUsersBySearchFields.variables.firstName = this.state.firstName - this.props.getUsersBySearchFields.variables.middleName = this.state.middleName - this.props.getUsersBySearchFields.variables.lastName = this.state.lastName - - this.props.getUsersBySearchFields.refetch({}) - } - - handleTextField (e) { - /* - We will do some basic input validations here. If something is wrong we will turn on the error sign on the textfield. - */ - - let value = e.target.value - - switch (e.target.id) { - case 'alias': - if (value.length > 30) { - this.setState({aliasError: true}) - } else { - this.setState({aliasError: false, alias: value}) - } - break - case 'firstName': - if (value.length > 30) { - this.setState({firstNameError: true}) - } else { - this.setState({firstNameError: false, firstName: value}) - } - break - case 'middleName': - if (value.length > 30) { - this.setState({middleNameError: true}) - } else { - this.setState({middleNameError: false, middleName: value}) - } - break - case 'lastName': - if (value.length > 50) { - this.setState({lastNameError: true}) - } else { - this.setState({lastNameError: false, lastName: value}) - } - break - default: - } - } - - selectText () { - if (this.props.selectButton === true) { - return ({this.props.selectText}) - } else { - return () - } - } - - selectButton (user) { - if (this.props.selectButton === true) { - return ( - - ) - } else { - return (
) - } - } - - displayUsers () { - let data = this.props.getUsersBySearchFields - const { classes } = this.props - - if (data.loading) { - return (
Loading Users...
) - } else { - if (data.users_UsersSearch === undefined) { - return (
No Users to Display
) - } else { - return data.users_UsersSearch.map(user => { - return ( - - - { - this.setState({ selected: user.id}) - } - }> - - - - - {user.alias} - - - - - - - {this.selectButton(user)} - - - - - - - ) - }) - } - } - } - - render () { - const { classes } = this.props - return ( -
-
- - - Use any of these fileds to search for users. {this.selectText()} - - - - - - - - - - - - - - - - - - - {this.displayUsers()} - -
- ) - } -} - -export default compose( - graphql(getUsersBySearchFields, {name: 'getUsersBySearchFields'}), - withStyles(styles) -)(UserSearch) // This technique binds more than one query to a single component. diff --git a/client/components/UserTabs.js b/client/components/UserTabs.js deleted file mode 100644 index 28b3ae94c..000000000 --- a/client/components/UserTabs.js +++ /dev/null @@ -1,85 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { withStyles } from '@material-ui/core/styles'; -import AppBar from '@material-ui/core/AppBar'; -import Tabs from '@material-ui/core/Tabs'; -import Tab from '@material-ui/core/Tab'; -import ProfileSheetIcon from '@material-ui/icons/Create'; -import ProfileImagesIcon from '@material-ui/icons/Wallpaper'; -import YourReferrerIcon from '@material-ui/icons/AccessibilityNew'; -import DescendentsIcon from '@material-ui/icons/DeviceHub'; -import Typography from '@material-ui/core/Typography'; - -// Components - -import ProfileSheet from './ProfileSheet'; -import ProfileImages from './ProfileImages'; -import YourReferrer from './YourReferrer'; -import YourDescendents from './YourDescendents'; - -function TabContainer(props) { - return ( - - {props.children} - - ); -} - -TabContainer.propTypes = { - children: PropTypes.node.isRequired, -}; - -const styles = theme => ({ - root: { - flexGrow: 1, - width: '100%', - backgroundColor: theme.palette.background.paper, - padding: 0, - margin: 0, - }, -}); - -class UserTabs extends React.Component { - state = { - value: 0 - }; - - handleChange = (event, value) => { - this.setState({ value }); - }; - - render() { - const { classes } = this.props; - const { value } = this.state; - - return ( -
- - - } /> - } /> - } /> - } /> - - - {value === 0 && } - {value === 1 && } - {value === 2 && } - {value === 3 && } -
- ); - } -} - -UserTabs.propTypes = { - classes: PropTypes.object.isRequired, -}; - -export default withStyles(styles)(UserTabs); diff --git a/client/components/YourDescendents.js b/client/components/YourDescendents.js deleted file mode 100644 index dd5f4aec4..000000000 --- a/client/components/YourDescendents.js +++ /dev/null @@ -1,86 +0,0 @@ -import React, { Component } from 'react' -import {compose} from 'react-apollo' - -// Materia UI - -import { withStyles } from '@material-ui/core/styles' -import Typography from '@material-ui/core/Typography' -import Grid from '@material-ui/core/Grid' -import Paper from '@material-ui/core/Paper' - -// components -import DescendentsTree from './DescendentsTree' - -const styles = theme => ({ - root: { - width: '50%', - flexGrow: 1, - padding: 10, - marginLeft: '25%', - marginTop: '2%' - }, - typography: { - width: '80%', - marginLeft: '10%', - marginTop: 40, - marginBottom: 40 - }, - grid: { - paddingTop: '30', - marginTop: 30 - } -}) - -class YourDescendents extends Component { - - constructor (props) { - super(props) - - this.defaultValuesSet = false - - this.state = { - id: '' - } - } - - componentWillMount () { - if (this.defaultValuesSet === false) { - let userData = localStorage.getItem('loggedInUser') - - if (userData === 'undefined') { return } - - let user = JSON.parse(userData) - this.defaultValuesSet = true - - /* Now we are ready to set the initial state. */ - this.setState({ - id: user.id - }) - } - } - - render () { - const { classes } = this.props - - return ( - - - Your Descendents - - - - These are your decendents within the project. Your children referred you as the one who brought them to the project, while - your grandchildren referred your children and so on. In order to be able to see your descendents, the users who you referred - must first point to you as your referrer. - - - - - - ) - } -} - -export default compose( - withStyles(styles) -)(YourDescendents) // This technique binds more than one query to a single component. diff --git a/client/components/YourReferrer.js b/client/components/YourReferrer.js deleted file mode 100644 index 6a658ea4d..000000000 --- a/client/components/YourReferrer.js +++ /dev/null @@ -1,145 +0,0 @@ -import React, { Component } from 'react' -import {graphql, compose} from 'react-apollo' -import {updateReferrerMutation} from '../queries/queries' - -// components - -import UserSearch from './UserSearch' -import UserProfile from './UserProfile' - -// Material-ui - -import { withStyles } from '@material-ui/core/styles' -import Paper from '@material-ui/core/Paper' -import Typography from '@material-ui/core/Typography' - -const styles = theme => ({ - root: { - width: '50%', - flexGrow: 1, - padding: 10, - marginLeft: '25%', - marginTop: '2%' - }, - typography: { - width: '80%', - marginLeft: '10%', - marginTop: 40, - marginBottom: 40 - }, - button: { - margin: theme.spacing.unit, - marginTop: theme.spacing.unit * 3 - }, - inputField: { - width: '80%', - marginLeft: '10%', - marginTop: 25 - } -}) - -class YourReferrer extends Component { - - constructor (props) { - super(props) - - this.defaultValuesSet = false - - this.state = { - id: '', - referrerId: '', - firstNameError: false, - middleNameError: false, - lastNameError: false, - aliasError: false - } - } - - userSelected (referrerUser) { - this.setState({referrerId: referrerUser.id}) - - this.props.updateReferrerMutation({ - variables: { - referrerId: referrerUser.id - } - }) - - /* Before we are done, we need to update the state of the local storage. */ - - let user = JSON.parse(localStorage.getItem('loggedInUser')) - - user.referrerId = referrerUser.id - - localStorage.setItem('loggedInUser', JSON.stringify(user)) - } - - renderMode () { - const { classes } = this.props - - if (this.state.referrerId !== null) { - return ( -
- - This is the user who introduced you to the project. - - - - - - This information can not be changed. - -
- ) - } else { - return ( -
- - We know that a group often becomes more intelligent when the number of people in the group increases. - To incentivize members of the community to invite more people to join we have developed this referral - program in which you can specify who referred you to the project, and see the members who pointed at - you as their referrer. Later this information will be available at your user profile and add to your - overall reputation within the project. - - - -
- ) - } - } - - componentWillMount () { - if (this.defaultValuesSet === false) { - let userData = localStorage.getItem('loggedInUser') - - if (userData === 'undefined') { return } - - let user = JSON.parse(userData) - this.defaultValuesSet = true - - /* Now we are ready to set the initial state. */ - - this.setState({ - id: user.id, - referrerId: user.referrerId - }) - } - } - - render () { - const { classes } = this.props - return ( - - - Your Referrer - - - {this.renderMode()} - - ) - } -} - -export default compose( - graphql(updateReferrerMutation, {name: 'updateReferrerMutation'}), - withStyles(styles) -)(YourReferrer) // This technique binds more than one query to a single component. diff --git a/client/img/aa-logo-dark-8.png b/client/img/aa-logo-dark-8.png deleted file mode 100644 index a6bcfcb906337b47c4179bbe04a198d343e9acd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 801 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 CP}HCR diff --git a/client/img/auth0-logo.png b/client/img/auth0-logo.png deleted file mode 100644 index ba4c727240894f69ff5b506f7065e0b2520a1609..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7493 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 diff --git a/client/img/email.png b/client/img/email.png deleted file mode 100644 index 93b2edf0c9a4514dc08a87c9479df944e63f57da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8JTQDqT?Ea~4hLa$s}7S8+4*Lu22@77hk5t%xkR-b*V*&V*@++H;GUd02ENZ$_T z2?Ea3rp{1xmX>5W+ad6%h4XgMiMH%24nafi=0A;}na}JgQRM#;xa+I;rA1#`S2w(L zyfEFk_<8;MU~!fSMw|A{xZ$;Uuk1B8Mw{9GEju1)7IevJESdZH@bZX;PXa5e3dNlY zUH4B8;r=pt&i|f2L9#FS9U`-xo;AxwH!qtezOlsFEjU%>XU+A$ZvPZt2n*_N`LOTw zEN5VFsg}4#l%yn*gQu&X%Q~loCIGF^vP1v? diff --git a/client/img/github-head-negative.png b/client/img/github-head-negative.png deleted file mode 100644 index 1a1d757b11cde3140a493af97afcf9a54a4292dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40621 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 KMNUMnLSTY3X3>iP diff --git a/client/img/github-head.png b/client/img/github-head.png deleted file mode 100644 index a815207a3be762ef7c7c006ceeb84ba7b4eacdc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41025 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%0DvrKTrckTu)z>Py2aubq1s!&8-ZquH-EB=s_w? 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 diff --git a/client/img/github.png b/client/img/github.png deleted file mode 100644 index 92d3c954b5e3293f61b1b6ad27e2ee14779453ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7157 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 diff --git a/client/index.js b/client/index.js deleted file mode 100644 index e77b9c49f..000000000 --- a/client/index.js +++ /dev/null @@ -1,86 +0,0 @@ -import React, { Component } from 'react' -import PropTypes from 'prop-types' -import { Route, BrowserRouter, Switch } from 'react-router-dom' -import { hot } from 'react-hot-loader' - -import { withStyles } from '@material-ui/core/styles' - -// Components -import NavBar from './components/NavBar' -import Home from './components/Home' -import User from './components/User' -import Browse from './components/Browse' -import Search from './components/Search' -import About from './components/About' -import Contact from './components/Contact' - -import { getItem } from './utils/local-storage' -import { - globalStyles -} from './theme' - -class App extends Component { - constructor (props) { - super(props) - this.state = { - user: null - } - } - - async componentDidMount () { - let user = await getItem('user') - - if (user !== null && user !== undefined && user !== 'undefined') { - user = JSON.parse(user) - this.setState({ user: user }) - } - } - - render () { - const { match } = this.props - - return ( - -

- - - - } - /> - } - /> - } - /> - } - /> - } - /> - - -
- - ) - } -} - -App.propTypes = { - auth: PropTypes.object -} - -const StyledApp = withStyles(globalStyles)(App) -export default hot(module)(StyledApp) diff --git a/client/public/favicon.ico b/client/public/favicon.ico deleted file mode 100644 index 08c2369b05c014d615766ea699a4a355d454ed25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 758 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaNh0(?STpSW9MBA?7cOhHmb9xo5e1==E8666=m`18dn79M*BrayZh-qaTI zmCkr?yu4|4beYn`w#~+>nYKWut@Cto46!(!8{D~VwE_=IWK-Af(%gUl&F{0ksr?$_ zr+wPT$%wP7&Q0OE$+VDrE7=c)Wysog^s~4=U$OJaqVqlR{CUgoZFtuEhS~9{f=x__ zzg$z!RIZd6$$i0hKboDLCid*mUjdy`^;UrmH|B9nTb6VvT+>^79Y;AZK-eEt`*#*_ z8%4Bi|HPQ_V54Hq&#(4p70!K|soiq_#Uyd3d2jyP9N1xb_Qb~4v)n?GD?$s31&_Rn z?b^m$AimK^^ZZLCmRk(dWhOSvNshGMx%hWXVZq8u8J)<2#QymSN7YX_=B$dll*51U zV?DFAedaZb8O<}^8$L9$Ni5g2G?Mn7lyP*|5do*W!e_IK7HT~U{WA5;CxJ^oSDtH3 zy&gHqVQy#IOvR2Tcb;AH7Mr^+=&5Lz%H-(RS9l)2I_dEC!Tu~Z=jYe|t)KL&Xz7Z2 z+2;Ji;jdSAPq7WYy|?GtquMe*ld0cw3)key-sW56Iz@Y_y%|?LOY5=&S45STif5)3 zE2{|A_$zCj`&tvSa%G)d-%_7mBs%pCTA7B)RSA|5B1SOU$6cpvBW#*(RlvEa^Dr6RvBr`Bn%z6BYhodk| zL*tbH=`)^BgBX~Vx%HB{g_VW9CyOu(E4Vb698O_Y-W;NE`o@(LN6s9PIl_Lr!DE4! a9>Xhf!IDo-rc;4dFnGH9xvX - - - - - - - - - - - - - - - - - - Advanced Algos - Users Module - - - - - - - -
- - diff --git a/client/public/manifest.json b/client/public/manifest.json deleted file mode 100644 index ef19ec243..000000000 --- a/client/public/manifest.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "short_name": "React App", - "name": "Create React App Sample", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - } - ], - "start_url": "./index.html", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/client/queries/queries.js b/client/queries/queries.js deleted file mode 100644 index 8a58b3d04..000000000 --- a/client/queries/queries.js +++ /dev/null @@ -1,165 +0,0 @@ -import gql from 'graphql-tag' - -const getUsersQuery = gql` -{ - users_Users { - id - alias - firstName - middleName - lastName - bio - role { - id - name - } - } -} -` -const getUserProfileQuery = gql` -query($id: ID){ - users_User (id: $id){ - id - alias - firstName - middleName - lastName - bio - avatarHandle - role { - id - name - } - } -} -` -const getUserByAuthIdQuery = gql` -query($authId: String){ - users_UserByAuthId (authId: $authId){ - id - referrerId - alias - firstName - middleName - lastName - bio - email - emailVerified - isDeveloper - isDataAnalyst - isTrader - avatarHandle - avatarChangeDate - role { - id - } - } -} -` -const getUsersBySearchFields = gql` -query( - $alias: String, - $firstName: String, - $middleName: String, - $lastName: String -){ - users_UsersSearch (alias: $alias, firstName: $firstName, middleName: $middleName, lastName: $lastName){ - id - alias - firstName - middleName - lastName - } -} -` -const getDescendentsQuery = gql` -query( - $id: String -){ - users_Descendents (id: $id){ - id - alias - firstName - middleName - lastName - referrerId - descendents { - id - alias - firstName - middleName - lastName - referrerId - descendents { - id - alias - firstName - middleName - lastName - referrerId - } - } - } -} -` -const getRolesQuery = gql` -{ - users_Roles { - id - name - } -} -` -const updateUserMutation = gql` -mutation( - $firstName:String, - $middleName:String, - $lastName:String, - $bio:String, - $isDeveloper:Int, - $isTrader:Int, - $isDataAnalyst:Int, - $roleId:String! -) - { - users_UpdateUser ( - firstName:$firstName, - middleName: $middleName, - lastName: $lastName, - bio: $bio, - isDeveloper: $isDeveloper, - isTrader: $isTrader, - isDataAnalyst: $isDataAnalyst, - roleId: $roleId - ) - { - id - alias - } -} -` -const updateReferrerMutation = gql` -mutation( - $referrerId:String! -) - { - users_UpdateUserReferrer ( - referrerId:$referrerId - ) - { - id - referrerId - } -} -` - -export { - getUsersQuery, - getUserByAuthIdQuery, - getRolesQuery, - getUserProfileQuery, - getUsersBySearchFields, - getDescendentsQuery, - updateUserMutation, - updateReferrerMutation -} diff --git a/client/src/components/ProfileSheet.js b/client/src/components/ProfileSheet.js index 56a4dd74e..1d81a4368 100644 --- a/client/src/components/ProfileSheet.js +++ b/client/src/components/ProfileSheet.js @@ -108,7 +108,6 @@ class ProfileSheet extends Component { e.preventDefault() this.props.updateUserMutation({ variables: { - id: this.state.id, firstName: this.state.firstName, middleName: this.state.middleName, lastName: this.state.lastName, diff --git a/client/src/components/YourReferrer.js b/client/src/components/YourReferrer.js index 946f2e4e7..6a658ea4d 100644 --- a/client/src/components/YourReferrer.js +++ b/client/src/components/YourReferrer.js @@ -60,7 +60,6 @@ class YourReferrer extends Component { this.props.updateReferrerMutation({ variables: { - id: this.state.id, referrerId: referrerUser.id } }) diff --git a/client/src/queries/queries.js b/client/src/queries/queries.js index 841538779..50eb8fdbd 100644 --- a/client/src/queries/queries.js +++ b/client/src/queries/queries.js @@ -112,7 +112,6 @@ const getRolesQuery = gql` ` const updateUserMutation = gql` mutation( - $id: ID!, $firstName:String, $middleName:String, $lastName:String, @@ -124,7 +123,6 @@ mutation( ) { users_UpdateUser ( - id: $id, firstName:$firstName, middleName: $middleName, lastName: $lastName, @@ -142,12 +140,10 @@ mutation( ` const updateReferrerMutation = gql` mutation( - $id: ID!, $referrerId:String! ) { users_UpdateUserReferrer ( - id: $id, referrerId:$referrerId ) { @@ -156,24 +152,6 @@ mutation( } } ` -const updateUserImagesMutation = gql` -mutation( - $id: ID!, - $avatarHandle:String, - $avatarChangeDate:String -) - { - users_UpdateUserImages ( - id: $id, - avatarHandle:$avatarHandle, - avatarChangeDate: $avatarChangeDate - ) - { - id - alias - } -} -` export { getUsersQuery, getUserByAuthIdQuery, @@ -182,6 +160,5 @@ export { getUsersBySearchFields, getDescendentsQuery, updateUserMutation, - updateReferrerMutation, - updateUserImagesMutation + updateReferrerMutation } diff --git a/client/theme.js b/client/theme.js deleted file mode 100644 index 96492c48c..000000000 --- a/client/theme.js +++ /dev/null @@ -1,65 +0,0 @@ -import { createMuiTheme } from '@material-ui/core/styles' - -export const theme = createMuiTheme({ - palette: { - primary: { main: '#303036' }, // DARK. - secondary: { main: '#CC5835' } // RUSTED_RED. - }, - typography: { - fontFamily: '"Saira","Saira Condenses", sans-serif' - }, - overrides: { - Paper: { - root: { - backgroundColor: '#ffffff' - }, - elevation: 0, - square: true - } - } -}) - -export const globalStyles = theme => ({ - '@global': { - body: { - backgroundColor: theme.palette.common.white - } - }, - appBar: { - position: 'relative' - }, - toolbarTitle: { - flex: 1 - }, - layout: { - width: 'auto', - marginLeft: theme.spacing.unit * 3, - marginRight: theme.spacing.unit * 3, - [theme.breakpoints.up(900 + theme.spacing.unit * 3 * 2)]: { - width: 900, - marginLeft: 'auto', - marginRight: 'auto' - } - }, - heroContent: { - maxWidth: 600, - margin: '0 auto', - padding: `${theme.spacing.unit * 8}px 0 ${theme.spacing.unit * 6}px` - }, - cardHeader: { - backgroundColor: theme.palette.grey[200] - }, - cardPricing: { - display: 'flex', - justifyContent: 'center', - alignItems: 'baseline', - marginBottom: theme.spacing.unit * 2 - }, - cardActions: { - [theme.breakpoints.up('sm')]: { - paddingBottom: theme.spacing.unit * 2 - } - } -}) - -export default theme diff --git a/server/app.js b/server/app.js index 2ba7662bb..b314a0f97 100644 --- a/server/app.js +++ b/server/app.js @@ -30,10 +30,15 @@ app.get('/graphql', graphqlHTTP({ graphiql: true })) -app.post('/graphql', graphqlHTTP({ - schema, - graphiql: false, - context: req => ({ ...req }) +app.post('/graphql', graphqlHTTP(req => { + return { + schema, + graphiql: false, + context: { + user: req.user, + userId: req.headers.userid + } + } })) app.post('/graphql', checkJwt, (err, req, res, next) => { diff --git a/server/package-lock.json b/server/package-lock.json index ea30295b3..6e2f22e09 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -204,6 +204,56 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, + "color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "requires": { + "color-convert": "1.9.3", + "color-string": "1.5.3" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "1.1.3", + "simple-swizzle": "0.2.2" + } + }, + "colornames": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", + "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" + }, + "colors": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", + "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==" + }, + "colorspace": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.1.tgz", + "integrity": "sha512-pI3btWyiuz7Ken0BWh9Elzsmv2bM9AhA7psXib4anUXy/orfZ/E0MbQwhSOG/9L8hLlalqrU0UhOuqxW1YjmVw==", + "requires": { + "color": "3.0.0", + "text-hex": "1.0.0" + } + }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", @@ -277,6 +327,16 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "diagnostics": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", + "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", + "requires": { + "colorspace": "1.1.1", + "enabled": "1.0.2", + "kuler": "1.0.1" + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -300,11 +360,24 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "enabled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", + "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", + "requires": { + "env-variable": "0.0.5" + } + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "env-variable": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", + "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==" + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -406,6 +479,16 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, + "fast-safe-stringify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", + "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==" + }, + "fecha": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", + "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" + }, "finalhandler": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", @@ -511,11 +594,26 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -618,6 +716,14 @@ "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.2.1.tgz", "integrity": "sha512-xpDFy8OxkFM+vK6pXy6JmH92ibeEFUuDWzas5M9L7MzVmHW3jzwAHxodCPV/BYkf4A31bVDLyonrMfp9RXb/oA==" }, + "kuler": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", + "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", + "requires": { + "colornames": "1.1.1" + } + }, "limiter": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.3.tgz", @@ -678,6 +784,25 @@ "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" }, + "logform": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-1.10.0.tgz", + "integrity": "sha512-em5ojIhU18fIMOw/333mD+ZLE2fis0EzXl1ZwHx4iQzmpQi6odNiY/t+ITNr33JZhT9/KEaH+UPIipr6a9EjWg==", + "requires": { + "colors": "1.3.2", + "fast-safe-stringify": "2.0.6", + "fecha": "2.3.3", + "ms": "2.1.1", + "triple-beam": "1.3.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, "lru-cache": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", @@ -3558,6 +3683,11 @@ "ee-first": "1.1.1" } }, + "one-time": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", + "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -3573,6 +3703,11 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, "proxy-addr": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", @@ -3641,6 +3776,20 @@ } } }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, "regexp-clone": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", @@ -3756,6 +3905,14 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "0.3.2" + } + }, "sliced": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", @@ -3777,11 +3934,29 @@ "tweetnacl": "0.14.5" } }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", @@ -3791,6 +3966,11 @@ "punycode": "1.4.1" } }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -3819,6 +3999,11 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -3849,6 +4034,31 @@ "resolved": "https://registry.npmjs.org/very-fast-args/-/very-fast-args-1.1.0.tgz", "integrity": "sha1-4W0dH6+KbllqJGQh/ZCneWPQs5Y=" }, + "winston": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.1.0.tgz", + "integrity": "sha512-FsQfEE+8YIEeuZEYhHDk5cILo1HOcWkGwvoidLrDgPog0r4bser1lEIOco2dN9zpDJ1M88hfDgZvxe5z4xNcwg==", + "requires": { + "async": "2.6.1", + "diagnostics": "1.1.1", + "is-stream": "1.1.0", + "logform": "1.10.0", + "one-time": "0.0.4", + "readable-stream": "2.3.6", + "stack-trace": "0.0.10", + "triple-beam": "1.3.0", + "winston-transport": "4.2.0" + } + }, + "winston-transport": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.2.0.tgz", + "integrity": "sha512-0R1bvFqxSlK/ZKTH86nymOuKv/cT1PQBMuDdA7k7f0S9fM44dNH6bXnuxwXPrN8lefJgtZq08BKdyZ0DZIy/rg==", + "requires": { + "readable-stream": "2.3.6", + "triple-beam": "1.3.0" + } + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", diff --git a/server/package.json b/server/package.json index a59e515a4..db1a3063b 100644 --- a/server/package.json +++ b/server/package.json @@ -18,6 +18,7 @@ "jwks-rsa": "^1.3.0", "lodash": "^4.17.10", "mongoose": "^5.2.12", - "npm": "^6.4.1" + "npm": "^6.4.1", + "winston": "^3.1.0" } } diff --git a/server/schema/schema.js b/server/schema/schema.js index b3495821f..9b3cba2f4 100644 --- a/server/schema/schema.js +++ b/server/schema/schema.js @@ -3,7 +3,7 @@ const MODULE_NAME = 'schema' const graphql = require('graphql') const _ = require('lodash') const User = require('../models/user') - +const logger = require('../utils/logger') const tokenDecoder = require('../auth/token-decoder') const { @@ -104,22 +104,22 @@ const RootQuery = new GraphQLObjectType({ resolve (parent, args) { // Code to get data from data source. - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> RootQuery -> userByAuthId -> resolve -> Entering function.') } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> RootQuery -> userByAuthId -> resolve -> Entering function.') } /* In order to be able to wait for asyc calls to the database, we need to return a promise to GraphQL. */ const promiseToGraphQL = new Promise((resolve, reject) => { - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> RootQuery -> userByAuthId -> resolve -> Promise -> Entering function.') } - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> RootQuery -> userByAuthId -> resolve -> Promise -> args.authId = ' + args.authId) } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> RootQuery -> userByAuthId -> resolve -> Promise -> Entering function.') } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> RootQuery -> userByAuthId -> resolve -> Promise -> args.authId = ' + args.authId) } findUserByAuthId(args.authId, onUserFound) function onUserFound (err, responseToGraphQL) { - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> RootQuery -> userByAuthId -> resolve -> Promise -> onUserFound -> Entering function.') } - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> RootQuery -> userByAuthId -> resolve -> Promise -> onUserFound -> responseToGraphQL = ' + JSON.stringify(responseToGraphQL)) } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> RootQuery -> userByAuthId -> resolve -> Promise -> onUserFound -> Entering function.') } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> RootQuery -> userByAuthId -> resolve -> Promise -> onUserFound -> responseToGraphQL = ' + JSON.stringify(responseToGraphQL)) } if (err.result !== global.DEFAULT_OK_RESPONSE.result) { - if (global.ERROR_LOG === true) { console.log('[ERROR] ' + MODULE_NAME + ' -> RootQuery -> userByAuthId -> resolve -> Promise -> onUserFound -> err.message = ' + err.message) } + if (global.ERROR_LOG === true) { logger.error('[ERROR] ' + MODULE_NAME + ' -> RootQuery -> userByAuthId -> resolve -> Promise -> onUserFound -> err.message = ' + err.message) } reject(responseToGraphQL) } else { resolve(responseToGraphQL) @@ -154,7 +154,7 @@ const RootQuery = new GraphQLObjectType({ type: new GraphQLList(UserType), args: {alias: {type: GraphQLString}, firstName: {type: GraphQLString}, middleName: {type: GraphQLString}, lastName: {type: GraphQLString}}, resolve (parent, args) { - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> RootQuery -> usersSearch -> resolve -> Entering function.') } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> RootQuery -> usersSearch -> resolve -> Entering function.') } let mongoQuery = { $or: [] } @@ -172,7 +172,7 @@ const RootQuery = new GraphQLObjectType({ type: new GraphQLList(DescendentType), args: {id: {type: GraphQLString}}, resolve (parent, args) { - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> RootQuery -> descendents -> resolve -> Entering function.') } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> RootQuery -> descendents -> resolve -> Entering function.') } return User.find({referrerId: args.id}) } @@ -191,20 +191,20 @@ const Mutation = new GraphQLObjectType({ idToken: {type: new GraphQLNonNull(GraphQLString)} }, resolve (parent, args) { - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> Mutation -> authenticate -> resolve -> Entering function.') } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> Mutation -> authenticate -> resolve -> Entering function.') } /* In order to be able to wait for asyc calls to the database, and authorization authority, we need to return a promise to GraphQL. */ const promiseToGraphQL = new Promise((resolve, reject) => { - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> Mutation -> authenticate -> resolve -> Promise -> Entering function.') } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> Mutation -> authenticate -> resolve -> Promise -> Entering function.') } authenticate(args.idToken, onAuthenticated) function onAuthenticated (err, responseToGraphQL) { - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> Mutation -> authenticate -> resolve -> Promise -> onAuthenticated -> Entering function.') } - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> Mutation -> authenticate -> resolve -> Promise -> onAuthenticated -> responseToGraphQL = ' + JSON.stringify(responseToGraphQL)) } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> Mutation -> authenticate -> resolve -> Promise -> onAuthenticated -> Entering function.') } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> Mutation -> authenticate -> resolve -> Promise -> onAuthenticated -> responseToGraphQL = ' + JSON.stringify(responseToGraphQL)) } if (err.result !== global.DEFAULT_OK_RESPONSE.result) { - if (global.ERROR_LOG === true) { console.log('[ERROR] ' + MODULE_NAME + ' -> Mutation -> authenticate -> resolve -> Promise -> onAuthenticated -> err.message = ' + err.message) } + if (global.ERROR_LOG === true) { logger.error('[ERROR] ' + MODULE_NAME + ' -> Mutation -> authenticate -> resolve -> Promise -> onAuthenticated -> err.message = ' + err.message) } reject(responseToGraphQL) } else { resolve(responseToGraphQL) @@ -289,12 +289,12 @@ const Mutation = new GraphQLObjectType({ function findUserByAuthId (authId, callBackFunction) { try { - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> Entering function.') } - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> authId = ' + authId) } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> Entering function.') } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> authId = ' + authId) } if (authId === null || authId === undefined) { - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> User requested not specified.') } - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> args.authId = ' + authId) } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> User requested not specified.') } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> args.authId = ' + authId) } callBackFunction(global.DEFAULT_FAIL_RESPONSE, { error: 'Bad Request' }) return @@ -304,13 +304,13 @@ function findUserByAuthId (authId, callBackFunction) { function onUserReceived (err, user) { if (err) { - if (ERROR_LOG === true) { console.log('[ERROR] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> Database Error.') } - if (ERROR_LOG === true) { console.log('[ERROR] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> err = ' + err) } + if (ERROR_LOG === true) { logger.error('[ERROR] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> Database Error.') } + if (ERROR_LOG === true) { logger.error('[ERROR] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> err = ' + err) } callBackFunction(global.DEFAULT_FAIL_RESPONSE, { error: err }) } else { if (user === null) { - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> User not found at Database.') } - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> args.authId = ' + authId) } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> User not found at Database.') } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> args.authId = ' + authId) } let customResponse = { result: global.CUSTOM_OK_RESPONSE.result, @@ -322,15 +322,15 @@ function findUserByAuthId (authId, callBackFunction) { } if (user.authId === authId && user.authId !== undefined) { - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> User found at Database.') } - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> args.authId = ' + authId) } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> User found at Database.') } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> args.authId = ' + authId) } callBackFunction(global.DEFAULT_OK_RESPONSE, user) return } else { - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> User found at Database is not the user requested.') } - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> args.authId = ' + authId) } - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> user.authId = ' + user.authId) } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> User found at Database is not the user requested.') } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> args.authId = ' + authId) } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> findUserByAuthId -> onUserReceived -> user.authId = ' + user.authId) } callBackFunction(global.DEFAULT_FAIL_RESPONSE, { error: err }) return @@ -338,14 +338,14 @@ function findUserByAuthId (authId, callBackFunction) { } } } catch (err) { - if (global.ERROR_LOG === true) { console.log('[ERROR] ' + MODULE_NAME + ' -> findUserByAuthId -> err.message = ' + err.message) } + if (global.ERROR_LOG === true) { logger.error('[ERROR] ' + MODULE_NAME + ' -> findUserByAuthId -> err.message = ' + err.message) } callBackFunction(global.DEFAULT_FAIL_RESPONSE, { error: err }) } } function authenticate (encodedToken, callBackFunction) { try { - if (INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> authenticate -> Entering function.') } + if (INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> authenticate -> Entering function.') } let authId = '' let alias = '' @@ -355,10 +355,10 @@ function authenticate (encodedToken, callBackFunction) { tokenDecoder(encodedToken, onValidated) function onValidated (err, decodedToken) { - if (global.INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> authenticate -> onValidated -> Entering function.') } + if (global.INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> authenticate -> onValidated -> Entering function.') } if (err.result !== global.DEFAULT_OK_RESPONSE.result) { - if (global.ERROR_LOG === true) { console.log('[ERROR] ' + MODULE_NAME + ' -> authenticate -> onValidated -> err.message = ' + err.message) } + if (global.ERROR_LOG === true) { logger.error('[ERROR] ' + MODULE_NAME + ' -> authenticate -> onValidated -> err.message = ' + err.message) } callBackFunction(global.DEFAULT_FAIL_RESPONSE, { error: err }) return } @@ -378,18 +378,18 @@ function authenticate (encodedToken, callBackFunction) { findUserByAuthId(authId, onUserFound) function onUserFound (err, user) { - if (global.INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> Entering function.') } + if (global.INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> Entering function.') } if (err.result === global.DEFAULT_FAIL_RESPONSE.result) { - if (global.ERROR_LOG === true) { console.log('[ERROR] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> err.message = ' + err.message) } + if (global.ERROR_LOG === true) { logger.error('[ERROR] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> err.message = ' + err.message) } callBackFunction(global.DEFAULT_FAIL_RESPONSE, { error: err }) return } if (err.result === global.DEFAULT_OK_RESPONSE.result) { - if (global.INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> User already exists at database') } + if (global.INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> User already exists at database') } - if (global.INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> Existing User: ' + JSON.stringify(user)) } + if (global.INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> Existing User: ' + JSON.stringify(user)) } /* @@ -408,7 +408,7 @@ function authenticate (encodedToken, callBackFunction) { err.result === global.CUSTOM_OK_RESPONSE.result && err.message === 'User Not Found' ) { - if (global.INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> User does not exist at database') } + if (global.INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> User does not exist at database') } /* @@ -427,8 +427,8 @@ function authenticate (encodedToken, callBackFunction) { socialAccountProvider !== 'github' && socialAccountProvider !== 'auth0' ) { - if (global.ERROR_LOG === true) { console.log('[ERROR] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> Social Account Provider not Supoorted. ') } - if (global.ERROR_LOG === true) { console.log('[ERROR] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> socialAccountProvider = ' + socialAccountProvider) } + if (global.ERROR_LOG === true) { logger.error('[ERROR] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> Social Account Provider not Supoorted. ') } + if (global.ERROR_LOG === true) { logger.error('[ERROR] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> socialAccountProvider = ' + socialAccountProvider) } callBackFunction(global.DEFAULT_FAIL_RESPONSE, { error: err }) return @@ -446,20 +446,20 @@ function authenticate (encodedToken, callBackFunction) { roleId: '1' }) - if (global.INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> ' + alias + ' being added to the database') } + if (global.INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> ' + alias + ' being added to the database') } newUser.save(onSaved) function onSaved (err, savedUser) { - if (global.INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> onSaved -> Entering function.') } + if (global.INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> onSaved -> Entering function.') } if (err) { - if (global.ERROR_LOG === true) { console.log('[ERROR] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> onSaved -> err = ' + err) } + if (global.ERROR_LOG === true) { logger.error('[ERROR] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> onSaved -> err = ' + err) } callBackFunction(global.DEFAULT_FAIL_RESPONSE, { error: err }) return } - if (global.INFO_LOG === true) { console.log('[INFO] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> onSaved -> Saved User: ' + JSON.stringify(savedUser)) } + if (global.INFO_LOG === true) { logger.info('[INFO] ' + MODULE_NAME + ' -> authenticate -> onValidated -> onUserFound -> onSaved -> Saved User: ' + JSON.stringify(savedUser)) } /* @@ -476,7 +476,7 @@ function authenticate (encodedToken, callBackFunction) { } } } catch (err) { - if (global.ERROR_LOG === true) { console.log('[ERROR] ' + MODULE_NAME + ' -> authenticate -> err.message = ' + err.message) } + if (global.ERROR_LOG === true) { logger.error('[ERROR] ' + MODULE_NAME + ' -> authenticate -> err.message = ' + err.message) } callBackFunction(global.DEFAULT_FAIL_RESPONSE, { error: err }) } } diff --git a/client/utils/local-storage.js b/server/utils/local-storage.js similarity index 100% rename from client/utils/local-storage.js rename to server/utils/local-storage.js diff --git a/client/config/logger.js b/server/utils/logger.js similarity index 100% rename from client/config/logger.js rename to server/utils/logger.js