Spaces:
Sleeping
Sleeping
| import express from 'express'; | |
| import swaggerUi from 'swagger-ui-express'; | |
| import YAML from 'yamljs'; | |
| import path from 'path'; | |
| import { fileURLToPath } from 'url'; | |
| import { getAuthorData, getAuthorFilters } from 'stihirus-reader'; | |
| const __filename = fileURLToPath(import.meta.url); | |
| const __dirname = path.dirname(__filename); | |
| const app = express(); | |
| const port = process.env.PORT || 7860; | |
| const swaggerDocument = YAML.load(path.join(__dirname, 'openapi.yaml')); | |
| app.use('/docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument)); | |
| app.get('/author/:identifier', async (req, res) => { | |
| const identifier = req.params.identifier; | |
| let page = req.query.page; | |
| let delay = req.query.delay; | |
| let pageNum = null; | |
| if (page !== undefined) { | |
| const parsedPage = parseInt(page, 10); | |
| if (!isNaN(parsedPage) && parsedPage >= 0) { | |
| pageNum = parsedPage; | |
| } else if (page === 'null' || page === '') { | |
| pageNum = null; | |
| } else { | |
| return res.status(400).json({ status: 'error', error: { code: 400, message: 'Invalid page parameter. Use null, 0, or a positive integer.' } }); | |
| } | |
| } | |
| let delayMs = undefined; | |
| if (delay !== undefined) { | |
| const parsedDelay = parseInt(delay, 10); | |
| if (!isNaN(parsedDelay) && parsedDelay >= 0) { | |
| delayMs = parsedDelay; | |
| } else { | |
| return res.status(400).json({ status: 'error', error: { code: 400, message: 'Invalid delay parameter. Use a non-negative integer.' } }); | |
| } | |
| } | |
| try { | |
| const result = await getAuthorData(identifier, pageNum, delayMs); | |
| if (result.status === 'success') { | |
| res.json(result); | |
| } else { | |
| res.status(result.error.code >= 400 && result.error.code < 600 ? result.error.code : 500).json(result); | |
| } | |
| } catch (err) { | |
| console.error(`Error processing /author/${identifier}:`, err); | |
| res.status(500).json({ status: 'error', error: { code: 500, message: 'Internal Server Error', originalMessage: err.message } }); | |
| } | |
| }); | |
| app.get('/author/:identifier/filters', async (req, res) => { | |
| const identifier = req.params.identifier; | |
| try { | |
| const result = await getAuthorFilters(identifier); | |
| if (result.status === 'success') { | |
| res.json(result); | |
| } else { | |
| res.status(result.error.code >= 400 && result.error.code < 600 ? result.error.code : 500).json(result); | |
| } | |
| } catch (err) { | |
| console.error(`Error processing /author/${identifier}/filters:`, err); | |
| res.status(500).json({ status: 'error', error: { code: 500, message: 'Internal Server Error', originalMessage: err.message } }); | |
| } | |
| }); | |
| app.get('/', (req, res) => { | |
| res.redirect('/docs'); | |
| }); | |
| app.listen(port, () => { | |
| console.log(`StihiRus API wrapper listening on port ${port}`); | |
| console.log(`API Docs available at /docs`); | |
| }); |