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.
54 lines
1.3 KiB
54 lines
1.3 KiB
import "reflect-metadata"
|
|
import { Arg, Authorized, Ctx, Mutation, Query } from "type-graphql"
|
|
import { comparePassword, ContextInterface, signAccessToken } from "./userResolver/auth"
|
|
import { LoginTokens } from "./userResolver/LoginTokens"
|
|
import { User } from "./userResolver/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> {
|
|
try {
|
|
const user = await User.findOne({ where: { email } })
|
|
|
|
if (!(await comparePassword(user!.password, password))) {
|
|
throw new Error()
|
|
}
|
|
|
|
const accessToken = signAccessToken({ userId: user!.id })
|
|
|
|
return {
|
|
accessToken,
|
|
}
|
|
} catch (error) {
|
|
throw new Error("login credentials are invalid")
|
|
}
|
|
}
|
|
|
|
@Query(() => User)
|
|
@Authorized()
|
|
async me(@Ctx() { payload }: ContextInterface) {
|
|
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()
|
|
}
|
|
}
|
|
|