ticket-booking-be/src/auth/auth.service.ts
2025-04-11 13:14:06 +05:30

126 lines
4.1 KiB
TypeScript

import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { Response } from 'express';
import { Utility } from 'src/common/Utility';
import JwtPayload from 'src/jwt/jwt-payload.dto';
import RefreshToken from 'src/jwt/refresh-token.entity';
import { User } from 'src/user/user.entity';
import { UserService } from 'src/user/user.service';
import { Request } from 'express';
@Injectable()
export class AuthService {
constructor(private userService: UserService, private jwtService: JwtService) { }
private signToken(payload: any, type: 'accessToken' | 'refreshToken') {
const config = Utility.jwtConfig[type];
return this.jwtService.sign(payload, {
secret: config.secretOrKey,
expiresIn: config.expiresIn,
});
}
private verifyToken(token: string, type: 'accessToken' | 'refreshToken'): any {
const config = Utility.jwtConfig[type];
try {
return this.jwtService.verify(token, {
secret: config.secretOrKey,
});
} catch (error) {
return null;
}
}
async validateUser(payload: any) {
return this.userService.findByEmail(payload.email);
}
async login(user: any) {
const { password, ...rest } = user;
const payload = { rest };
const accessToken = this.signToken(payload, 'accessToken');
const refreshToken = this.signToken(payload, 'refreshToken');
await RefreshToken.create({ email: user.email, token: refreshToken, type: 'jwt' });
return {
access_token: accessToken,
refresh_token: refreshToken,
};
}
async signup(user: any) {
const { password, ...rest } = user;
const payload = { rest };
const accessToken = this.signToken(payload, 'accessToken');
const refreshToken = this.signToken(payload, 'refreshToken');
await RefreshToken.create({ email: user.email, token: refreshToken, type: 'jwt' });
return {
access_token: accessToken,
refresh_token: refreshToken,
};
}
async refreshAccessToken(refreshToken: string) {
const payload = this.verifyToken(refreshToken, 'refreshToken');
if (!payload) {
throw new Error('Invalid refresh token');
}
const user = await this.userService.findByEmail(payload.email);
if (!user) {
throw new Error('User not found');
}
const { password, ...rest } = user;
const newPayload = { rest };
const accessToken = this.signToken({ newPayload }, 'accessToken');
return { access_token: accessToken };
}
async verifyRefreshToken(refreshToken: string) {
const payload = this.verifyToken(refreshToken, 'refreshToken');
return payload;
}
async verifyAccessToken(accessToken: string) {
const payload = this.verifyToken(accessToken, 'accessToken');
return payload;
}
async logout(refreshToken: string) {
return RefreshToken.destroy({ where: { token: refreshToken } });
}
//google services
async googleOauthRedirect(user) {
console.log("user in service is", user);
if (!user.email) {
return {
statusCode: 400,
message: 'User not found'
}
}
console.log("user.email in service is", user.email);
let existingUser = await User.findOne({ where: { email: user.email } });
if (!existingUser) {
existingUser = await User.create({
email: user.email,
name: user.name,
userTypeCode: 'user'
});
}
const payload = existingUser.get();
const { password, ...rest } = payload
const accessToken = this.signToken(rest, 'accessToken');
const refreshToken = this.signToken(rest, 'refreshToken');
await RefreshToken.create({ email: payload.email, token: refreshToken, type: 'jwt' });
return {
statusCode: 200,
access_token: accessToken,
refresh_token: refreshToken
}
}
}