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

170 lines
3.8 KiB
JavaScript

const express = require('express');
const router = express.Router();
const { CampaignRepository } = require('../repositories');
const logger = require('../../../src/utils/logger');
/**
* Get all campaigns for the site
* GET /api/plugins/voting/campaigns
*/
router.get('/', async (req, res) => {
try {
const siteId = req.query.site_id || req.user?.siteId;
const campaignRepo = new CampaignRepository();
const filters = { site_id: siteId };
const options = {
orderBy: 'created_at',
orderDirection: 'desc'
};
const campaigns = await campaignRepo.findWithFilters(filters, options);
res.json({
success: true,
data: campaigns
});
} catch (error) {
logger.error('Failed to get campaigns:', error);
res.status(500).json({
success: false,
error: 'Failed to retrieve campaigns',
message: error.message
});
}
});
/**
* Get a specific campaign by ID
* GET /api/plugins/voting/campaigns/:id
*/
router.get('/:id', async (req, res) => {
try {
const { id } = req.params;
const campaignRepo = new CampaignRepository();
const campaign = await campaignRepo.findByIdWithDetails(id);
if (!campaign) {
return res.status(404).json({
success: false,
error: 'Campaign not found'
});
}
res.json({
success: true,
data: campaign
});
} catch (error) {
logger.error('Failed to get campaign:', error);
res.status(500).json({
success: false,
error: 'Failed to retrieve campaign',
message: error.message
});
}
});
/**
* Create a new campaign
* POST /api/plugins/voting/campaigns
*/
router.post('/', async (req, res) => {
try {
const campaignRepo = new CampaignRepository();
const campaignData = {
...req.body,
created_by: req.user?.id,
created_at: new Date().toISOString(),
updated_at: new Date().toISOString()
};
const campaign = await campaignRepo.create(campaignData);
res.status(201).json({
success: true,
data: campaign,
message: 'Campaign created successfully'
});
} catch (error) {
logger.error('Failed to create campaign:', error);
res.status(500).json({
success: false,
error: 'Failed to create campaign',
message: error.message
});
}
});
/**
* Update a campaign
* PUT /api/plugins/voting/campaigns/:id
*/
router.put('/:id', async (req, res) => {
try {
const { id } = req.params;
const campaignRepo = new CampaignRepository();
const updateData = {
...req.body,
updated_at: new Date().toISOString()
};
const campaign = await campaignRepo.updateById(id, updateData);
if (!campaign) {
return res.status(404).json({
success: false,
error: 'Campaign not found'
});
}
res.json({
success: true,
data: campaign,
message: 'Campaign updated successfully'
});
} catch (error) {
logger.error('Failed to update campaign:', error);
res.status(500).json({
success: false,
error: 'Failed to update campaign',
message: error.message
});
}
});
/**
* Delete a campaign
* DELETE /api/plugins/voting/campaigns/:id
*/
router.delete('/:id', async (req, res) => {
try {
const { id } = req.params;
const campaignRepo = new CampaignRepository();
const deleted = await campaignRepo.deleteById(id);
if (!deleted) {
return res.status(404).json({
success: false,
error: 'Campaign not found'
});
}
res.json({
success: true,
message: 'Campaign deleted successfully'
});
} catch (error) {
logger.error('Failed to delete campaign:', error);
res.status(500).json({
success: false,
error: 'Failed to delete campaign',
message: error.message
});
}
});
module.exports = router;