You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
demo-graphql-oauth/src/User/UserResolver.ts

62 lines
1.3 KiB

import "reflect-metadata"
import { Arg, Authorized, Ctx, Field, Mutation, ObjectType, Query, Resolver } from "type-graphql"
import { comparePassword, MyContext, signToken } from "../auth"
import { User } from "../User"
@ObjectType()
class LoginTokens {
@Field()
accessToken: string = ""
}
@Resolver(() => User)
export class UserResolver {
@Query(() => [User])
async users() {
return await User.find()
}
@Query(() => LoginTokens)
async loginTokens(
@Arg("email") email: string,
@Arg("password") password: string
): Promise<LoginTokens> {
const user = await User.findOne({ where: { email } })
if (!user) {
throw new Error("could not find user")
}
const passwordValid = await comparePassword(user.password, password)
if (!passwordValid) {
throw new Error("password not valid")
}
const accessToken = signToken({ userId: user.id })
return {
accessToken,
}
}
@Query(() => User)
@Authorized()
async me(@Ctx() { payload }: MyContext) {
const id = payload!.userId
const user = await User.findOne({ where: { id } })
return user
}
@Mutation(() => User)
async createUser(
@Arg("email") email: string,
@Arg("password") password: string
): Promise<User> {
return await User.create({
email,
password,
}).save()
}
}