mirror of
https://github.com/karma-riuk/crab-webapp.git
synced 2025-07-04 22:08:12 +02:00
added routes to sumbit the answers
This commit is contained in:
@ -11,7 +11,8 @@
|
||||
"dependencies": {
|
||||
"express": "^4.18.2",
|
||||
"cors": "^2.8.5",
|
||||
"dotenv": "^16.3.1"
|
||||
"dotenv": "^16.3.1",
|
||||
"multer": "^1.4.5-lts.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"nodemon": "^3.0.2",
|
||||
|
112
src/routes/answers.js
Normal file
112
src/routes/answers.js
Normal file
@ -0,0 +1,112 @@
|
||||
import { Router } from 'express';
|
||||
import multer from 'multer';
|
||||
import { InvalidJsonFormatError } from '../utils/errors.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
// Configure multer for file uploads
|
||||
const upload = multer({
|
||||
storage: multer.memoryStorage(),
|
||||
limits: {
|
||||
fileSize: 200 * 1024 * 1024, // 200MB limit, since the comement gen is 147MB (deflated)
|
||||
},
|
||||
fileFilter: (_req, file, cb) => {
|
||||
// Accept only JSON files
|
||||
if (file.mimetype === 'application/json') {
|
||||
cb(null, true);
|
||||
} else {
|
||||
cb(new Error('Only JSON files are allowed'));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Helper function to validate JSON format
|
||||
const validateJsonFormat = (data) => {
|
||||
try {
|
||||
const parsed = JSON.parse(data);
|
||||
// Check if it's an object
|
||||
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
||||
throw new InvalidJsonFormatError("Submitted json doesn't contain an object");
|
||||
}
|
||||
// Check if all values are strings
|
||||
if (!Object.values(parsed).every(value => typeof value === 'string')) {
|
||||
throw new InvalidJsonFormatError("Submitted json object must only be str -> str. Namely id -> comment");
|
||||
}
|
||||
return parsed;
|
||||
} catch (error) {
|
||||
if (error instanceof InvalidJsonFormatError) {
|
||||
throw error;
|
||||
}
|
||||
throw new InvalidJsonFormatError('Invalid JSON format');
|
||||
}
|
||||
};
|
||||
|
||||
router.post('/submit/comments', upload.single('file'), async (req, res) => {
|
||||
try {
|
||||
if (!req.file) {
|
||||
return res.status(400).json({ error: 'No file uploaded' });
|
||||
}
|
||||
|
||||
const fileContent = req.file.buffer.toString();
|
||||
let validatedData;
|
||||
|
||||
try {
|
||||
validatedData = validateJsonFormat(fileContent);
|
||||
} catch (error) {
|
||||
if (error instanceof InvalidJsonFormatError) {
|
||||
return res.status(400).json({
|
||||
error: 'Invalid JSON format',
|
||||
message: error.message
|
||||
});
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
|
||||
// TODO: Save the file or process it further
|
||||
// For now, just return success
|
||||
res.status(200).json({
|
||||
message: 'Answer submitted successfully',
|
||||
data: validatedData
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error processing submission:', error);
|
||||
res.status(500).json({ error: 'Error processing submission' });
|
||||
}
|
||||
});
|
||||
|
||||
router.post('/submit/refinement', upload.single('file'), async (req, res) => {
|
||||
try {
|
||||
if (!req.file) {
|
||||
return res.status(400).json({ error: 'No file uploaded' });
|
||||
}
|
||||
|
||||
const fileContent = req.file.buffer.toString();
|
||||
let validatedData;
|
||||
|
||||
try {
|
||||
validatedData = validateJsonFormat(fileContent);
|
||||
} catch (error) {
|
||||
if (error instanceof InvalidJsonFormatError) {
|
||||
return res.status(400).json({
|
||||
error: 'Invalid JSON format',
|
||||
message: error.message
|
||||
});
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
|
||||
// TODO: Save the file or process it further
|
||||
// For now, just return success
|
||||
res.status(200).json({
|
||||
message: 'Answer submitted successfully',
|
||||
data: validatedData
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error processing submission:', error);
|
||||
res.status(500).json({ error: 'Error processing submission' });
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
@ -1,5 +1,6 @@
|
||||
import { Router } from 'express';
|
||||
import datasetRoutes from './datasets.js';
|
||||
import answerRoutes from './answers.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
@ -16,4 +17,7 @@ router.get('/api/hello', (_req, res) => {
|
||||
// Dataset routes
|
||||
router.use('/datasets', datasetRoutes);
|
||||
|
||||
// Answer submission routes
|
||||
router.use('/answers', answerRoutes);
|
||||
|
||||
export default router;
|
||||
|
6
src/utils/errors.js
Normal file
6
src/utils/errors.js
Normal file
@ -0,0 +1,6 @@
|
||||
export class InvalidJsonFormatError extends Error {
|
||||
constructor(message = 'JSON must be an object mapping strings to strings') {
|
||||
super(message);
|
||||
this.name = 'InvalidJsonFormatError';
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user