-
Notifications
You must be signed in to change notification settings - Fork 0
/
user.ts
74 lines (57 loc) · 1.95 KB
/
user.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import { Resolver, Authorized, Ctx, Query, Mutation, Arg } from 'type-graphql';
import jwt from 'jsonwebtoken';
import { User, AuthContext } from '../entities/user';
import Register from '../entities/validators/register';
import Login from '../entities/validators/login';
import type { Context } from '../types';
import { Result } from './types';
@Resolver(() => User)
export class UserResolver {
@Authorized()
@Query(() => User)
async user(@Ctx() { req, em }: Context): Promise<User> {
const { cookies } = req;
const [header, signature] = cookies['_head:sess'].split('.');
// eslint-disable-next-line dot-notation
const payload = cookies['_pay'];
const token = jwt.verify(
[header, payload, signature].join('.'),
process.env.PUB_KEY
) as AuthContext;
return em.findOne(User, { id: token.id });
}
@Mutation(() => Result)
async register(@Ctx() { res, em }: Context, @Arg('data') data: Register): Promise<Result> {
const { email, name, password, confirmPassword } = data;
const check = await em.findOne(User, { email });
if (check) return new Result(false, 'Email in use!');
try {
await User.register(res, em, {
email,
name,
password,
confirmPassword
});
} catch (e: unknown) {
const err = e as Error;
return new Result(false, err.message);
}
return new Result(true, 'Successfully registered user!');
}
@Mutation(() => Result)
async login(@Ctx() { res, em }: Context, @Arg('data') data: Login): Promise<Result> {
const { email, password } = data;
const user = await em.findOne(User, { email });
if (!user) return new Result(false, 'User does not exist!');
if (!(await user.checkPassword(password, em))) {
return new Result(false, 'Invalid password!');
}
await user.login(res);
return new Result(true, 'User successfully logged in!');
}
@Mutation(() => Result)
logout(@Ctx() { res }: Context): Result {
User.logout(res);
return new Result(true, 'Successfuly logged user out!');
}
}