diff --git a/groups/RODA/index.html b/groups/RODA/index.html index 71a8e09..05b5752 100644 --- a/groups/RODA/index.html +++ b/groups/RODA/index.html @@ -76,6 +76,7 @@ window.APP_CONFIG = window.APP_CONFIG || { debugLogs: false, dashboardRuntimeFetch: 'always', + dashboardApiUrl: 'api/dashboard', dashboardTargetUrl: 'https://dashboard.informatika.untan.ac.id/index.php?penelitian', dashboardProxyTemplates: [ 'https://api.codetabs.com/v1/proxy?quest={{url}}', @@ -1677,14 +1678,13 @@ } const targetUrl = window.APP_CONFIG?.dashboardTargetUrl?.trim(); + const dashboardApiUrl = window.APP_CONFIG?.dashboardApiUrl?.trim(); const proxyTemplates = Array.isArray(window.APP_CONFIG?.dashboardProxyTemplates) ? window.APP_CONFIG.dashboardProxyTemplates.filter(Boolean) : []; - // Endpoint server.js hanya ada saat development lokal. - const proxyServers = shouldUseLocalDashboardProxy() ? [() => '/api/dashboard'] : []; + const proxyServers = dashboardApiUrl ? [() => dashboardApiUrl] : []; - // Deployment static memakai proxy publik karena tidak menjalankan server.js. if (targetUrl) { proxyTemplates.forEach((template) => { proxyServers.push((url) => template diff --git a/groups/RODA/server.js b/groups/RODA/server.js index 42dd119..2bf9d4e 100644 --- a/groups/RODA/server.js +++ b/groups/RODA/server.js @@ -7,8 +7,10 @@ const ROOT_DIR = __dirname; const PARENT_DIR = path.join(__dirname, '..', '..'); const INDEX_PATH = path.join(ROOT_DIR, 'index.html'); const ENV_PATH = path.join(ROOT_DIR, '.env'); -const HOST = '127.0.0.1'; +const HOST = process.env.HOST || '127.0.0.1'; const PORT = Number(process.env.PORT || 3000); +const DEFAULT_DASHBOARD_TARGET_URL = 'https://dashboard.informatika.untan.ac.id/index.php?penelitian'; +const RODA_PATH_PREFIX = '/groups/RODA'; function logServerError(scope, error, extra = {}) { console.error(`[${scope}]`, error && error.stack ? error.stack : error, extra); @@ -62,7 +64,10 @@ function getAppConfig() { ].filter(Boolean); return { - dashboardTargetUrl: env.DASHBOARD_TARGET_URL || '', + debugLogs: env.DEBUG_LOGS === 'true', + dashboardRuntimeFetch: env.DASHBOARD_RUNTIME_FETCH || 'always', + dashboardApiUrl: env.DASHBOARD_API_URL || 'api/dashboard', + dashboardTargetUrl: env.DASHBOARD_TARGET_URL || DEFAULT_DASHBOARD_TARGET_URL, dashboardProxyTemplates }; } @@ -113,10 +118,6 @@ function validateAppConfig(config) { errors.push('DASHBOARD_TARGET_URL belum diisi.'); } - if (!Array.isArray(config.dashboardProxyTemplates) || !config.dashboardProxyTemplates.length) { - errors.push('Minimal satu DASHBOARD_PROXY_* harus diisi.'); - } - return errors; } @@ -195,17 +196,29 @@ function sendNotFound(res) { res.end('Not found'); } +function getRodaStaticPathname(pathname) { + if (pathname === RODA_PATH_PREFIX || pathname === `${RODA_PATH_PREFIX}/` || pathname === `${RODA_PATH_PREFIX}/index.html`) { + return '/index.html'; + } + + if (pathname.startsWith(`${RODA_PATH_PREFIX}/`)) { + return pathname.slice(RODA_PATH_PREFIX.length); + } + + return pathname; +} + const server = http.createServer((req, res) => { try { const requestUrl = new URL(req.url, `http://${req.headers.host}`); const pathname = requestUrl.pathname; - if (pathname === '/' || pathname === '/index.html') { + if (pathname === '/' || pathname === '/index.html' || pathname === RODA_PATH_PREFIX || pathname === `${RODA_PATH_PREFIX}/` || pathname === `${RODA_PATH_PREFIX}/index.html`) { sendHtml(res); return; } - if (pathname === '/api/dashboard') { + if (pathname === '/api/dashboard' || pathname === `${RODA_PATH_PREFIX}/api/dashboard`) { fetchDashboardHtml() .then(({ html, cached }) => { res.writeHead(200, { @@ -237,7 +250,7 @@ const server = http.createServer((req, res) => { } // Serve static files from ROOT_DIR - const filepath = path.join(ROOT_DIR, pathname); + const filepath = path.join(ROOT_DIR, getRodaStaticPathname(pathname)); const normalizedPath = path.normalize(filepath); // Security check: ensure the requested file is within ROOT_DIR diff --git a/package.json b/package.json index b0c5938..b8879f2 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,9 @@ "type": "module", "description": "Student-safe static page assignment kit for Informatika UNTAN", "scripts": { - "dev": "vite", + "dev": "node groups/RODA/server.js", + "dev:vite": "vite", + "dev:roda": "node groups/RODA/server.js", "build": "vite build", "test:tapops": "node --test groups/Tapops/tests/*.test.mjs", "preview": "vite preview" diff --git a/vite.config.js b/vite.config.js index f076183..f9ff8dc 100644 --- a/vite.config.js +++ b/vite.config.js @@ -130,7 +130,7 @@ function serveRodaDashboardApi() { configureServer(server) { server.middlewares.use(async (req, res, next) => { const requestUrl = new URL(req.url || '/', 'http://localhost'); - if (requestUrl.pathname !== '/api/dashboard') { + if (requestUrl.pathname !== '/api/dashboard' && requestUrl.pathname !== '/groups/RODA/api/dashboard') { next(); return; }