opex792 commited on
Commit
81094c3
·
verified ·
1 Parent(s): 8b34dfb

Create server.js

Browse files
Files changed (1) hide show
  1. server.js +80 -0
server.js ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import express from 'express';
2
+ import swaggerUi from 'swagger-ui-express';
3
+ import YAML from 'yamljs';
4
+ import path from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ import { getAuthorData, getAuthorFilters } from 'stihirus-reader';
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+
11
+ const app = express();
12
+ const port = process.env.PORT || 7860;
13
+
14
+ const swaggerDocument = YAML.load(path.join(__dirname, 'openapi.yaml'));
15
+
16
+ app.use('/docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument));
17
+
18
+ app.get('/author/:identifier', async (req, res) => {
19
+ const identifier = req.params.identifier;
20
+ let page = req.query.page;
21
+ let delay = req.query.delay;
22
+
23
+ let pageNum = null;
24
+ if (page !== undefined) {
25
+ const parsedPage = parseInt(page, 10);
26
+ if (!isNaN(parsedPage) && parsedPage >= 0) {
27
+ pageNum = parsedPage;
28
+ } else if (page === 'null' || page === '') {
29
+ pageNum = null;
30
+ } else {
31
+ return res.status(400).json({ status: 'error', error: { code: 400, message: 'Invalid page parameter. Use null, 0, or a positive integer.' } });
32
+ }
33
+ }
34
+
35
+ let delayMs = undefined;
36
+ if (delay !== undefined) {
37
+ const parsedDelay = parseInt(delay, 10);
38
+ if (!isNaN(parsedDelay) && parsedDelay >= 0) {
39
+ delayMs = parsedDelay;
40
+ } else {
41
+ return res.status(400).json({ status: 'error', error: { code: 400, message: 'Invalid delay parameter. Use a non-negative integer.' } });
42
+ }
43
+ }
44
+
45
+ try {
46
+ const result = await getAuthorData(identifier, pageNum, delayMs);
47
+ if (result.status === 'success') {
48
+ res.json(result);
49
+ } else {
50
+ res.status(result.error.code >= 400 && result.error.code < 600 ? result.error.code : 500).json(result);
51
+ }
52
+ } catch (err) {
53
+ console.error(`Error processing /author/${identifier}:`, err);
54
+ res.status(500).json({ status: 'error', error: { code: 500, message: 'Internal Server Error', originalMessage: err.message } });
55
+ }
56
+ });
57
+
58
+ app.get('/author/:identifier/filters', async (req, res) => {
59
+ const identifier = req.params.identifier;
60
+ try {
61
+ const result = await getAuthorFilters(identifier);
62
+ if (result.status === 'success') {
63
+ res.json(result);
64
+ } else {
65
+ res.status(result.error.code >= 400 && result.error.code < 600 ? result.error.code : 500).json(result);
66
+ }
67
+ } catch (err) {
68
+ console.error(`Error processing /author/${identifier}/filters:`, err);
69
+ res.status(500).json({ status: 'error', error: { code: 500, message: 'Internal Server Error', originalMessage: err.message } });
70
+ }
71
+ });
72
+
73
+ app.get('/', (req, res) => {
74
+ res.redirect('/docs');
75
+ });
76
+
77
+ app.listen(port, () => {
78
+ console.log(`StihiRus API wrapper listening on port ${port}`);
79
+ console.log(`API Docs available at /docs`);
80
+ });