aboutsummaryrefslogblamecommitdiffstats
path: root/backend/index.js
blob: 7b548ad60cf55e168c5ca6394f8381aaf634fc37 (plain) (tree)
1
2
3
4
5
6
7
8
                                   
                                                


                                          


                                                                   


                           
 





















                                                                                

                     
                                              




                                           





                                                                      










                                                    





                                          
















                                                                                         
   

   











                                                                             



                                                            
const express = require('express');
const rateLimit = require('express-rate-limit');
const bodyParser = require('body-parser');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const admin = require('firebase-admin');
const cors = require('cors'); // Import the cors package
require('dotenv').config(); // Load environment variables from .env

const app = express();
app.use(bodyParser.json());

// Enable CORS for all origins
app.use(cors());

// Firebase Admin SDK setup
const serviceAccount = {
  type: process.env.FIREBASE_TYPE,
  project_id: process.env.FIREBASE_PROJECT_ID,
  private_key_id: process.env.FIREBASE_PRIVATE_KEY_ID,
  private_key: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n'),
  client_email: process.env.FIREBASE_CLIENT_EMAIL,
  client_id: process.env.FIREBASE_CLIENT_ID,
  auth_uri: process.env.FIREBASE_AUTH_URI,
  token_uri: process.env.FIREBASE_TOKEN_URI,
  auth_provider_x509_cert_url: process.env.FIREBASE_AUTH_PROVIDER_X509_CERT_URL,
  client_x509_cert_url: process.env.FIREBASE_CLIENT_X509_CERT_URL
};

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

const db = admin.firestore();

// Secret key for JWT
const JWT_SECRET = process.env.JWT_SECRET_KEY;

// Register route
app.post('/register', async (req, res) => {
  const { username, password } = req.body;

  if (!username || !password) {
    return res.status(400).send('Username and password are required');
  }

  const hashedPassword = await bcrypt.hash(password, 10);

  // Save user to Firebase Firestore
  try {
    await db.collection('users').doc(username).set({
      username,
      password: hashedPassword
    });
    res.status(201).send('User registered');
  } catch (error) {
    console.error('Error registering user:', error);
    res.status(500).send('Error registering user');
  }
});

// Login route
app.post('/login', async (req, res) => {
  const { username, password } = req.body;

  try {
    const userDoc = await db.collection('users').doc(username).get();
    if (!userDoc.exists) {
      return res.status(400).send('Invalid username or password');
    }

    const user = userDoc.data();
    const isPasswordValid = await bcrypt.compare(password, user.password);
    if (!isPasswordValid) {
      return res.status(400).send('Invalid username or password');
    }

    const token = jwt.sign({ username: user.username }, JWT_SECRET, { expiresIn: '1h' });
    res.json({ token });
  } catch (error) {
    console.error('Error during login:', error);
    res.status(500).send('Error during login');
  }
});

// Fetch ads route
app.get('/ads', async (req, res) => {
  try {
    const adsSnapshot = await db.collection('ads').get();
    const ads = adsSnapshot.docs.map(doc => ({ id: doc.id, ...doc.data() }));
    res.json(ads);
  } catch (error) {
    console.error('Error fetching ads:', error);
    res.status(500).send('Error fetching ads');
  }
});

const PORT = 5000;
app.listen(PORT, () => {
  console.log(`Server running on http://localhost:${PORT}`);
});