Added Override Credential Params + Swagger

Added JS_USER  and JS_PASSWORD to env variables so that these credentials can be used to access jellystat incase of forgotten credentials

Added swagger implementation + swag doc auto-generator
This commit is contained in:
Thegan Govender
2023-09-11 22:00:44 +02:00
parent aeb46f2a08
commit c21b2f2c65
13 changed files with 3131 additions and 28 deletions

View File

@@ -19,12 +19,14 @@ const axios_instance = axios.create({
const router = express.Router();
router.get("/test", async (req, res) => {
console.log(`ENDPOINT CALLED: /test`);
res.send("Backend Responded Succesfully");
});
//Settings and config endpoints
router.get("/getconfig", async (req, res) => {
try {
const { rows } = await db.query(
@@ -974,8 +976,11 @@ router.post("/validateSettings", async (req, res) => {
} catch (error) {
isValid = false;
errorMessage = `Error: ${error}`;
}
console.log({ isValid: isValid, errorMessage: errorMessage });
res.send({ isValid: isValid, errorMessage: errorMessage });
});

View File

@@ -1,9 +1,12 @@
const express = require("express");
const CryptoJS = require('crypto-js');
const db = require("../db");
const jwt = require('jsonwebtoken');
const JWT_SECRET = process.env.JWT_SECRET;
const JS_USER=process.env.JS_USER;
const JS_PASSWORD = process.env.JS_PASSWORD;
if (JWT_SECRET === undefined) {
console.log('JWT Secret cannot be undefined');
process.exit(1); // end the program with error status code
@@ -13,14 +16,15 @@ const router = express.Router();
router.post('/login', async (req, res) => {
try{
const { username, password } = req.body;
const query = 'SELECT * FROM app_config WHERE ("APP_USER" = $1 AND "APP_PASSWORD" = $2) OR "REQUIRE_LOGIN" = false';
const values = [username, password];
const { rows: login } = await db.query(query, values);
if(login.length>0)
if(login.length>0 || (username===JS_USER && password===CryptoJS.SHA3(JS_PASSWORD).toString()))
{
const user = { id: 1, username: username };
@@ -75,8 +79,7 @@ router.post('/login', async (req, res) => {
console.log(error);
}
});
router.post('/createuser', async (req, res) => {

View File

@@ -1,4 +1,4 @@
const { Router } = require('express');
const express = require("express");
const { Pool } = require('pg');
const fs = require('fs');
const path = require('path');
@@ -14,7 +14,7 @@ const taskName = require('../logging/taskName');
const { sendUpdate } = require('../ws');
const router = Router();
const router = express.Router();
// Database connection parameters
const postgresUser = process.env.POSTGRES_USER;

View File

@@ -8,6 +8,7 @@ const {jf_logging_columns,jf_logging_mapping,} = require("../models/jf_logging")
const express = require("express");
const router = express.Router();
router.get("/getLogs", async (req, res) => {
try {
const { rows } = await db.query(`SELECT * FROM jf_logging order by "TimeRun" desc LIMIT 50 `);

View File

@@ -41,8 +41,7 @@ router.get('/web/assets/img/devices/', async(req, res) => {
return; // Add this line
})
.catch((error) => {
console.error(error);
res.status(500).send('Error fetching image: '+error);
res.status(error?.response?.status || 500).send('Error fetching image: '+error);
});
});
@@ -76,8 +75,7 @@ router.get('/Items/Images/Backdrop/', async(req, res) => {
}
})
.catch((error) => {
// console.error(error);
res.status(500).send('Error fetching image: '+error);
res.status(error?.response?.status || 500).send('Error fetching image: '+error);
});
});
@@ -107,8 +105,7 @@ router.get('/Items/Images/Backdrop/', async(req, res) => {
}
})
.catch((error) => {
// console.error(error);
res.status(500).send('Error fetching image: '+error);
res.status(error?.response?.status || 500).send('Error fetching image: '+error);
});
});
@@ -139,8 +136,7 @@ router.get('/Items/Images/Backdrop/', async(req, res) => {
}
})
.catch((error) => {
// console.error(error);
res.status(500).send('Error fetching image: '+error);
res.status(error?.response?.status || 500).send('Error fetching image: '+error);
});
});

View File

@@ -8,13 +8,13 @@ const knexConfig = require('./migrations');
const authRouter= require('./routes/auth');
const apiRouter = require('./routes/api');
const proxyRouter = require('./routes/proxy');
const {router: syncRouter} = require('./routes/sync');
const syncRouter = require('./routes/sync');
const statsRouter = require('./routes/stats');
const {router: backupRouter} = require('./routes/backup');
const backupRouter = require('./routes/backup');
const ActivityMonitor = require('./tasks/ActivityMonitor');
const SyncTask = require('./tasks/SyncTask');
const BackupTask = require('./tasks/BackupTask');
const {router: logRouter} = require('./routes/logging');
const logRouter = require('./routes/logging');
const dbInstance = require("./db");
@@ -102,13 +102,18 @@ async function authenticate (req, res, next) {
}
}
app.use('/auth', authRouter); // mount the API router at /auth
app.use('/proxy', proxyRouter); // mount the API router at /proxy
app.use('/api', authenticate , apiRouter); // mount the API router at /api, with JWT middleware
app.use('/sync', authenticate , syncRouter); // mount the API router at /sync, with JWT middleware
app.use('/stats', authenticate , statsRouter); // mount the API router at /stats, with JWT middleware
app.use('/backup', authenticate , backupRouter); // mount the API router at /backup, with JWT middleware
app.use('/logs', authenticate , logRouter); // mount the API router at /logs, with JWT middleware
app.use('/auth', authRouter ,()=>{/* #swagger.tags = ['Auth'] */}); // mount the API router at /auth
app.use('/proxy', proxyRouter,()=>{/* #swagger.tags = ['Proxy']*/}); // mount the API router at /proxy
app.use('/api', authenticate , apiRouter,()=>{/* #swagger.tags = ['API']*/}); // mount the API router at /api, with JWT middleware
app.use('/sync', authenticate , syncRouter.router,()=>{/* #swagger.tags = ['Sync']*/}); // mount the API router at /sync, with JWT middleware
app.use('/stats', authenticate , statsRouter,()=>{/* #swagger.tags = ['Stats']*/}); // mount the API router at /stats, with JWT middleware
app.use('/backup', authenticate , backupRouter.router,()=>{/* #swagger.tags = ['Backup']*/}); // mount the API router at /backup, with JWT middleware
app.use('/logs', authenticate , logRouter.router,()=>{/* #swagger.tags = ['Logs']*/}); // mount the API router at /logs, with JWT middleware
const swaggerUi = require('swagger-ui-express');
const swaggerDocument = require('./swagger.json');
app.use('/swagger', swaggerUi.serve, swaggerUi.setup(swaggerDocument));
try{
createdb.createDatabase().then((result) => {

55
backend/swagautogen.js Normal file
View File

@@ -0,0 +1,55 @@
const swaggerAutogen = require('swagger-autogen')();
const outputFile = './swagger.json';
const endpointsFiles = ['./server.js'];
const config = {
info: {
title: 'Jellystat API Documentation',
description: '',
},
tags: [
{
name: 'API',
description: 'Jellystat API Endpoints',
},
{
name: 'Auth',
description: 'Jellystat Auth Endpoints',
},
{
name: 'Proxy',
description: 'Jellyfin Proxied Endpoints',
},
{
name: 'Stats',
description: 'Jellystat Statisitc Endpoints',
},
{
name: 'Backup',
description: 'Jellystat Backup/Restore Endpoints',
},
{
name: 'Logs',
description: 'Jellystat Log Endpoints',
},
],
host: 'localhost:3003',
schemes: ['http', 'https'],
securityDefinitions: {
apiKey: {
type: 'apiKey',
name: 'x-api-token', // The name of the header to pass the API key
in: 'header',
},
},
security: [
{
apiKey: [], // Reference the security definition defined above
},
],
};
module.exports = config;
swaggerAutogen(outputFile, endpointsFiles, config);

2612
backend/swagger.json Normal file

File diff suppressed because it is too large Load Diff

413
package-lock.json generated
View File

@@ -29,6 +29,8 @@
"cors": "^2.8.5",
"crypto-js": "^4.1.1",
"dottie": "^2.0.6",
"express": "^4.18.2",
"express-swagger-generator": "^1.1.17",
"file-saver": "^2.0.5",
"github-api": "^3.4.0",
"http-proxy-middleware": "^2.0.6",
@@ -54,6 +56,9 @@
"sequelize": "^6.29.0",
"socket.io": "^4.7.2",
"socket.io-client": "^4.7.2",
"swagger-autogen": "^2.23.5",
"swagger-jsdoc": "^6.2.8",
"swagger-ui-express": "^5.0.0",
"web-vitals": "^2.1.4",
"ws": "^8.13.0"
}
@@ -141,6 +146,90 @@
"react": ">=16.9.0"
}
},
"node_modules/@apidevtools/json-schema-ref-parser": {
"version": "9.1.2",
"resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz",
"integrity": "sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==",
"dependencies": {
"@jsdevtools/ono": "^7.1.3",
"@types/json-schema": "^7.0.6",
"call-me-maybe": "^1.0.1",
"js-yaml": "^4.1.0"
}
},
"node_modules/@apidevtools/json-schema-ref-parser/node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
},
"node_modules/@apidevtools/json-schema-ref-parser/node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dependencies": {
"argparse": "^2.0.1"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/@apidevtools/openapi-schemas": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz",
"integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==",
"engines": {
"node": ">=10"
}
},
"node_modules/@apidevtools/swagger-methods": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz",
"integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg=="
},
"node_modules/@apidevtools/swagger-parser": {
"version": "10.0.3",
"resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz",
"integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==",
"dependencies": {
"@apidevtools/json-schema-ref-parser": "^9.0.6",
"@apidevtools/openapi-schemas": "^2.0.4",
"@apidevtools/swagger-methods": "^3.0.2",
"@jsdevtools/ono": "^7.1.3",
"call-me-maybe": "^1.0.1",
"z-schema": "^5.0.1"
},
"peerDependencies": {
"openapi-types": ">=7"
}
},
"node_modules/@apidevtools/swagger-parser/node_modules/commander": {
"version": "9.5.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
"integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
"optional": true,
"engines": {
"node": "^12.20.0 || >=14"
}
},
"node_modules/@apidevtools/swagger-parser/node_modules/z-schema": {
"version": "5.0.5",
"resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz",
"integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==",
"dependencies": {
"lodash.get": "^4.4.2",
"lodash.isequal": "^4.5.0",
"validator": "^13.7.0"
},
"bin": {
"z-schema": "bin/z-schema"
},
"engines": {
"node": ">=8.0.0"
},
"optionalDependencies": {
"commander": "^9.4.1"
}
},
"node_modules/@babel/code-frame": {
"version": "7.18.6",
"license": "MIT",
@@ -3025,6 +3114,11 @@
"@jridgewell/sourcemap-codec": "1.4.14"
}
},
"node_modules/@jsdevtools/ono": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz",
"integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg=="
},
"node_modules/@leichtgewicht/ip-codec": {
"version": "2.0.4",
"license": "MIT"
@@ -6935,6 +7029,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/call-me-maybe": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz",
"integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ=="
},
"node_modules/callsites": {
"version": "3.1.0",
"license": "MIT",
@@ -8356,6 +8455,25 @@
"node": ">=6.0.0"
}
},
"node_modules/doctrine-file": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/doctrine-file/-/doctrine-file-1.0.3.tgz",
"integrity": "sha512-OK37HbZtNmIMn84riibVXRmcEGUIf6BNfYMcbXg20ejP+LEsf4tnk8QfYy3EmQs4KzZFhTl3zwoKqVwARxpBgA==",
"dependencies": {
"doctrine": "^2.0.0"
}
},
"node_modules/doctrine-file/node_modules/doctrine": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
"integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
"dependencies": {
"esutils": "^2.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/dom-accessibility-api": {
"version": "0.5.16",
"license": "MIT"
@@ -9542,7 +9660,8 @@
},
"node_modules/express": {
"version": "4.18.2",
"license": "MIT",
"resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
"integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
@@ -9580,6 +9699,38 @@
"node": ">= 0.10.0"
}
},
"node_modules/express-swagger-generator": {
"version": "1.1.17",
"resolved": "https://registry.npmjs.org/express-swagger-generator/-/express-swagger-generator-1.1.17.tgz",
"integrity": "sha512-eKB2cR3TcvmSepkqjm9sFPqPAV7PQawyc3Df2p9/0vN4Q7LyBrLLpechH246YYJ1kIDPa8RresfhJeIHg5zS4A==",
"dependencies": {
"doctrine": "^2.0.0",
"doctrine-file": "^1.0.2",
"express-swaggerize-ui": "^1.0.3",
"glob": "^7.0.3",
"recursive-iterator": "^2.0.3",
"swagger-parser": "^5.0.5"
}
},
"node_modules/express-swagger-generator/node_modules/doctrine": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
"integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
"dependencies": {
"esutils": "^2.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/express-swaggerize-ui": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/express-swaggerize-ui/-/express-swaggerize-ui-1.1.0.tgz",
"integrity": "sha512-dDJuWV/GlISNYyKvFMa3EDr6sYzMgMrVRCt9o1kQxaIIKnmK1NJvaTzGbRIokIlGGHriIT6E2ztorRyRxLuOzA==",
"dependencies": {
"express": "^4.13.3"
}
},
"node_modules/express-winston": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/express-winston/-/express-winston-2.6.0.tgz",
@@ -10046,6 +10197,11 @@
"node": ">= 6"
}
},
"node_modules/format-util": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz",
"integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg=="
},
"node_modules/forwarded": {
"version": "0.2.0",
"license": "MIT",
@@ -13222,6 +13378,26 @@
"version": "0.4.0",
"license": "(AFL-2.1 OR BSD-3-Clause)"
},
"node_modules/json-schema-ref-parser": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-5.1.3.tgz",
"integrity": "sha512-CpDFlBwz/6la78hZxyB9FECVKGYjIIl3Ms3KLqFj99W7IIb7D00/RDgc++IGB4BBALl0QRhh5m4q5WNSopvLtQ==",
"deprecated": "Please switch to @apidevtools/json-schema-ref-parser",
"dependencies": {
"call-me-maybe": "^1.0.1",
"debug": "^3.1.0",
"js-yaml": "^3.12.0",
"ono": "^4.0.6"
}
},
"node_modules/json-schema-ref-parser/node_modules/debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dependencies": {
"ms": "^2.1.1"
}
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"license": "MIT"
@@ -13264,6 +13440,19 @@
"node": ">=0.10.0"
}
},
"node_modules/jsonschema": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
"integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
"engines": {
"node": "*"
}
},
"node_modules/jsonschema-draft4": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/jsonschema-draft4/-/jsonschema-draft4-1.0.0.tgz",
"integrity": "sha512-sBV3UnQPRiyCTD6uzY/Oao2Yohv6KKgQq7zjPwjFHeR6scg/QSXnzDxdugsGaLQDmFUrUlTbMYdEE+72PizhGA=="
},
"node_modules/jsonwebtoken": {
"version": "9.0.0",
"license": "MIT",
@@ -13465,6 +13654,16 @@
"version": "4.0.8",
"license": "MIT"
},
"node_modules/lodash.get": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
"integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="
},
"node_modules/lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
"integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
},
"node_modules/lodash.memoize": {
"version": "4.1.2",
"license": "MIT"
@@ -13473,6 +13672,11 @@
"version": "4.6.2",
"license": "MIT"
},
"node_modules/lodash.mergewith": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
"integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="
},
"node_modules/lodash.sortby": {
"version": "4.7.0",
"license": "MIT"
@@ -14052,6 +14256,14 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ono": {
"version": "4.0.11",
"resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz",
"integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==",
"dependencies": {
"format-util": "^1.0.3"
}
},
"node_modules/open": {
"version": "8.4.2",
"license": "MIT",
@@ -14067,6 +14279,22 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/openapi-schema-validation": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/openapi-schema-validation/-/openapi-schema-validation-0.4.2.tgz",
"integrity": "sha512-K8LqLpkUf2S04p2Nphq9L+3bGFh/kJypxIG2NVGKX0ffzT4NQI9HirhiY6Iurfej9lCu7y4Ndm4tv+lm86Ck7w==",
"dependencies": {
"jsonschema": "1.2.4",
"jsonschema-draft4": "^1.0.0",
"swagger-schema-official": "2.0.0-bab6bed"
}
},
"node_modules/openapi-types": {
"version": "12.1.3",
"resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz",
"integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==",
"peer": true
},
"node_modules/optionator": {
"version": "0.9.1",
"license": "MIT",
@@ -16900,6 +17128,11 @@
"node": ">= 10.13.0"
}
},
"node_modules/recursive-iterator": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/recursive-iterator/-/recursive-iterator-2.0.3.tgz",
"integrity": "sha512-SqfNKjjTw7Lq3E2S6P8L5Ac7YFD91mbkzWRlxrWK4tWioJRKDhe1+PtWS0X0hkQNEzZDpSish0TTXAVM4cRUzQ=="
},
"node_modules/recursive-readdir": {
"version": "2.2.3",
"license": "MIT",
@@ -18230,6 +18463,146 @@
"boolbase": "~1.0.0"
}
},
"node_modules/swagger-autogen": {
"version": "2.23.5",
"resolved": "https://registry.npmjs.org/swagger-autogen/-/swagger-autogen-2.23.5.tgz",
"integrity": "sha512-4Tl2+XhZMyHoBYkABnScHtQE0lKPKUD3NBt09mClrI6UKOUYljKlYw1xiFVwsHCTGR2hAXmhT4PpgjruCtt1ZA==",
"dependencies": {
"acorn": "^7.4.1",
"deepmerge": "^4.2.2",
"glob": "^7.1.7",
"json5": "^2.2.3"
}
},
"node_modules/swagger-autogen/node_modules/acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/swagger-jsdoc": {
"version": "6.2.8",
"resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-6.2.8.tgz",
"integrity": "sha512-VPvil1+JRpmJ55CgAtn8DIcpBs0bL5L3q5bVQvF4tAW/k/9JYSj7dCpaYCAv5rufe0vcCbBRQXGvzpkWjvLklQ==",
"dependencies": {
"commander": "6.2.0",
"doctrine": "3.0.0",
"glob": "7.1.6",
"lodash.mergewith": "^4.6.2",
"swagger-parser": "^10.0.3",
"yaml": "2.0.0-1"
},
"bin": {
"swagger-jsdoc": "bin/swagger-jsdoc.js"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/swagger-jsdoc/node_modules/commander": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz",
"integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==",
"engines": {
"node": ">= 6"
}
},
"node_modules/swagger-jsdoc/node_modules/glob": {
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
},
"engines": {
"node": "*"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/swagger-jsdoc/node_modules/swagger-parser": {
"version": "10.0.3",
"resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz",
"integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==",
"dependencies": {
"@apidevtools/swagger-parser": "10.0.3"
},
"engines": {
"node": ">=10"
}
},
"node_modules/swagger-jsdoc/node_modules/yaml": {
"version": "2.0.0-1",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz",
"integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==",
"engines": {
"node": ">= 6"
}
},
"node_modules/swagger-methods": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/swagger-methods/-/swagger-methods-1.0.8.tgz",
"integrity": "sha512-G6baCwuHA+C5jf4FNOrosE4XlmGsdjbOjdBK4yuiDDj/ro9uR4Srj3OR84oQMT8F3qKp00tYNv0YN730oTHPZA==",
"deprecated": "This package is no longer being maintained."
},
"node_modules/swagger-parser": {
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-5.0.6.tgz",
"integrity": "sha512-FdzCYFK11iGgrOpojlqUluU6SKThtzmu+5Get+6ValJR2TFwTnES1x4Fdfgy3C4/8VVXk4Va/WsqGlbyY/Os+A==",
"dependencies": {
"call-me-maybe": "^1.0.1",
"debug": "^3.1.0",
"json-schema-ref-parser": "^5.1.3",
"ono": "^4.0.6",
"openapi-schema-validation": "^0.4.2",
"swagger-methods": "^1.0.4",
"swagger-schema-official": "2.0.0-bab6bed",
"z-schema": "^3.23.0"
}
},
"node_modules/swagger-parser/node_modules/debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dependencies": {
"ms": "^2.1.1"
}
},
"node_modules/swagger-schema-official": {
"version": "2.0.0-bab6bed",
"resolved": "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz",
"integrity": "sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA=="
},
"node_modules/swagger-ui-dist": {
"version": "5.6.2",
"resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.6.2.tgz",
"integrity": "sha512-2LKVuU2m6RHkemJloKiKJOTpN2RPmbsiad0OfSdtmFHOXJKAgYRZMwJcpT96RX6E9HUB5RkVOFC6vWqVjRgSOg=="
},
"node_modules/swagger-ui-express": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.0.tgz",
"integrity": "sha512-tsU9tODVvhyfkNSvf03E6FAk+z+5cU3lXAzMy6Pv4av2Gt2xA0++fogwC4qo19XuFf6hdxevPuVCSKFuMHJhFA==",
"dependencies": {
"swagger-ui-dist": ">=5.0.0"
},
"engines": {
"node": ">= v0.10.32"
},
"peerDependencies": {
"express": ">=4.0.0 || >=5.0.0-beta"
}
},
"node_modules/symbol-tree": {
"version": "3.2.4",
"license": "MIT"
@@ -19828,6 +20201,44 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/z-schema": {
"version": "3.25.1",
"resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.25.1.tgz",
"integrity": "sha512-7tDlwhrBG+oYFdXNOjILSurpfQyuVgkRe3hB2q8TEssamDHB7BbLWYkYO98nTn0FibfdFroFKDjndbgufAgS/Q==",
"dependencies": {
"core-js": "^2.5.7",
"lodash.get": "^4.0.0",
"lodash.isequal": "^4.0.0",
"validator": "^10.0.0"
},
"bin": {
"z-schema": "bin/z-schema"
},
"optionalDependencies": {
"commander": "^2.7.1"
}
},
"node_modules/z-schema/node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"optional": true
},
"node_modules/z-schema/node_modules/core-js": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
"deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
"hasInstallScript": true
},
"node_modules/z-schema/node_modules/validator": {
"version": "10.11.0",
"resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz",
"integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==",
"engines": {
"node": ">= 0.10"
}
}
}
}

