Merge pull request #47 from AdvancedAlgos/develop
Upgrade Error Handling + Fix Issues
This commit is contained in:
14 files changed
+104
-43
No files matched your search
Generated
+37
@@ -1648,6 +1648,15 @@
|
||||
"protobufjs": "^6.8.6"
|
||||
}
|
||||
},
|
||||
"apollo-errors": {
|
||||
"version": "1.9.0",
|
||||
"resolved": "https://registry.npmjs.org/apollo-errors/-/apollo-errors-1.9.0.tgz",
|
||||
"integrity": "sha512-XVukHd0KLvgY6tNjsPS3/Re3U6RQlTKrTbIpqqeTMo2N34uQMr+H1UheV21o8hOZBAFosvBORVricJiP5vfmrw==",
|
||||
"requires": {
|
||||
"assert": "^1.4.1",
|
||||
"extendable-error": "^0.1.5"
|
||||
}
|
||||
},
|
||||
"apollo-link": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.2.tgz",
|
||||
@@ -1934,6 +1943,14 @@
|
||||
"safer-buffer": "~2.1.0"
|
||||
}
|
||||
},
|
||||
"assert": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
|
||||
"integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
|
||||
"requires": {
|
||||
"util": "0.10.3"
|
||||
}
|
||||
},
|
||||
"assert-plus": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
||||
@@ -3823,6 +3840,11 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"extendable-error": {
|
||||
"version": "0.1.5",
|
||||
"resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.5.tgz",
|
||||
"integrity": "sha1-EiMIpwl7yJomOyxPvwiceBQOO20="
|
||||
},
|
||||
"external-editor": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
|
||||
@@ -10521,6 +10543,21 @@
|
||||
"resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
|
||||
"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
|
||||
},
|
||||
"util": {
|
||||
"version": "0.10.3",
|
||||
"resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
|
||||
"integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
|
||||
"requires": {
|
||||
"inherits": "2.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"inherits": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
|
||||
"integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
|
||||
}
|
||||
}
|
||||
},
|
||||
"util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
"@babel/polyfill": "^7.0.0",
|
||||
"@babel/preset-env": "^7.1.0",
|
||||
"@babel/register": "^7.0.0",
|
||||
"apollo-errors": "^1.9.0",
|
||||
"apollo-server-express": "^2.1.0",
|
||||
"axios": "^0.18.0",
|
||||
"cors": "^2.8.4",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { SchemaDirectiveVisitor } from 'apollo-server-express'
|
||||
import _get from 'lodash.get'
|
||||
import { logger, AuthenticationError } from '../logger'
|
||||
import { logger, AuthenticationError, DatabaseError } from '../logger'
|
||||
|
||||
const memberLocationOnContext = 'request.user'
|
||||
const userIdOnContext = 'request.headers.userid'
|
||||
@@ -35,6 +35,7 @@ const isUserId = async ctx => {
|
||||
logger.info(member)
|
||||
if (!member) {
|
||||
throw new AuthenticationError()
|
||||
return
|
||||
} else {
|
||||
return member
|
||||
}
|
||||
|
||||
+15
-3
@@ -10,12 +10,24 @@ export {
|
||||
ValidationError,
|
||||
} from 'apollo-server-express'
|
||||
|
||||
export function formatError(error) {
|
||||
export const formatError = (error) => {
|
||||
// This can be used to send errors to third
|
||||
// party services like Sentry or Stackdriver
|
||||
logger.error(error)
|
||||
logger.info('formatError')
|
||||
logger.error(JSON.stringify(error))
|
||||
const originalError = searchOriginalError(error)
|
||||
logger.error(originalError)
|
||||
return originalError
|
||||
}
|
||||
|
||||
return error
|
||||
const searchOriginalError = (error) => {
|
||||
if (error.originalError) {
|
||||
return searchOriginalError(error.originalError)
|
||||
}
|
||||
if (error.errors) {
|
||||
return error.errors.map(searchOriginalError)[0]
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
// Define custom Apollo errors here
|
||||
|
||||
@@ -8,7 +8,7 @@ import TEAMS_CONNECTIONS_FRAGMENT from '../../fragments/TeamsConnectionsFragment
|
||||
import TEAMS_FRAGMENT from '../../fragments/TeamsFragment'
|
||||
import TEAM_FB_FRAGMENT from '../../fragments/TeamFBFragment'
|
||||
|
||||
import { logger, AuthenticationError, ServiceUnavailableError } from '../../../logger'
|
||||
import { logger, AuthenticationError, ServiceUnavailableError, DatabaseError } from '../../../logger'
|
||||
|
||||
export const resolvers = {
|
||||
Mutation: {
|
||||
@@ -36,7 +36,7 @@ export const resolvers = {
|
||||
logger.info('verifyTeamInvite.token: ', await verifiedToken)
|
||||
} catch (err) {
|
||||
logger.debug('verifyTeamInvite. err: ', err)
|
||||
throw new Error(err.message)
|
||||
throw new DatabaseError(err.message)
|
||||
}
|
||||
return team
|
||||
},
|
||||
@@ -71,17 +71,17 @@ export const resolvers = {
|
||||
.then((result) => {
|
||||
console.log('createPlatformTeam result:', result.data)
|
||||
if(result.data.message === 'Team Name already taken'){
|
||||
return result.data.message
|
||||
throw new DatabaseError(`${result.data.message} - Team already exists onAA Cloud`)
|
||||
}
|
||||
if(result.data.result === 'Fail'){
|
||||
return result.data.message
|
||||
throw new DatabaseError(`${result.data.message} - Creating team on AA Cloud has failed`)
|
||||
}
|
||||
return result
|
||||
})
|
||||
.catch(err =>{
|
||||
logger.debug('createPlatformTeam err:')
|
||||
logger.debug(err)
|
||||
throw new ServiceUnavailableError(err)
|
||||
throw new DatabaseError(err)
|
||||
})
|
||||
console.log('createPlatformTeam returned: ', await createPlatformTeam)
|
||||
if(await createPlatformTeam === 'Team Name already taken'){
|
||||
@@ -91,11 +91,11 @@ export const resolvers = {
|
||||
const existingMember = await ctx.db.query.member({ where: { authId } }, `{id}`)
|
||||
.catch((err) => {
|
||||
logger.debug(err, 'existingMember error: ')
|
||||
return err
|
||||
throw new DatabaseError(err)
|
||||
})
|
||||
|
||||
logger.info('existingMember:')
|
||||
logger.info(await existingMember)
|
||||
logger.debug('existingMember:')
|
||||
logger.debug(await existingMember)
|
||||
|
||||
let createTeam
|
||||
if(existingMember !== null && existingMember.id !== null){
|
||||
@@ -103,14 +103,14 @@ export const resolvers = {
|
||||
createTeam = await ctx.db.mutation.createTeam({ data: {name: name, slug: slug, owner: authId, members: {create: {member: {connect: {authId: authId}}, role: 'OWNER', status: { create: { status: 'ACTIVE', reason: `Connected to Team ${name}`}}}}, profile: {create: {avatar: avatar, banner: banner}}, fb: {create: {name: botName, slug: botSlug, kind:'TRADER', avatar: avatar, status: {create: {status: 'ACTIVE', reason: "Cloned on team creation"}}}}, status: {create: {status: 'ACTIVE', reason:"Team created"}}} }, TEAMS_FRAGMENT)
|
||||
.catch((err) => {
|
||||
logger.debug(err, 'createTeamMutation error: ')
|
||||
return err
|
||||
throw new DatabaseError(err)
|
||||
})
|
||||
} else {
|
||||
logger.info('createTeam without existingMember:')
|
||||
createTeam = await ctx.db.mutation.createTeam({ data: {name: name, slug: slug, owner: authId, members: {create: {member: {create: {authId: authId, alias: alias, visible:'true', status: { create: { status: 'ACTIVE', reason: `Created team ${name}`}}}}, role: 'OWNER', status: { create: { status: 'ACTIVE', reason: `Created with Team ${name}`}}}}, profile: {create: {avatar: avatar, banner: banner}}, fb: {create: {name: botName, slug: botSlug, kind:'TRADER', avatar: avatar, status: {create: {status: 'ACTIVE', reason: "Cloned on team creation"}}}}, status: {create: {status: 'ACTIVE', reason:"Team created"}}} }, TEAMS_FRAGMENT)
|
||||
.catch((err) => {
|
||||
logger.debug(err, 'createTeamMutation error: ')
|
||||
return err
|
||||
throw new DatabaseError(err)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -120,21 +120,21 @@ export const resolvers = {
|
||||
})
|
||||
.catch((err) => {
|
||||
logger.debug('createTeam error: ')
|
||||
return err
|
||||
throw new DatabaseError(`Team Creation Error: ${err}`)
|
||||
})
|
||||
},
|
||||
async updateTeamProfile(parent, { slug, owner, description, motto, avatar, banner }, ctx, info) {
|
||||
return ctx.db.mutation.updateTeam({data:{profile: {update: {description: description, motto: motto, avatar: avatar, banner: banner}}}, where:{slug: slug}}, TEAMS_FRAGMENT)
|
||||
.catch((err) => {
|
||||
logger.debug('createTeam error: ', err)
|
||||
return err
|
||||
throw new DatabaseError(`Team Profile Update Error: ${err}`)
|
||||
})
|
||||
},
|
||||
async updateFB(parent, { fbId, avatar}, ctx, info) {
|
||||
return ctx.db.mutation.updateFinancialBeings({data:{avatar:avatar}, where:{id:fbId}}, info)
|
||||
.catch((err) => {
|
||||
logger.debug('createTeam error: ', err)
|
||||
return err
|
||||
throw new DatabaseError(`Update Financial Being Error: ${err}`)
|
||||
})
|
||||
},
|
||||
async deleteTeam(parent, { slug, botSlug }, ctx, info) {
|
||||
@@ -166,14 +166,14 @@ export const resolvers = {
|
||||
.then((result) => {
|
||||
console.log('deletePlatformTeam result:', result.data)
|
||||
if(result.data.result === 'Fail'){
|
||||
return result.data.message
|
||||
throw new DatabaseError(result.data.message)
|
||||
}
|
||||
return result
|
||||
})
|
||||
.catch(err =>{
|
||||
logger.debug('deletePlatformTeam err:')
|
||||
logger.debug(err)
|
||||
throw new Error(err)
|
||||
throw new DatabaseError(err)
|
||||
})
|
||||
console.log('deletePlatformTeam returned: ', await deletePlatformTeam)
|
||||
|
||||
@@ -181,13 +181,13 @@ export const resolvers = {
|
||||
.catch((res) => {
|
||||
logger.info('deleteTeam error: ', res)
|
||||
const errors = res.graphQLErrors.map((error) => {
|
||||
return error.message
|
||||
throw new DatabaseError(error.message)
|
||||
})
|
||||
})
|
||||
})
|
||||
.catch((err) => {
|
||||
logger.debug('deleteTeam error: ')
|
||||
return err
|
||||
throw new DatabaseError(err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { logger } from '../../../logger'
|
||||
import { logger, AuthenticationError, DatabaseError } from '../../../logger'
|
||||
|
||||
import TEAMS_CONNECTIONS_FRAGMENT from '../../fragments/TeamsConnectionsFragment'
|
||||
import TEAMS_FRAGMENT from '../../fragments/TeamsFragment'
|
||||
@@ -9,8 +9,10 @@ export const teams = async (parent, args, ctx, info) => {
|
||||
return ctx.db.query.teamsConnection({}, TEAMS_CONNECTIONS_FRAGMENT)
|
||||
}
|
||||
|
||||
export const teamById = async (parent, { id }, ctx, info) => {
|
||||
return ctx.db.query.team({ where: { id } }, info)
|
||||
export const teamById = async (parent, { teamId }, ctx, info) => {
|
||||
logger.info('teamById')
|
||||
logger.info(teamId)
|
||||
return ctx.db.query.team({ where: { id: teamId } }, info)
|
||||
}
|
||||
|
||||
export const teamByName = async (parent, { name }, ctx, info) => {
|
||||
@@ -26,6 +28,7 @@ export const teamsByOwner = async (parent, args, ctx, info) => {
|
||||
const authId = ctx.request.headers.userid
|
||||
if (!authId) {
|
||||
throw new AuthenticationError()
|
||||
return
|
||||
}
|
||||
return ctx.db.query.teams({where: { owner: authId }, orderBy:'updatedAt_DESC'}, TEAMS_FRAGMENT)
|
||||
}
|
||||
@@ -41,10 +44,9 @@ export const teamsByRole = async (parent, args, ctx, info) => {
|
||||
} catch (err) {
|
||||
logger.debug('teamsByRole error: ')
|
||||
logger.debug(err)
|
||||
const errors = res.graphQLErrors.map((error) => {
|
||||
return error.message
|
||||
const errors = err.graphQLErrors.map((error) => {
|
||||
throw new DatabaseError(error.message)
|
||||
})
|
||||
return errors
|
||||
}
|
||||
logger.info('teamsByRole teamAdmin: ', teamAdmin)
|
||||
return teamAdmin
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import { logger } from '../../../logger'
|
||||
|
||||
import TEAM_FB_FRAGMENT from '../../fragments/TeamFBFragment'
|
||||
|
||||
export const fbByTeamMember = async (parent, args, ctx, info) => {
|
||||
logger.info('fbByTeamMember: ', args, ctx.request, ctx.request.res.req.user)
|
||||
const authId = ctx.request.headers.userid
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import { createLogger, format, transports } from 'winston'
|
||||
import { inspect } from 'util'
|
||||
|
||||
import { AuthenticationError as ApolloAuthenticationError } from 'apollo-server-express'
|
||||
|
||||
import { AuthenticationError, DatabaseError, WrongArgumentsError, ServiceUnavailableError } from './errors'
|
||||
|
||||
class LoggerService {
|
||||
@@ -30,4 +32,4 @@ class LoggerService {
|
||||
}
|
||||
|
||||
export const logger = new LoggerService() // Default logger
|
||||
export { LoggerService, AuthenticationError, DatabaseError, WrongArgumentsError, ServiceUnavailableError }
|
||||
export { LoggerService, AuthenticationError, ApolloAuthenticationError, DatabaseError, WrongArgumentsError, ServiceUnavailableError }
|
||||
@@ -12,19 +12,32 @@ import GroupIcon from '@material-ui/icons/Group'
|
||||
import UsersIcon from '@material-ui/icons/People'
|
||||
import SearchIcon from '@material-ui/icons/Search'
|
||||
import AdbIcon from '@material-ui/icons/Adb'
|
||||
import SettingsApplicationsIcon from '@material-ui/icons/SettingsApplications'
|
||||
// import SettingsApplicationsIcon from '@material-ui/icons/SettingsApplications'
|
||||
import BugReportIcon from '@material-ui/icons/BugReport'
|
||||
|
||||
import { Link } from 'react-router-dom'
|
||||
|
||||
import log from '../../../utils/log'
|
||||
|
||||
const SettingsLink = props => <Link to='/teams/settings' {...props} />
|
||||
// const SettingsLink = props => <Link to='/teams/settings' {...props} />
|
||||
const FBLink = props => <Link to='/teams/financial-beings' {...props} />
|
||||
const MembersLink = props => <Link to='/teams/team-members' {...props} />
|
||||
const ManageLink = props => <Link {...props} />
|
||||
const ViewLink = props => <Link to='/teams' {...props} />
|
||||
|
||||
/*
|
||||
<Button
|
||||
variant='text'
|
||||
size='small'
|
||||
className={classNames(classes.button, classes.cssRoot)}
|
||||
title='Your Global Team Settings'
|
||||
component={SettingsLink}
|
||||
to={`${match.url}/settings`}>
|
||||
<SettingsApplicationsIcon className={classNames(classes.leftIcon, classes.iconSmall)} />
|
||||
Settings
|
||||
</Button>
|
||||
*/
|
||||
|
||||
const styles = theme => ({
|
||||
root: {
|
||||
flexGrow: 1
|
||||
@@ -112,16 +125,6 @@ class TeamBar extends Component {
|
||||
<AdbIcon className={classNames(classes.leftIcon, classes.iconSmall)} />
|
||||
Financial Beings
|
||||
</Button>
|
||||
<Button
|
||||
variant='text'
|
||||
size='small'
|
||||
className={classNames(classes.button, classes.cssRoot)}
|
||||
title='Your Global Team Settings'
|
||||
component={SettingsLink}
|
||||
to={`${match.url}/settings`}>
|
||||
<SettingsApplicationsIcon className={classNames(classes.leftIcon, classes.iconSmall)} />
|
||||
Settings
|
||||
</Button>
|
||||
<Button
|
||||
variant='text'
|
||||
size='small'
|
||||
|
||||
@@ -190,6 +190,7 @@ export class ManageFBEdit extends Component {
|
||||
avatar: this.state.avatar
|
||||
}
|
||||
})
|
||||
window.canvasApp.eventHandler.raiseEvent('User Profile Changed')
|
||||
this.setState({ open: false })
|
||||
}
|
||||
}
|
||||
|
||||
@@ -210,6 +210,7 @@ export class CreateTeamDialog extends Component {
|
||||
const slug = this.slugify(name)
|
||||
const botSlug = this.slugify(botName)
|
||||
await createTeam({ variables: { name, slug, botName, botSlug } })
|
||||
window.canvasApp.eventHandler.raiseEvent('User Profile Changed')
|
||||
this.setState({ name: '', open: false })
|
||||
}
|
||||
|
||||
|
||||
@@ -144,6 +144,7 @@ export class ManageTeamDelete extends Component {
|
||||
async handleSubmit (e, deleteTeam, slug, botSlug) {
|
||||
e.preventDefault()
|
||||
await deleteTeam({ variables: { slug, botSlug } })
|
||||
window.canvasApp.eventHandler.raiseEvent('User Profile Changed')
|
||||
this.setState({ open: false })
|
||||
}
|
||||
}
|
||||
|
||||
@@ -266,6 +266,7 @@ export class ManageTeamEdit extends Component {
|
||||
banner: this.state.banner
|
||||
}
|
||||
})
|
||||
window.canvasApp.eventHandler.raiseEvent('User Profile Changed')
|
||||
this.setState({ description: '', motto: '', open: false })
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,9 +38,6 @@ export const TeamsItem = ({ classes, team }) => {
|
||||
<Typography gutterBottom variant='h5' component='h2'>
|
||||
{team.name}
|
||||
</Typography>
|
||||
<Typography variant='caption' color='textSecondary'>
|
||||
{team.createdAt}
|
||||
</Typography>
|
||||
<Typography variant='caption' paragraph gutterBottom>
|
||||
Members: 1
|
||||
</Typography>
|
||||
|
||||
Reference in new issue
Block a user