plugin-voting/routes/responses.js
2025-11-03 14:01:07 +02:00

124 lines
3.2 KiB
JavaScript

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;