const express = require('express'); const { verifyToken } = require('../auth'); const { completeAuthorization, createAuthorizationUrl, getOlistFrontendRedirect, getOlistRunDetails, getOlistStatus, requestOlistSyncStop, startOlistSync } = require('../services/olistService'); const { exportMissingProductionOrderDataCsv, importFinalizedProductionOrderCsv, listProductionOrderImportData } = require('../services/productionOrderCsvImportService'); const router = express.Router(); router.get('/olist/status', verifyToken, async (req, res, next) => { try { res.json(await getOlistStatus({ runsPage: req.query.runsPage, runsPageSize: req.query.runsPageSize })); } catch (error) { next(error); } }); router.post('/olist/authorization-url', verifyToken, async (req, res, next) => { try { res.json({ url: await createAuthorizationUrl() }); } catch (error) { next(error); } }); router.post('/olist/sync', verifyToken, async (req, res, next) => { try { const result = await startOlistSync({ trigger: 'manual', fullSync: req.body?.fullSync === true }); res.status(result.accepted ? 202 : 409).json(result); } catch (error) { next(error); } }); router.post('/olist/sync/stop', verifyToken, async (req, res, next) => { try { res.status(202).json(await requestOlistSyncStop()); } catch (error) { next(error); } }); router.get('/olist/production-order-imports', verifyToken, async (req, res, next) => { try { res.json(await listProductionOrderImportData({ runsPage: req.query.runsPage, runsPageSize: req.query.runsPageSize })); } catch (error) { next(error); } }); router.get('/olist/production-order-imports/pending-csv', verifyToken, async (req, res, next) => { try { res.json(await exportMissingProductionOrderDataCsv()); } catch (error) { next(error); } }); router.post('/olist/production-order-imports', verifyToken, async (req, res, next) => { try { res.status(201).json(await importFinalizedProductionOrderCsv(req.body || {})); } catch (error) { next(error); } }); router.get('/olist/runs/:runId', verifyToken, async (req, res, next) => { try { res.json(await getOlistRunDetails(req.params.runId, { eventsPage: req.query.eventsPage, productsPage: req.query.productsPage })); } catch (error) { next(error); } }); router.get('/olist/oauth/callback', async (req, res) => { try { if (req.query.error || !req.query.code || !req.query.state) { res.redirect(getOlistFrontendRedirect('cancelled')); return; } await completeAuthorization({ code: String(req.query.code), state: String(req.query.state) }); res.redirect(getOlistFrontendRedirect('connected')); } catch (error) { console.error('Olist OAuth callback failed:', error.message); res.redirect(getOlistFrontendRedirect('failed')); } }); module.exports = router;