-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathserver.ts
101 lines (92 loc) · 2.77 KB
/
server.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import * as express from 'express';
import axios from 'axios';
import {
Collection,
Item,
ItemGroup,
Response as PostmanResponse,
} from 'postman-collection';
const app = express();
const PORT = 4321;
let collection: Collection | null = null;
// Function to get the example response from a request item
const getExampleResponse = (item: Item): PostmanResponse | null => {
const responses = item.responses;
if (responses && responses.count() > 0) {
// TODO filter by query; if request query is empty, or :query or {{query}}
// Returning the first example response found
const response = responses.idx(0);
if (!response.body) {
return null;
}
return response;
}
return null;
};
// Function to set up routes based on the Postman collection
const setupRoutes = (collection: Collection | ItemGroup<Item>): void => {
collection.items.each((item: Item) => {
if (item.request) {
const method = item.request.method.toLowerCase() as
| 'get'
| 'post'
| 'put'
| 'patch'
| 'delete';
const route = item.request.url.getPath();
app[method](route, (req: express.Request, res: express.Response) => {
try {
const exampleResponse = getExampleResponse(item);
if (exampleResponse) {
res.status(exampleResponse.code || 200);
exampleResponse.headers.each((header) => {
res.set(header.key, header.value);
});
res.send(exampleResponse.body);
} else {
res.status(404).json({
status: '25',
message: 'Example response not found',
});
}
} catch (error) {
res.status(500).json({
status: '96',
message: error.message,
});
}
});
} else if (item instanceof ItemGroup) {
setupRoutes(item); // Recursively set up routes for sub-folders
}
});
};
(async () => {
try {
const schemaResponse = await axios.get('https://apis.openbanking.ng/', {
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
},
timeout: 15000,
});
const { collectionId, publishedId } = schemaResponse.data.collection.info;
const collectionResponse = await axios.get(
`https://apis.openbanking.ng/api/collections/${collectionId}/${publishedId}`,
{
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
},
timeout: 15000,
},
);
collection = new Collection(collectionResponse.data);
setupRoutes(collection);
} catch (error) {
console.error('Error fetching collection:', error);
}
})();
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});