← 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;