All files / src/controllers auth_controller.ts

48.48% Statements 32/66
35% Branches 7/20
80% Functions 4/5
48.48% Lines 32/66

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 });
    }
};