| Server IP : 167.235.67.158 / Your IP : 216.73.216.95 Web Server : Apache System : Linux ubuntu-8gb-nbg1-1 6.8.0-111-generic #111-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 11 23:16:02 UTC 2026 x86_64 User : upstairsbar.co.uk ( 982) PHP Version : 8.3.6 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/api.pda.the-word.com/ |
Upload File : |
require('dotenv').config();
const { ensureApiTables } = require('./common/sqlDB');
const helpers = require('./common/helpers');
const logger = require('./common/logger');
const authHelpers = require('./common/auth');
const authHandler = require('./auth/handler');
const userHandler = require('./user/handler');
const studentsHandler = require('./students/handler');
const lessonsHandler = require('./lessons/handler');
const trackRecordHandler = require('./trackRecord/handler');
const messagesHandler = require('./messages/handler');
const skillsHandler = require('./skills/handler');
const invoicesHandler = require('./invoices/handler');
const opsHandler = require('./ops/handler');
const PUBLIC_PATHS = new Set([
'/auth/login'
]);
function getHandler(path) {
if (path.startsWith('/auth')) return authHandler;
if (path.startsWith('/user')) return userHandler;
if (path.startsWith('/students') && /\/messages$/.test(path)) return messagesHandler;
if (path.startsWith('/students') && /\/gdpr-send$/.test(path)) return opsHandler;
if (path.startsWith('/students')) return studentsHandler;
if (path.startsWith('/lessons')) return lessonsHandler;
if (path.startsWith('/track-record')) return trackRecordHandler;
if (path.startsWith('/skills')) return skillsHandler;
if (path.startsWith('/invoices')) return invoicesHandler;
if (path.startsWith('/summary-email') || path.startsWith('/client-errors')) return opsHandler;
return null;
}
async function handler(event) {
const path = helpers.normalizePath(event);
const method = helpers.getMethod(event);
const apiKey = helpers.getHeader(event.headers, 'x-api-token');
logger.info('request', { method, path });
if (!process.env.API_KEY) {
return helpers.formatResponse({ statusCode: 500, body: { message: 'API_KEY is not configured.' } });
}
if (apiKey !== process.env.API_KEY) {
return helpers.formatResponse({ statusCode: 403, body: { message: 'Forbidden' } });
}
try {
await ensureApiTables();
} catch (error) {
logger.error('ensureApiTables failed', error);
return helpers.formatResponse({ statusCode: 500, body: { message: 'Database bootstrap failed.' } });
}
if (!PUBLIC_PATHS.has(path)) {
const token = helpers.extractBearerToken(event.headers);
if (!token) {
return helpers.formatResponse({ statusCode: 401, body: { message: 'Unauthorized' } });
}
try {
const user = await authHelpers.verifySessionToken(token);
if (!user) {
return helpers.formatResponse({ statusCode: 401, body: { message: 'Unauthorized' } });
}
event.user = user;
event.sessionToken = token;
} catch (error) {
return helpers.formatResponse({ statusCode: 401, body: { message: 'Unauthorized' } });
}
}
const routeHandler = getHandler(path);
if (!routeHandler) {
return helpers.formatResponse({ statusCode: 404, body: { message: 'Not Found' } });
}
try {
return await routeHandler.handle(event);
} catch (error) {
logger.error('unhandled route error', error);
return helpers.formatResponse({ statusCode: error.statusCode || 500, body: { message: error.message || 'Internal Server Error' } });
}
}
module.exports = {
handler
};