mirror of
https://github.com/karma-riuk/crab-webapp.git
synced 2025-07-05 14:18:12 +02:00
created a websocket to witness the progress of the processing
This commit is contained in:
@ -9,14 +9,15 @@
|
|||||||
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
|
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"express": "^4.18.2",
|
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"dotenv": "^16.3.1",
|
"dotenv": "^16.3.1",
|
||||||
"multer": "^1.4.5-lts.1"
|
"express": "^4.18.2",
|
||||||
|
"multer": "^1.4.5-lts.1",
|
||||||
|
"socket.io": "^4.8.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"nodemon": "^3.0.2",
|
|
||||||
"jest": "^29.7.0",
|
"jest": "^29.7.0",
|
||||||
|
"nodemon": "^3.0.2",
|
||||||
"supertest": "^6.3.4"
|
"supertest": "^6.3.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,3 +25,7 @@ h1 {
|
|||||||
/* adjust size as you like */
|
/* adjust size as you like */
|
||||||
height: auto;
|
height: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#progress-container {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
<link rel="icon" type="image/x-icon" href="/img/crab.png">
|
<link rel="icon" type="image/x-icon" href="/img/crab.png">
|
||||||
<title>Dataset Downloader & Answer Uploader</title>
|
<title>Dataset Downloader & Answer Uploader</title>
|
||||||
<link rel="stylesheet" href="css/style.css">
|
<link rel="stylesheet" href="css/style.css">
|
||||||
|
<script src="/socket.io/socket.io.js"></script>
|
||||||
|
<script defer src="js/socket.js"></script>
|
||||||
<script defer src="js/index.js"></script>
|
<script defer src="js/index.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
@ -42,9 +44,14 @@
|
|||||||
<input type="file" id="fileInput" accept="application/json" />
|
<input type="file" id="fileInput" accept="application/json" />
|
||||||
<br /><br />
|
<br /><br />
|
||||||
<button id="uploadBtn">Upload JSON</button>
|
<button id="uploadBtn">Upload JSON</button>
|
||||||
|
<span id="status" style="color: green;"> </span>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
<div id="status" style="color: green;"></div>
|
|
||||||
|
<div id="progress-container">
|
||||||
|
<progress id="progress-bar" value="0" max="100"></progress>
|
||||||
|
<span id="progress-text">0%</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
26
public/js/socket.js
Normal file
26
public/js/socket.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
const socket = io();
|
||||||
|
|
||||||
|
// 2) Grab our new DOM elements
|
||||||
|
const progressContainer = document.getElementById("progress-container");
|
||||||
|
const progressBar = document.getElementById("progress-bar");
|
||||||
|
const progressText = document.getElementById("progress-text");
|
||||||
|
const statusEl = document.getElementById("status");
|
||||||
|
|
||||||
|
function setProgress(percent) {
|
||||||
|
progressBar.value = percent;
|
||||||
|
progressText.textContent = `${percent}%`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3) Update UI on each progress message
|
||||||
|
socket.on("progress", (data) => {
|
||||||
|
setProgress(data.percent);
|
||||||
|
if (data.percent == 100) {
|
||||||
|
statusEl.style.color = "green";
|
||||||
|
statusEl.textContent = "Processing complete!";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on("started-processing", () => {
|
||||||
|
progressContainer.style.display = "block";
|
||||||
|
setProgress(0);
|
||||||
|
});
|
@ -1,6 +1,8 @@
|
|||||||
import { Router } from "express";
|
import { Router } from "express";
|
||||||
import multer from "multer";
|
import multer from "multer";
|
||||||
import { InvalidJsonFormatError } from "../utils/errors.js";
|
import { InvalidJsonFormatError } from "../utils/errors.js";
|
||||||
|
import { io as socket } from "../socket.js";
|
||||||
|
import { evaluate_comments } from "../utils/process_data.js";
|
||||||
|
|
||||||
const router = Router();
|
const router = Router();
|
||||||
|
|
||||||
@ -72,8 +74,9 @@ router.post("/submit/comments", upload.single("file"), async (req, res) => {
|
|||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Save the file or process it further
|
socket.emit("started-processing");
|
||||||
// For now, just return success
|
evaluate_comments(validatedData);
|
||||||
|
|
||||||
res.status(200).json({
|
res.status(200).json({
|
||||||
message: "Answer submitted successfully",
|
message: "Answer submitted successfully",
|
||||||
data: validatedData,
|
data: validatedData,
|
||||||
@ -105,8 +108,8 @@ router.post("/submit/refinement", upload.single("file"), async (req, res) => {
|
|||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Save the file or process it further
|
socket.emit("started-processing");
|
||||||
// For now, just return success
|
evaluate_comments(validatedData);
|
||||||
res.status(200).json({
|
res.status(200).json({
|
||||||
message: "Answer submitted successfully",
|
message: "Answer submitted successfully",
|
||||||
data: validatedData,
|
data: validatedData,
|
||||||
|
@ -2,7 +2,7 @@ import express, { json } from "express";
|
|||||||
import cors from "cors";
|
import cors from "cors";
|
||||||
import dotenv from "dotenv";
|
import dotenv from "dotenv";
|
||||||
import routes from "./routes/index.js";
|
import routes from "./routes/index.js";
|
||||||
import createSocketServer from "./socket.js";
|
import { createSocketServer } from "./socket.js";
|
||||||
|
|
||||||
dotenv.config();
|
dotenv.config();
|
||||||
|
|
||||||
|
17
src/socket.js
Normal file
17
src/socket.js
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import http from "http";
|
||||||
|
import { Server } from "socket.io";
|
||||||
|
|
||||||
|
function onConnect(socket) {
|
||||||
|
console.log("Websocket client connected:", socket.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
let io;
|
||||||
|
|
||||||
|
function createSocketServer(app) {
|
||||||
|
const httpServer = http.createServer(app);
|
||||||
|
io = new Server(httpServer);
|
||||||
|
io.on("connection", onConnect);
|
||||||
|
return httpServer;
|
||||||
|
}
|
||||||
|
|
||||||
|
export { createSocketServer, io };
|
29
src/utils/process_data.js
Normal file
29
src/utils/process_data.js
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import { io as socket } from "../socket.js";
|
||||||
|
|
||||||
|
export const evaluate_comments = async (answers) => {
|
||||||
|
const total = Object.keys(answers).length;
|
||||||
|
let i = 0;
|
||||||
|
for (const [key, value] of Object.entries(answers)) {
|
||||||
|
console.log(`Processing ${key}: ${value}...`);
|
||||||
|
await new Promise((res) => setTimeout(res, 500));
|
||||||
|
console.log("Done");
|
||||||
|
const data = {
|
||||||
|
percent: Math.floor((++i / total) * 100),
|
||||||
|
};
|
||||||
|
socket.emit("progress", data);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const evaluate_refinement = async (answers) => {
|
||||||
|
const total = Object.keys(answers).length;
|
||||||
|
let i = 0;
|
||||||
|
for (const [key, value] of Object.entries(answers)) {
|
||||||
|
console.log(`Processing ${key}: ${value}...`);
|
||||||
|
await new Promise((res) => setTimeout(res, 500));
|
||||||
|
console.log("Done");
|
||||||
|
const data = {
|
||||||
|
percent: Math.floor((++i / total) * 100),
|
||||||
|
};
|
||||||
|
socket.emit("progress", data);
|
||||||
|
}
|
||||||
|
};
|
Reference in New Issue
Block a user