Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | 7x 7x 7x 14x 14x 14x 14x 14x 14x 7x 7x 1x 1x 1x 1x 1x 7x 11x 11x 11x 11x 11x 11x 11x 7x 7x 7x 7x 7x 5x 2x 2x | import {Request, Response} from "express";
import * as usersService from "../services/users_service";
import {handleError} from "../utils/handle_error";
import {CustomRequest} from "types/customRequest";
import admin from 'firebase-admin';
import * as dotenv from "dotenv";
dotenv.config();
// Initialize Firebase Admin SDK (ensure Firebase credentials are set in .env)
Iif (!admin.apps.length && process.env.FIREBASE_SERVICE_ACCOUNT) {
const serviceAccount = JSON.parse(process.env.FIREBASE_SERVICE_ACCOUNT!);
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});
}
export const loginUser = async (req: Request, res: Response): Promise<void> => {
try {
const authProvider = req.body.authProvider;
const { email, password } = req.body;
const tokens = await usersService.loginUser(email, password, authProvider);
Iif (!tokens) {
res.status(401).json({ message: 'Invalid credentials' });
return;
}
res.json(tokens);
} catch (err) {
handleError(err, res);
}
};
// Google & Facebook Authentication (using Firebase)
export const socialAuth = async (req: Request, res: Response) => {
try {
const { idToken, authProvider } = req.body;
if (!idToken) {
console.error("Missing idToken"); // Debugging line
return res.status(400).json({ message: 'Missing idToken' });
}
if (!authProvider) {
console.error("Missing authProvider"); // Debugging line
return res.status(400).json({ message: 'Missing authProvider' });
}
// Verify the token using Firebase Admin SDK
const decodedToken = await admin.auth().verifyIdToken(idToken);
if (!decodedToken.email) {
console.error("Invalid token - No email found"); // Debugging line
return res.status(400).json({ message: 'Invalid token' });
}
const email = decodedToken.email;
const name = decodedToken.name.toString();
const image = decodedToken.picture;
const resultTokens = await usersService.loginUserGoogle(email, authProvider, name, image);
if (!resultTokens) {
return res.status(401).json({ message: 'Invalid' });
}
return res.status(200).json(resultTokens);
} catch (error) {
console.error("Authentication failed:", error);
return res.status(400).json({ message: "Authentication failed", error });
}
};
export const logoutUser = async (req: CustomRequest, res: Response): Promise<void> => {
try {
const { refreshToken } = req.body;
const result = await usersService.logoutUser(refreshToken, req.user.id);
Iif (!result) {
res.status(401).json({ message: 'Invalid refresh token' });
return;
}
res.json({ message: 'User logged out successfully' });
} catch (err) {
handleError(err, res);
}
};
export const registerUser = async (req: Request, res: Response): Promise<void> => {
try {
const { username, password, email } = req.body;
const authProvider = req.body.authProvider;
// Check if the user already exists
const existingUser = await usersService.getUserByUsernameOrEmail(username, email);
Iif (existingUser) {
res.status(400).json({ message: 'Username or email already in use' });
return;
}
const savedUser = await usersService.registerUser(username, password, email, authProvider);
res.status(201).json(savedUser);
} catch (err) {
handleError(err, res);
}
};
export const refreshToken = async (req: Request, res: Response): Promise<void> => {
try {
const { refreshToken } = req.body;
Iif (!refreshToken) {
res.status(401).json({ message: 'Refresh token required' });
return;
}
const { newRefreshToken, accessToken } = await usersService.refreshToken(refreshToken);
res.json({ accessToken: accessToken, refreshToken: newRefreshToken });
} catch (err) {
const e: Error = err as Error
res.status(401).json({ message: e.message });
}
};
|