diff --git a/packages/backend/src/graphql/mutations/login.ts b/packages/backend/src/graphql/mutations/login.ts new file mode 100644 index 00000000..1f5810cb --- /dev/null +++ b/packages/backend/src/graphql/mutations/login.ts @@ -0,0 +1,30 @@ +import { GraphQLString, GraphQLNonNull } from 'graphql'; +import User from '../../models/user'; +import userType from '../types/user'; + +type Params = { + email: string, + password: string +} +const loginResolver = async (params: Params) => { + const user = await User.query().findOne({ + email: params.email, + }); + + if (user && await user.login(params.password)) { + return user; + } + + throw new Error('User could not be found.') +} + +const login = { + type: userType, + args: { + email: { type: GraphQLNonNull(GraphQLString) }, + password: { type: GraphQLNonNull(GraphQLString) } + }, + resolve: (_: any, params: any) => loginResolver(params) +}; + +export default login; diff --git a/packages/backend/src/graphql/root-mutation.ts b/packages/backend/src/graphql/root-mutation.ts index 270722cd..98a0bb4f 100644 --- a/packages/backend/src/graphql/root-mutation.ts +++ b/packages/backend/src/graphql/root-mutation.ts @@ -9,6 +9,7 @@ import createFlow from './mutations/create-flow'; import updateFlow from './mutations/update-flow'; import createStep from './mutations/create-step'; import executeStep from './mutations/execute-step'; +import login from './mutations/login'; const rootMutation = new GraphQLObjectType({ name: 'Mutation', @@ -22,7 +23,8 @@ const rootMutation = new GraphQLObjectType({ createFlow, updateFlow, createStep, - executeStep + executeStep, + login } }); diff --git a/packages/backend/src/graphql/types/user.ts b/packages/backend/src/graphql/types/user.ts new file mode 100644 index 00000000..4c72d345 --- /dev/null +++ b/packages/backend/src/graphql/types/user.ts @@ -0,0 +1,13 @@ +import { GraphQLObjectType, GraphQLString, GraphQLList, GraphQLInt } from 'graphql'; + +const userType = new GraphQLObjectType({ + name: 'User', + fields: { + id: { type: GraphQLString }, + email: { type: GraphQLString }, + createdAt: { type: GraphQLString }, + updatedAt: { type: GraphQLString } + } +}) + +export default userType; diff --git a/packages/backend/src/models/user.ts b/packages/backend/src/models/user.ts index 35dbc9f5..5874994a 100644 --- a/packages/backend/src/models/user.ts +++ b/packages/backend/src/models/user.ts @@ -32,6 +32,10 @@ class User extends Base { } }) + login(password: string) { + return bcrypt.compare(password, this.password); + } + async generateHash() { this.password = await bcrypt.hash(this.password, 10); }