Skip to content

Commit e52ad2e

Browse files
refactor: implement centralized error handling and debounce rank recomputations to optimize database performance
1 parent f0d3a82 commit e52ad2e

18 files changed

Lines changed: 221 additions & 388 deletions

server/Dockerfile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ COPY . .
2424
# Create uploads directory with correct permissions
2525
RUN mkdir -p uploads && chown appuser:appgroup uploads
2626

27+
# Create judge execution workdir (replaces /tmp for sandboxed code execution)
28+
RUN mkdir -p /var/codewizard/exec && chown appuser:appgroup /var/codewizard/exec
29+
30+
# Ensure judge workdir env is set
31+
ENV JUDGE_WORKDIR=/var/codewizard/exec
32+
2733
# Switch to non-root user
2834
USER appuser
2935

server/controllers/admin.js

Lines changed: 13 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import bcrypt from 'bcrypt';
66
import jwt from 'jsonwebtoken';
77
import { encryptAES } from '../libs/crypto.js';
88
import crypto from 'crypto';
9+
import { serverError } from '../libs/apiError.js';
910

1011
// Helper function to generate encrypted JWT token
1112
const generateToken = (userId) => {
@@ -74,11 +75,7 @@ export const adminSignup = async (req, res) => {
7475

7576
} catch (error) {
7677
console.error('Admin signup error:', error);
77-
res.status(500).json({
78-
success: false,
79-
message: 'Error creating admin account',
80-
error: error.message
81-
});
78+
return serverError(res, error, 'Error creating admin account');
8279
}
8380
};
8481

@@ -138,11 +135,7 @@ export const adminSignin = async (req, res) => {
138135

139136
} catch (error) {
140137
console.error('Admin signin error:', error);
141-
res.status(500).json({
142-
success: false,
143-
message: 'Error signing in',
144-
error: error.message
145-
});
138+
return serverError(res, error, 'Error signing in');
146139
}
147140
};
148141

@@ -221,11 +214,7 @@ export const createEmployee = async (req, res) => {
221214

222215
} catch (error) {
223216
console.error('Create employee error:', error);
224-
res.status(500).json({
225-
success: false,
226-
message: 'Error creating employee',
227-
error: error.message
228-
});
217+
return serverError(res, error, 'Error creating employee');
229218
}
230219
};
231220

@@ -261,11 +250,7 @@ export const getAllEmployees = async (req, res) => {
261250

262251
} catch (error) {
263252
console.error('Get employees error:', error);
264-
res.status(500).json({
265-
success: false,
266-
message: 'Error fetching employees',
267-
error: error.message
268-
});
253+
return serverError(res, error, 'Error fetching employees');
269254
}
270255
};
271256

@@ -290,11 +275,7 @@ export const getEmployeeById = async (req, res) => {
290275

291276
} catch (error) {
292277
console.error('Get employee error:', error);
293-
res.status(500).json({
294-
success: false,
295-
message: 'Error fetching employee',
296-
error: error.message
297-
});
278+
return serverError(res, error, 'Error fetching employee');
298279
}
299280
};
300281

@@ -331,11 +312,7 @@ export const updateEmployee = async (req, res) => {
331312

332313
} catch (error) {
333314
console.error('Update employee error:', error);
334-
res.status(500).json({
335-
success: false,
336-
message: 'Error updating employee',
337-
error: error.message
338-
});
315+
return serverError(res, error, 'Error updating employee');
339316
}
340317
};
341318

@@ -360,11 +337,7 @@ export const deleteEmployee = async (req, res) => {
360337

361338
} catch (error) {
362339
console.error('Delete employee error:', error);
363-
res.status(500).json({
364-
success: false,
365-
message: 'Error deleting employee',
366-
error: error.message
367-
});
340+
return serverError(res, error, 'Error deleting employee');
368341
}
369342
};
370343

@@ -419,11 +392,7 @@ export const getDashboardStats = async (req, res) => {
419392

420393
} catch (error) {
421394
console.error('Get dashboard stats error:', error);
422-
res.status(500).json({
423-
success: false,
424-
message: 'Error fetching dashboard stats',
425-
error: error.message
426-
});
395+
return serverError(res, error, 'Error fetching dashboard stats');
427396
}
428397
};
429398

@@ -468,11 +437,7 @@ export const getAllUsers = async (req, res) => {
468437

469438
} catch (error) {
470439
console.error('Get users error:', error);
471-
res.status(500).json({
472-
success: false,
473-
message: 'Error fetching users',
474-
error: error.message
475-
});
440+
return serverError(res, error, 'Error fetching users');
476441
}
477442
};
478443

@@ -503,11 +468,7 @@ export const toggleUserBan = async (req, res) => {
503468

504469
} catch (error) {
505470
console.error('Toggle user ban error:', error);
506-
res.status(500).json({
507-
success: false,
508-
message: 'Error updating user status',
509-
error: error.message
510-
});
471+
return serverError(res, error, 'Error updating user status');
511472
}
512473
};
513474

@@ -546,11 +507,7 @@ export const resetEmployeePassword = async (req, res) => {
546507

547508
} catch (error) {
548509
console.error('Reset employee password error:', error);
549-
res.status(500).json({
550-
success: false,
551-
message: 'Error resetting password',
552-
error: error.message
553-
});
510+
return serverError(res, error, 'Error resetting password');
554511
}
555512
};
556513

@@ -574,10 +531,6 @@ export const getAdminProfile = async (req, res) => {
574531

575532
} catch (error) {
576533
console.error('Get admin profile error:', error);
577-
res.status(500).json({
578-
success: false,
579-
message: 'Error fetching profile',
580-
error: error.message
581-
});
534+
return serverError(res, error, 'Error fetching profile');
582535
}
583536
};

server/controllers/aiAnalysis.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { OpenRouter } from '@openrouter/sdk';
22
import Problem from '../models/problem.js';
3+
import { serverError } from '../libs/apiError.js';
34

45
// ── OpenRouter config ────────────────────────────────────────────────────────
56
const COOLDOWN_MS = 10 * 60 * 1000;

server/controllers/aiChat.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { OpenRouter } from '@openrouter/sdk';
2+
import { serverError } from '../libs/apiError.js';
23

34
// ── OpenRouter config ────────────────────────────────────────────────────────
45
const COOLDOWN_MS = 10 * 60 * 1000;

server/controllers/aiDebug.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { OpenRouter } from '@openrouter/sdk';
22
import Problem from '../models/problem.js';
3+
import { serverError } from '../libs/apiError.js';
34

45
// ── OpenRouter config ────────────────────────────────────────────────────────
56
const COOLDOWN_MS = 10 * 60 * 1000;

server/controllers/aiHint.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { OpenRouter } from '@openrouter/sdk';
22
import Problem from '../models/problem.js';
3+
import { serverError } from '../libs/apiError.js';
34

45
// ── OpenRouter config ────────────────────────────────────────────────────────
56
const COOLDOWN_MS = 10 * 60 * 1000;

server/controllers/aiToken.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import AiToken from '../models/AiToken.js';
2+
import { serverError } from '../libs/apiError.js';
23

34
// ── Config ───────────────────────────────────────────────────────────────────
45
const CHAT_TOKEN_COST = 2; // 2 tokens per chat message

0 commit comments

Comments
 (0)