You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.0 KiB
89 lines
2.0 KiB
const express = require('express'); |
|
const { |
|
listAssets, |
|
getPrices, |
|
buildQuote, |
|
getStatus |
|
} = require('./price_engine'); |
|
|
|
const router = express.Router(); |
|
|
|
function sendError(res, status, message, extra = {}) { |
|
return res.status(status).json({ |
|
ok: false, |
|
error: message, |
|
...extra |
|
}); |
|
} |
|
|
|
router.get('/health', (req, res) => { |
|
try { |
|
return res.json({ |
|
ok: true, |
|
service: 'otb-oracle', |
|
version: '0.1.0', |
|
time_utc: new Date().toISOString(), |
|
status: 'healthy' |
|
}); |
|
} catch (err) { |
|
return sendError(res, 500, 'health_failed', { detail: err.message }); |
|
} |
|
}); |
|
|
|
router.get('/assets', (req, res) => { |
|
try { |
|
return res.json(listAssets()); |
|
} catch (err) { |
|
return sendError(res, 500, 'assets_failed', { detail: err.message }); |
|
} |
|
}); |
|
|
|
router.get('/prices', (req, res) => { |
|
try { |
|
return res.json(getPrices()); |
|
} catch (err) { |
|
return sendError(res, 500, 'prices_failed', { detail: err.message }); |
|
} |
|
}); |
|
|
|
router.get('/price/:pairKey', (req, res) => { |
|
try { |
|
const pairKey = String(req.params.pairKey || '').trim().toUpperCase(); |
|
const prices = getPrices(); |
|
const asset = prices.assets?.[pairKey]; |
|
|
|
if (!asset) { |
|
return sendError(res, 404, 'asset_not_found', { pair_key: pairKey }); |
|
} |
|
|
|
return res.json(asset); |
|
} catch (err) { |
|
return sendError(res, 500, 'price_lookup_failed', { detail: err.message }); |
|
} |
|
}); |
|
|
|
router.get('/quote', (req, res) => { |
|
try { |
|
const fiat = req.query.fiat || 'CAD'; |
|
const amount = req.query.amount; |
|
|
|
if (amount === undefined || amount === null || amount === '') { |
|
return sendError(res, 400, 'missing_amount'); |
|
} |
|
|
|
const quote = buildQuote({ fiat, amount }); |
|
return res.json(quote); |
|
} catch (err) { |
|
return sendError(res, 400, 'quote_failed', { detail: err.message }); |
|
} |
|
}); |
|
|
|
router.get('/status', (req, res) => { |
|
try { |
|
return res.json(getStatus()); |
|
} catch (err) { |
|
return sendError(res, 500, 'status_failed', { detail: err.message }); |
|
} |
|
}); |
|
|
|
module.exports = router;
|
|
|