@@ -2,19 +2,58 @@ import { Request, Response, Router } from 'express';
22import passport from 'passport' ;
33import jwt from 'jsonwebtoken' ;
44import { db } from '../db' ;
5+ import { v4 as uuidv4 } from 'uuid' ;
6+ import { COOKIE_MAX_AGE } from '../consts' ;
57const router = Router ( ) ;
68
79const CLIENT_URL =
810 process . env . AUTH_REDIRECT_URL ?? 'http://localhost:5173/game/random' ;
911const JWT_SECRET = process . env . JWT_SECRET || 'your_secret_key' ;
1012
11- interface User {
13+ interface userJwtClaims {
14+ userId : string ;
15+ name : string ;
16+ isGuest ?: boolean ;
17+ }
18+
19+ interface UserDetails {
1220 id : string ;
21+ token ?: string ;
22+ name : string ;
23+ isGuest ?: boolean ;
1324}
1425
26+ // this route is to be hit when the user wants to login as a guest
27+ router . post ( '/guest' , async ( req : Request , res : Response ) => {
28+ const bodyData = req . body ;
29+ let guestUUID = 'guest-' + uuidv4 ( ) ;
30+
31+ const user = await db . user . create ( {
32+ data : {
33+ username : guestUUID ,
34+ email : guestUUID + '@chess100x.com' ,
35+ name : bodyData . name || guestUUID ,
36+ provider : 'GUEST' ,
37+ } ,
38+ } ) ;
39+
40+ const token = jwt . sign (
41+ { userId : user . id , name : user . name , isGuest : true } ,
42+ JWT_SECRET ,
43+ ) ;
44+ const UserDetails : UserDetails = {
45+ id : user . id ,
46+ name : user . name ! ,
47+ token : token ,
48+ isGuest : true ,
49+ } ;
50+ res . cookie ( 'guest' , token , { maxAge : COOKIE_MAX_AGE } ) ;
51+ res . json ( UserDetails ) ;
52+ } ) ;
53+
1554router . get ( '/refresh' , async ( req : Request , res : Response ) => {
1655 if ( req . user ) {
17- const user = req . user as User ;
56+ const user = req . user as UserDetails ;
1857
1958 // Token is issued so it can be shared b/w HTTP and ws server
2059 // Todo: Make this temporary and add refresh logic here
@@ -25,12 +64,26 @@ router.get('/refresh', async (req: Request, res: Response) => {
2564 } ,
2665 } ) ;
2766
28- const token = jwt . sign ( { userId : user . id } , JWT_SECRET ) ;
67+ const token = jwt . sign ( { userId : user . id , name : userDb ?. name } , JWT_SECRET ) ;
2968 res . json ( {
3069 token,
3170 id : user . id ,
3271 name : userDb ?. name ,
3372 } ) ;
73+ } else if ( req . cookies && req . cookies . guest ) {
74+ const decoded = jwt . verify ( req . cookies . guest , JWT_SECRET ) as userJwtClaims ;
75+ const token = jwt . sign (
76+ { userId : decoded . userId , name : decoded . name , isGuest : true } ,
77+ JWT_SECRET ,
78+ ) ;
79+ let User : UserDetails = {
80+ id : decoded . userId ,
81+ name : decoded . name ,
82+ token : token ,
83+ isGuest : true ,
84+ } ;
85+ res . cookie ( 'guest' , token , { maxAge : COOKIE_MAX_AGE } ) ;
86+ res . json ( User ) ;
3487 } else {
3588 res . status ( 401 ) . json ( { success : false , message : 'Unauthorized' } ) ;
3689 }
@@ -41,6 +94,7 @@ router.get('/login/failed', (req: Request, res: Response) => {
4194} ) ;
4295
4396router . get ( '/logout' , ( req : Request , res : Response ) => {
97+ res . clearCookie ( 'guest' ) ;
4498 req . logout ( ( err ) => {
4599 if ( err ) {
46100 console . error ( 'Error logging out:' , err ) ;
0 commit comments