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;