// main.js import express from 'express'; import dotenv from 'dotenv'; import cors from 'cors'; // Import the cors middleware import { fetchActivityData } from './engage-api/get-activity.mjs'; import { structActivityData } from './engage-api/struct-activity.mjs'; import { structStaffData } from './engage-api/struct-staff.mjs'; // Load environment variables from .env file dotenv.config(); // --- Configuration --- const USERNAME = process.env.API_USERNAME; const PASSWORD = process.env.API_PASSWORD; const PORT = process.env.PORT || 3000; const FIXED_STAFF_ACTIVITY_ID = process.env.FIXED_STAFF_ACTIVITY_ID || '3350'; const allowedOriginsEnv = process.env.ALLOWED_ORIGINS || '*'; let corsOptions; if (allowedOriginsEnv === '*') { corsOptions = { origin: '*' }; } else { // If ALLOWED_ORIGINS is a comma-separated list, split it into an array const originsArray = allowedOriginsEnv.split(',').map(origin => origin.trim()); corsOptions = { origin: function (origin, callback) { // Allow requests with no origin (like mobile apps or curl requests) if (!origin) return callback(null, true); if (originsArray.indexOf(origin) !== -1 || originsArray.includes('*')) { callback(null, true); } else { callback(new Error('Not allowed by CORS')); } } }; } // --- Initialize Express App --- const app = express(); // Apply CORS middleware globally FIRST // This will add the 'Access-Control-Allow-Origin' header to all responses app.use(cors(corsOptions)); // Middleware to parse JSON request bodies app.use(express.json()); // --- API Endpoints --- // GET Endpoint: Welcome message app.get('/', (req, res) => { res.send('Welcome to the DSAS CCA API!

\ API Endpoints:
\ GET /v1/activity/:activityId (ID must be 1-4 digits)
\ GET /v1/staffs'); }); // GET Endpoint: Fetch structured activity data by ID app.get('/v1/activity/:activityId', async (req, res) => { let { activityId } = req.params; if (!/^\d{1,4}$/.test(activityId)) { return res.status(400).json({ error: 'Invalid Activity ID format. Activity ID must be 1 to 4 digits (e.g., 1, 0001, 9999).' }); } if (!USERNAME || !PASSWORD) { console.error('API username or password not configured. Check .env file or environment variables.'); return res.status(500).json({ error: 'Server configuration error.' }); } console.log(`Workspaceing activity details for activity ID: ${activityId}`); try { const activityJson = await fetchActivityData(activityId, USERNAME, PASSWORD); if (activityJson) { const structuredActivity = await structActivityData(activityJson); res.json(structuredActivity); } else { res.status(404).json({ error: `Could not retrieve details for activity ${activityId}.` }); } } catch (error) { console.error(`Error fetching activity ${activityId}:`, error); res.status(500).json({ error: 'An internal server error occurred while fetching activity data.' }); } }); // GET Endpoint: Fetch fixed structured staff data app.get('/v1/staffs', async (req, res) => { if (!USERNAME || !PASSWORD) { console.error('API username or password not configured. Check .env file or environment variables.'); return res.status(500).json({ error: 'Server configuration error.' }); } console.log(`Workspaceing staff details (using fixed activity ID: ${FIXED_STAFF_ACTIVITY_ID})`); try { const activityJson = await fetchActivityData(FIXED_STAFF_ACTIVITY_ID, USERNAME, PASSWORD); if (activityJson) { const staffMap = await structStaffData(activityJson); const staffObject = Object.fromEntries(staffMap); res.json(staffObject); } else { res.status(404).json({ error: `Could not retrieve base data using activity ID ${FIXED_STAFF_ACTIVITY_ID} to get staff details.` }); } } catch (error) { console.error(`Error fetching staff data (for fixed activity ID ${FIXED_STAFF_ACTIVITY_ID}):`, error); res.status(500).json({ error: 'An internal server error occurred while fetching staff data.' }); } }); // --- Start the Server --- app.listen(PORT, () => { console.log(`Server is running on http://localhost:${PORT}`); console.log(`Allowed CORS origins: ${allowedOriginsEnv === '*' ? 'All (*)' : allowedOriginsEnv}`); console.log('API Endpoints:'); console.log(` GET /v1/activity/:activityId (ID must be 1-4 digits)`); console.log(` GET /v1/staffs`); if (!USERNAME || !PASSWORD) { console.warn('Warning: API_USERNAME or API_PASSWORD is not set. Please configure them in your .env file or environment variables.'); } }); // Graceful shutdown process.on('SIGINT', () => { console.log('Server shutting down...'); process.exit(0); });