170 lines
3.8 KiB
JavaScript
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;
|
|
|