Files
dsas-cca-backend/main.js
JamesFlare1212 99d1ee0a1e add CORS setting
2025-05-09 10:06:04 -04:00

128 lines
4.8 KiB
JavaScript

// 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!<br/><br/>\
API Endpoints:<br/>\
GET /v1/activity/:activityId (ID must be 1-4 digits)<br/>\
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);
});