← back to Wine Finder

routes/verification.js

128 lines

const express = require('express');
const router = express.Router();
const multer = require('multer');
const wineLabelVerifier = require('../services/wineLabelVerifier');

// Configure multer for image uploads (in-memory storage)
const storage = multer.memoryStorage();
const upload = multer({
  storage: storage,
  limits: {
    fileSize: 10 * 1024 * 1024 // 10MB max file size
  },
  fileFilter: (req, file, cb) => {
    // Accept images only
    if (!file.originalname.match(/\.(jpg|jpeg|png|gif|webp)$/i)) {
      return cb(new Error('Only image files are allowed!'), false);
    }
    cb(null, true);
  }
});

/**
 * POST /api/verification/verify-label
 * Upload wine label image and verify authenticity
 */
router.post('/verify-label', upload.single('image'), async (req, res) => {
  try {
    if (!req.file) {
      return res.status(400).json({
        success: false,
        error: 'No image file provided'
      });
    }

    // Get options from request
    const options = {
      useCache: req.body.useCache !== 'false',
      confidenceThreshold: parseFloat(req.body.confidenceThreshold) || 0.40,
      crossCheckDatabase: req.body.crossCheckDatabase !== 'false'
    };

    // Convert buffer to base64
    const imageBase64 = req.file.buffer.toString('base64');
    const imageData = `data:${req.file.mimetype};base64,${imageBase64}`;

    // Verify the wine label
    const result = await wineLabelVerifier.verifyWineLabel(imageData, options);

    res.json(result);

  } catch (error) {
    console.error('Verification route error:', error);
    res.status(500).json({
      success: false,
      error: error.message
    });
  }
});

/**
 * POST /api/verification/verify-label-base64
 * Verify wine label from base64 encoded image
 */
router.post('/verify-label-base64', async (req, res) => {
  try {
    const { image, options } = req.body;

    if (!image) {
      return res.status(400).json({
        success: false,
        error: 'No image data provided'
      });
    }

    // Verify the wine label
    const result = await wineLabelVerifier.verifyWineLabel(image, options || {});

    res.json(result);

  } catch (error) {
    console.error('Verification base64 route error:', error);
    res.status(500).json({
      success: false,
      error: error.message
    });
  }
});

/**
 * GET /api/verification/stats
 * Get verification service statistics
 */
router.get('/stats', (req, res) => {
  try {
    const stats = wineLabelVerifier.getStats();
    res.json({
      success: true,
      stats
    });
  } catch (error) {
    console.error('Stats route error:', error);
    res.status(500).json({
      success: false,
      error: error.message
    });
  }
});

/**
 * GET /api/verification/test
 * Test endpoint to verify service is working
 */
router.get('/test', (req, res) => {
  res.json({
    success: true,
    message: 'Wine label verification service is running',
    roboflowConfigured: process.env.ROBOFLOW_API_KEY ? true : false,
    endpoints: [
      'POST /api/verification/verify-label (multipart/form-data)',
      'POST /api/verification/verify-label-base64 (JSON)',
      'GET /api/verification/stats',
      'GET /api/verification/test'
    ]
  });
});

module.exports = router;