124 lines
3.2 KiB
JavaScript
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;
|
|
|