From d3acae0f04bb28aa9c8a8b916ddc698acfe73a80 Mon Sep 17 00:00:00 2001 From: ssbg04 <143066036+ssbg04@users.noreply.github.com> Date: Wed, 4 Jun 2025 11:24:10 +0800 Subject: [PATCH] Update index.js --- api/index.js | 136 ++++++++++++++++++++++++++++----------------------- 1 file changed, 76 insertions(+), 60 deletions(-) diff --git a/api/index.js b/api/index.js index e95c4f2..f812b62 100644 --- a/api/index.js +++ b/api/index.js @@ -2,93 +2,109 @@ const express = require('express'); const cors = require('cors'); const path = require('path'); const serverless = require('serverless-http'); -const db = require('./../firebase-config'); // make sure this works in Vercel +// Load env variables locally +require('dotenv').config(); + +// --- Firebase Admin SDK Setup --- +const admin = require('firebase-admin'); + +let db; + +if (!admin.apps.length) { + try { + const serviceAccount = JSON.parse(process.env.FIREBASE_SERVICE_ACCOUNT); + + admin.initializeApp({ + credential: admin.credential.cert(serviceAccount), + // databaseURL optional unless using Realtime DB + }); + + db = admin.firestore(); + console.log('✅ Firebase initialized'); + + } catch (error) { + console.error('❌ Firebase init error:', error); + throw new Error('Failed to initialize Firebase Admin SDK'); + } +} else { + db = admin.firestore(); +} + +// --- Express App --- const app = express(); app.use(cors()); app.use(express.json()); app.use(express.static(path.join(__dirname, '../public'))); -// CREATE - Add a new user +// Routes + +// CREATE app.post('/users', async (req, res) => { - try { - const { name, email } = req.body; - if (!name || !email) { - return res.status(400).json({ error: 'Name and email are required' }); - } + try { + const { name, email } = req.body; + if (!name || !email) return res.status(400).json({ error: 'Name and email required' }); - const docRef = await db.collection('users').add({ name, email }); - res.status(201).json({ id: docRef.id, name, email }); - } catch (err) { - res.status(500).json({ error: err.message }); - } + const docRef = await db.collection('users').add({ name, email }); + res.status(201).json({ id: docRef.id, name, email }); + + } catch (err) { + res.status(500).json({ error: err.message }); + } }); -// READ - Get all users +// READ all app.get('/users', async (req, res) => { - try { - const snapshot = await db.collection('users').get(); - const users = []; - snapshot.forEach(doc => { - users.push({ id: doc.id, ...doc.data() }); - }); - res.json(users); - } catch (err) { - res.status(500).json({ error: err.message }); - } + try { + const snapshot = await db.collection('users').get(); + const users = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); + res.json(users); + } catch (err) { + res.status(500).json({ error: err.message }); + } }); -// READ - Get a single user +// READ one app.get('/users/:id', async (req, res) => { - try { - const userRef = db.collection('users').doc(req.params.id); - const doc = await userRef.get(); + try { + const doc = await db.collection('users').doc(req.params.id).get(); + if (!doc.exists) return res.status(404).json({ error: 'User not found' }); - if (!doc.exists) { - return res.status(404).json({ error: 'User not found' }); - } - - res.json({ id: doc.id, ...doc.data() }); - } catch (err) { - res.status(500).json({ error: err.message }); - } + res.json({ id: doc.id, ...doc.data() }); + } catch (err) { + res.status(500).json({ error: err.message }); + } }); -// UPDATE - Update a user +// UPDATE app.put('/users/:id', async (req, res) => { - try { - const { name, email } = req.body; - if (!name || !email) { - return res.status(400).json({ error: 'Name and email are required' }); - } + try { + const { name, email } = req.body; + if (!name || !email) return res.status(400).json({ error: 'Name and email required' }); - const userRef = db.collection('users').doc(req.params.id); - await userRef.update({ name, email }); - - res.json({ id: req.params.id, name, email }); - } catch (err) { - res.status(500).json({ error: err.message }); - } + await db.collection('users').doc(req.params.id).update({ name, email }); + res.json({ id: req.params.id, name, email }); + } catch (err) { + res.status(500).json({ error: err.message }); + } }); -// DELETE - Delete a user +// DELETE app.delete('/users/:id', async (req, res) => { - try { - const userRef = db.collection('users').doc(req.params.id); - await userRef.delete(); - - res.json({ message: 'User deleted successfully' }); - } catch (err) { - res.status(500).json({ error: err.message }); - } + try { + await db.collection('users').doc(req.params.id).delete(); + res.json({ message: 'User deleted' }); + } catch (err) { + res.status(500).json({ error: err.message }); + } }); -// Serve index.html (optional — usually not needed in API routes) +// Serve static HTML (optional) app.get('/', (req, res) => { - res.sendFile(path.join(__dirname, '../public', 'index.html')); + res.sendFile(path.join(__dirname, '../public', 'index.html')); }); -// Export for Vercel +// Export for Vercel serverless module.exports = app; module.exports.handler = serverless(app);