TKK_E32231899/docs/Firebase-to-Laravel-sync.md

2.9 KiB

Realtime sync from Firebase -> Laravel (recommended)

Overview If you store sensor data in Firebase Realtime Database (or Firestore), the recommended real-time approach is to deploy a Firebase Cloud Function that triggers on new data and POSTs the data to your Laravel API (POST /api/sensor). This offloads the realtime logic to Firebase and keeps your Laravel app as the canonical MySQL writer.

Secure the endpoint

  • Set a shared secret in your Laravel .env as FIREBASE_SYNC_SECRET=your-secret-here.
  • The Cloud Function will include that secret in the header X-SYNC-SECRET when POSTing to /api/sensor.

Example: Realtime Database (Node.js Cloud Function)

  1. In your Firebase functions folder install node-fetch (or use built-in fetch on newer runtimes):
cd functions
npm install node-fetch@2
  1. Example index.js function:
const functions = require('firebase-functions');
const fetch = require('node-fetch');

exports.syncSensorToLaravel = functions.database
  .ref('/sensors/{pushId}')
  .onCreate(async (snapshot, context) => {
    const data = snapshot.val();
    try {
      const res = await fetch('https://YOUR_LARAVEL_HOST/api/sensor', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'X-SYNC-SECRET': 'your-secret-here'
        },
        body: JSON.stringify({
          suhu: data.suhu,
          kelembapan: data.kelembapan,
          soil: data.soil,
          image_base64: data.image_base64 // if you store base64 in Firebase
        })
      });
      const text = await res.text();
      console.log('Sync result', res.status, text);
    } catch (err) {
      console.error('Sync failed', err);
    }
  });

Example: Firestore trigger (if you use Firestore)

exports.syncSensorToLaravel = functions.firestore
  .document('sensors/{docId}')
  .onCreate(async (snap, ctx) => {
    const data = snap.data();
    // same fetch call as above
  });

Notes & tips

  • If images are large, consider storing image URLs (Cloud Storage) instead of base64 in Firebase; then let Laravel download or reference them.
  • Ensure your Laravel app is accessible from Cloud Functions (use HTTPS public URL, or a secured endpoint with token as shown).
  • You can also verify requests further by signing payloads with HMAC, or restricting Cloud Function IPs (not recommended / unreliable).

Alternative approaches

  • Polling: Laravel scheduled job that reads recent entries from Firebase (using Firebase Admin SDK for PHP). Simpler but higher-latency.
  • Direct write from device: configure ESP32 to POST directly to Laravel (we already have /api/sensor), bypassing Firebase entirely.

Next steps I can do for you

  • Add FIREBASE_SYNC_SECRET to your .env and commit a .env.example entry.
  • Update SensorController to accept signed HMAC instead of plain secret.
  • Provide a ready-to-deploy Cloud Function file and deployment commands.
  • Implement Firebase Admin-based polling in Laravel if you prefer no Cloud Functions.