const express = require('express'); const router = express.Router(); const { ResponseRepository, ResponseAnswerRepository, ResponseChangeLogRepository } = require('../repositories'); const logger = require('../../../src/utils/logger'); /** * Get all responses for a campaign * GET /api/plugins/voting/responses?campaign_id=xxx */ router.get('/', async (req, res) => { try { const { campaign_id, person_id } = req.query; const responseRepo = new ResponseRepository(); const filters = {}; if (campaign_id) filters.campaign_id = campaign_id; if (person_id) filters.person_id = person_id; const options = { orderBy: 'created_at', orderDirection: 'desc' }; const responses = await responseRepo.findWithFilters(filters, options); res.json({ success: true, data: responses }); } catch (error) { logger.error('Failed to get responses:', error); res.status(500).json({ success: false, error: 'Failed to retrieve responses', message: error.message }); } }); /** * Get a specific response by ID * GET /api/plugins/voting/responses/:id */ router.get('/:id', async (req, res) => { try { const { id } = req.params; const responseRepo = new ResponseRepository(); const response = await responseRepo.findOne({ id }); if (!response) { return res.status(404).json({ success: false, error: 'Response not found' }); } res.json({ success: true, data: response }); } catch (error) { logger.error('Failed to get response:', error); res.status(500).json({ success: false, error: 'Failed to retrieve response', message: error.message }); } }); /** * Submit a response * POST /api/plugins/voting/responses */ router.post('/', async (req, res) => { try { const responseRepo = new ResponseRepository(); const { campaign_id, person_id, answers } = req.body; if (!campaign_id || !person_id) { return res.status(400).json({ success: false, error: 'Missing required fields: campaign_id and person_id' }); } // Get or create response let response = await responseRepo.getOrCreate(campaign_id, person_id); // Mark as answered response = await responseRepo.markAnswered(response.id); // Store response answers in response_answers table if (answers && Array.isArray(answers)) { const answerRepo = new ResponseAnswerRepository(); for (const answer of answers) { await answerRepo.create({ response_id: response.id, question_id: answer.question_id, answer_value: answer.answer_value, answer_options: answer.answer_options, created_at: new Date().toISOString(), updated_at: new Date().toISOString() }); } } res.status(201).json({ success: true, data: response, message: 'Response submitted successfully' }); } catch (error) { logger.error('Failed to submit response:', error); res.status(500).json({ success: false, error: 'Failed to submit response', message: error.message }); } }); module.exports = router;