Maintenance mode activates after current draw completes
- When admin enables maintenance, it's set to 'pending' state - Maintenance activates automatically after the current draw completes - Admin can use immediate=true to force immediate activation - Frontend shows 'Maintenance Scheduled' banner when pending - Telegram bot warns users but still allows purchases when pending - Both mode and pending status tracked in system_settings table
This commit is contained in:
@@ -189,3 +189,122 @@ export async function retryPayout(req: Request, res: Response) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* GET /admin/maintenance
|
||||
* Get current maintenance mode status
|
||||
*/
|
||||
export async function getMaintenanceStatus(req: Request, res: Response) {
|
||||
try {
|
||||
const result = await db.query(
|
||||
`SELECT value FROM system_settings WHERE key = 'maintenance_mode'`
|
||||
);
|
||||
const pendingResult = await db.query(
|
||||
`SELECT value FROM system_settings WHERE key = 'maintenance_pending'`
|
||||
);
|
||||
const messageResult = await db.query(
|
||||
`SELECT value FROM system_settings WHERE key = 'maintenance_message'`
|
||||
);
|
||||
|
||||
const enabled = result.rows[0]?.value === 'true';
|
||||
const pending = pendingResult.rows[0]?.value === 'true';
|
||||
const message = messageResult.rows[0]?.value || 'System is under maintenance. Please try again later.';
|
||||
|
||||
return res.json({
|
||||
version: '1.0',
|
||||
data: {
|
||||
maintenance_mode: enabled,
|
||||
maintenance_pending: pending,
|
||||
message: message,
|
||||
},
|
||||
});
|
||||
} catch (error: any) {
|
||||
console.error('Get maintenance status error:', error);
|
||||
return res.status(500).json({
|
||||
version: '1.0',
|
||||
error: 'INTERNAL_ERROR',
|
||||
message: 'Failed to get maintenance status',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* POST /admin/maintenance
|
||||
* Enable or disable maintenance mode
|
||||
* When enabling, maintenance is set to "pending" and activates after current draw completes
|
||||
*/
|
||||
export async function setMaintenanceMode(req: Request, res: Response) {
|
||||
try {
|
||||
const { enabled, message, immediate } = req.body;
|
||||
|
||||
if (typeof enabled !== 'boolean') {
|
||||
return res.status(400).json({
|
||||
version: '1.0',
|
||||
error: 'INVALID_INPUT',
|
||||
message: 'enabled must be a boolean',
|
||||
});
|
||||
}
|
||||
|
||||
if (enabled) {
|
||||
if (immediate === true) {
|
||||
// Immediate activation (admin override)
|
||||
await db.query(
|
||||
`INSERT INTO system_settings (key, value, updated_at) VALUES ('maintenance_mode', 'true', datetime('now'))
|
||||
ON CONFLICT(key) DO UPDATE SET value = 'true', updated_at = datetime('now')`
|
||||
);
|
||||
await db.query(
|
||||
`INSERT INTO system_settings (key, value, updated_at) VALUES ('maintenance_pending', 'false', datetime('now'))
|
||||
ON CONFLICT(key) DO UPDATE SET value = 'false', updated_at = datetime('now')`
|
||||
);
|
||||
console.log('Maintenance mode ENABLED IMMEDIATELY');
|
||||
} else {
|
||||
// Set pending - will activate after current draw completes
|
||||
await db.query(
|
||||
`INSERT INTO system_settings (key, value, updated_at) VALUES ('maintenance_pending', 'true', datetime('now'))
|
||||
ON CONFLICT(key) DO UPDATE SET value = 'true', updated_at = datetime('now')`
|
||||
);
|
||||
console.log('Maintenance mode PENDING (will activate after current draw)');
|
||||
}
|
||||
} else {
|
||||
// Disable both active and pending maintenance
|
||||
await db.query(
|
||||
`INSERT INTO system_settings (key, value, updated_at) VALUES ('maintenance_mode', 'false', datetime('now'))
|
||||
ON CONFLICT(key) DO UPDATE SET value = 'false', updated_at = datetime('now')`
|
||||
);
|
||||
await db.query(
|
||||
`INSERT INTO system_settings (key, value, updated_at) VALUES ('maintenance_pending', 'false', datetime('now'))
|
||||
ON CONFLICT(key) DO UPDATE SET value = 'false', updated_at = datetime('now')`
|
||||
);
|
||||
console.log('Maintenance mode DISABLED');
|
||||
}
|
||||
|
||||
// Update message if provided
|
||||
if (message && typeof message === 'string') {
|
||||
await db.query(
|
||||
`INSERT INTO system_settings (key, value, updated_at) VALUES ('maintenance_message', $1, datetime('now'))
|
||||
ON CONFLICT(key) DO UPDATE SET value = $1, updated_at = datetime('now')`,
|
||||
[message]
|
||||
);
|
||||
}
|
||||
|
||||
// Get current state
|
||||
const modeResult = await db.query(`SELECT value FROM system_settings WHERE key = 'maintenance_mode'`);
|
||||
const pendingResult = await db.query(`SELECT value FROM system_settings WHERE key = 'maintenance_pending'`);
|
||||
|
||||
return res.json({
|
||||
version: '1.0',
|
||||
data: {
|
||||
maintenance_mode: modeResult.rows[0]?.value === 'true',
|
||||
maintenance_pending: pendingResult.rows[0]?.value === 'true',
|
||||
message: message || 'System is under maintenance. Please try again later.',
|
||||
},
|
||||
});
|
||||
} catch (error: any) {
|
||||
console.error('Set maintenance mode error:', error);
|
||||
return res.status(500).json({
|
||||
version: '1.0',
|
||||
error: 'INTERNAL_ERROR',
|
||||
message: 'Failed to set maintenance mode',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user