View File

@@ -24,6 +24,8 @@
"cors": "^2.8.5",
"crypto-js": "^4.1.1",
"dottie": "^2.0.6",
"express": "^4.18.2",
"express-swagger-generator": "^1.1.17",
"file-saver": "^2.0.5",
"github-api": "^3.4.0",
"http-proxy-middleware": "^2.0.6",
@@ -49,6 +51,9 @@
"sequelize": "^6.29.0",
"socket.io": "^4.7.2",
"socket.io-client": "^4.7.2",
"swagger-autogen": "^2.23.5",
"swagger-jsdoc": "^6.2.8",
"swagger-ui-express": "^5.0.0",
"web-vitals": "^2.1.4",
"ws": "^8.13.0"
},

View File

@@ -54,7 +54,6 @@ function ItemInfo() {
const fetchData = async () => {
if(config){
console.log('fetch');
setRefresh(true);
try {
const itemData = await axios.post(`/api/getItemDetails`, {
@@ -102,6 +101,7 @@ useEffect(() => {
const intervalId = setInterval(fetchData, 60000 * 5);
return () => clearInterval(intervalId);
// eslint-disable-next-line
}, [config, Id]);

View File

@@ -91,7 +91,10 @@ export default function Tasks() {
{value:15, display:"15 Minutes"},
{value:30, display:"30 Minutes"},
{value:60, display:"1 Hour"},
{value:1440, display:"1 Day"}];
{value:720, display:"12 Hours"},
{value:1440, display:"1 Day"},
{value:10080, display:"1 Week"}
];
return (
<div className="tasks">

View File

@@ -57,6 +57,13 @@ module.exports = function(app) {
changeOrigin: true,
})
);
app.use(
'/swagger',
createProxyMiddleware({
target: `http://127.0.0.1:${process.env.PORT || 3003}`,
changeOrigin: true,
})
);
console.log(`Proxy middleware applied`);