Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
428cfe6
feat(ms2/db-space): createdOn field
FelipeTrost Sep 11, 2025
aaffd02
feat(ms2/file-manager): removeDeletedArtifactsFromDb
FelipeTrost Sep 15, 2025
c990809
feat(ms2/verification-tokens): removeExpiredEmailVerificationTokens
FelipeTrost Sep 15, 2025
973beb4
feat(ms2/spaces): removeInactiveSpaces
FelipeTrost Sep 15, 2025
5831dc1
fix(ms2): await promise
FelipeTrost Sep 15, 2025
90d6361
feat(ms2): route for cleaning up db entries
FelipeTrost Sep 15, 2025
0f99b81
feat(ms2/scheduler): change scheduler tasks rout + internal scheduler
FelipeTrost Sep 23, 2025
c9d8210
feat(ms2/ms-admin): config internal scheduler + restart it on changes
FelipeTrost Sep 23, 2025
fd3f657
feat(ms2/ms-admin): config for scheduler timing
FelipeTrost Sep 23, 2025
7234bb8
fix(ms2/scheduler): correctly keep track of current scheduler
FelipeTrost Sep 23, 2025
9cb0a69
fix(ms2/admin-config-form): show correct cause key for disabled keys
FelipeTrost Sep 24, 2025
ea3a44d
feat(ms2/admin): configure expiration time for email change/verificat…
FelipeTrost Sep 24, 2025
e59a561
refactor(ms2/scheduler): fn name
FelipeTrost Sep 24, 2025
c8520f9
feat(ms2/ms-config): EMAIL_SIGNIN_VERIFICATION_TOKEN_EXPIRATION_HOURS
FelipeTrost Sep 30, 2025
c806ecb
Merge remote-tracking branch 'origin/main' into ms2/scheduler-for-db-…
FelipeTrost Sep 30, 2025
0e82aea
Merge branch 'main' into ms2/scheduler-for-db-cleanup
FelipeTrost Sep 30, 2025
788edc6
refactor(ms2/ms-config): rename scheduling related configs
FelipeTrost Oct 2, 2025
504ad2f
fix(ms2/auth): no top level await
FelipeTrost Oct 2, 2025
98ce022
Merge branch 'ms2/scheduler-for-db-cleanup' of github.com:PROCEED-Lab…
FelipeTrost Oct 2, 2025
aa8b7aa
Merge branch 'main' into ms2/scheduler-for-db-cleanup
FelipeTrost Oct 27, 2025
d867ebd
Merge branch 'main' into ms2/scheduler-for-db-cleanup
FelipeTrost Nov 18, 2025
4901e98
Merge branch 'main' into ms2/scheduler-for-db-cleanup
FelipeTrost Dec 1, 2025
9d37d7e
Merge branch 'main' into ms2/scheduler-for-db-cleanup
OhKai Dec 9, 2025
deb4fb1
Merge branch 'main' into ms2/scheduler-for-db-cleanup
FelipeTrost Dec 10, 2025
9e7b355
Merge remote-tracking branch 'origin/main' into ms2/scheduler-for-db-…
FelipeTrost Dec 12, 2025
dc3a65d
Merge branch 'main' into ms2/scheduler-for-db-cleanup
OhKai Jan 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ export default function MSConfigForm({
// Get context for the setting
const overridden = overwrittenByEnv.includes(configKey);
const envOnly = mSConfigEnvironmentOnlyKeys.includes(configKey as any);
const disabled = pathParts.find((part) => disabledGroups.get(part));
const disabledKey = pathParts.find((part) => disabledGroups.get(part));

// This is needed, for when a key that can disable a group, is part of a group that is
// disabled
Expand All @@ -127,7 +127,7 @@ export default function MSConfigForm({
!envOnly &&
!overridden &&
!parentGroupDisabled &&
(!disabled || disablers.length > 0)
(!disabledKey || disablers.length > 0)
)
return;

Expand All @@ -150,7 +150,7 @@ export default function MSConfigForm({
tooltipMessage = 'This config was overridden by an environment variable';
else if (envOnly)
tooltipMessage = 'This setting can only be changed through environment variables';
else if (disabled) tooltipMessage = `Disabled by ${disabled}`;
else if (disabledKey) tooltipMessage = `Disabled by ${disabledGroups.get(disabledKey)}`;

return {
input: <Tooltip title={tooltipMessage}>{input}</Tooltip>,
Expand Down
56 changes: 47 additions & 9 deletions src/management-system-v2/app/admin/ms-config/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,17 @@ import { getMSConfig, updateMSConfig, writeDefaultMSConfig } from '@/lib/ms-conf
import MSConfigForm from './ms-config-form';
import { userError } from '@/lib/user-error';
import { SettingGroup } from '@/app/(dashboard)/[environmentId]/settings/type-util';
import { ConfigurableMSConfig } from '@/lib/ms-config/config-schema';
import { restartInternalSchedulerWithCurrentConfigs } from '@/lib/scheduler';

async function saveConfig(newConfig: Record<string, string>) {
async function saveConfig(changedValues: Record<keyof ConfigurableMSConfig, string>) {
'use server';
try {
await updateMSConfig(newConfig);
await updateMSConfig(changedValues);

if ('SCHEDULER_INTERNAL_ACTIVE' in changedValues || 'SCHEDULER_INTERVAL' in changedValues) {
await restartInternalSchedulerWithCurrentConfigs();
}
} catch (e) {
return userError('Error saving config');
}
Expand Down Expand Up @@ -289,15 +295,47 @@ async function ConfigPage() {
},
{
type: 'boolean',
name: 'SCHEDULER_JOB_DELETE_INACTIVE_GUESTS',
key: 'SCHEDULER_JOB_DELETE_INACTIVE_GUESTS',
value: msConfig.SCHEDULER_JOB_DELETE_INACTIVE_GUESTS,
name: 'SCHEDULER_INTERNAL_ACTIVE',
key: 'SCHEDULER_INTERNAL_ACTIVE',
value: msConfig.SCHEDULER_INTERNAL_ACTIVE,
},
{
type: 'boolean',
name: 'SCHEDULER_JOB_DELETE_OLD_ARTIFACTS',
key: 'SCHEDULER_JOB_DELETE_OLD_ARTIFACTS',
value: msConfig.SCHEDULER_JOB_DELETE_OLD_ARTIFACTS,
type: 'number',
name: 'SCHEDULER_TASK_DELETE_INACTIVE_GUESTS',
key: 'SCHEDULER_TASK_DELETE_INACTIVE_GUESTS',
value: msConfig.SCHEDULER_TASK_DELETE_INACTIVE_GUESTS,
},
{
type: 'number',
name: 'SCHEDULER_TASK_DELETE_OLD_ARTIFACTS',
key: 'SCHEDULER_TASK_DELETE_OLD_ARTIFACTS',
value: msConfig.SCHEDULER_TASK_DELETE_OLD_ARTIFACTS,
},
{
type: 'number',
name: 'SCHEDULER_TASK_DELETE_INACTIVE_SPACES',
key: 'SCHEDULER_TASK_DELETE_INACTIVE_SPACES',
value: msConfig.SCHEDULER_TASK_DELETE_INACTIVE_SPACES,
},
{
type: 'number',
name: 'SCHEDULING_TASK_EXPIRATION_TIME_EMAIL_REGISTRATION_TOKENS',
key: 'SCHEDULING_TASK_EXPIRATION_TIME_EMAIL_REGISTRATION_TOKENS',
value: msConfig.SCHEDULING_TASK_EXPIRATION_TIME_EMAIL_REGISTRATION_TOKENS,
},
{
type: 'number',
name: 'SCHEDULING_TASK_EXPIRATION_TIME_EMAIL_CHANGE_TOKENS',
key: 'SCHEDULING_TASK_EXPIRATION_TIME_EMAIL_CHANGE_TOKENS',
value: msConfig.SCHEDULING_TASK_EXPIRATION_TIME_EMAIL_CHANGE_TOKENS,
},
{
type: 'number',
name: 'SCHEDULING_TASK_EXPIRATION_TIME_EMAIL_VERIFICATION_TOKENS',
key: 'SCHEDULING_TASK_EXPIRATION_TIME_EMAIL_VERIFICATION_TOKENS',
value: msConfig.SCHEDULING_TASK_EXPIRATION_TIME_EMAIL_VERIFICATION_TOKENS,
// NOTE: eventually remove this description
description: 'This value will only take effect after restarting the system',
},
],
},
Expand Down

This file was deleted.

This file was deleted.

33 changes: 33 additions & 0 deletions src/management-system-v2/app/api/scheduler/tasks/[task]/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { NextRequest, NextResponse } from 'next/server';
import { getMSConfig } from '@/lib/ms-config/ms-config';
import { allSchedulerTasks } from '@/lib/scheduler';

export async function POST(request: NextRequest, { params }: { params: { task: string } }) {
if (params.task !== 'all') {
return new Response('Not implemented', {
status: 501,
});
}

try {
const msConfig = await getMSConfig();

// Extract and validate the Bearer token
const authHeader = request.headers.get('Authorization');
if (!authHeader || !authHeader.startsWith('Bearer ')) {
return NextResponse.json({ error: 'Unauthorized: Missing Bearer token' }, { status: 401 });
}

const token = authHeader.replace('Bearer ', '').trim();
if (token !== msConfig.SCHEDULER_TOKEN) {
return NextResponse.json({ error: 'Unauthorized: Invalid Bearer token' }, { status: 403 });
}

const message = allSchedulerTasks();

return NextResponse.json({ message }, { status: 200 });
} catch (error) {
console.error('Error cleaning up DB:', error);
return NextResponse.json({ error: 'Failed to clean up DB' }, { status: 500 });
}
}
6 changes: 6 additions & 0 deletions src/management-system-v2/instrumentation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
export async function register() {
if (process.env.NEXT_RUNTIME === 'nodejs') {
// Importing env and using it here will ensure that env variables (msconfig) are verified at
// startup
const { env } = await import('./lib/ms-config/env-vars');

const { getMSConfigDBValuesAndEnsureDefaults } = await import('./lib/ms-config/ms-config');
Expand Down Expand Up @@ -53,5 +55,9 @@ export async function register() {
process.exit(1);
}
}

// Start scheduler if necessary
const { restartInternalSchedulerWithCurrentConfigs } = await import('./lib/scheduler');
await restartInternalSchedulerWithCurrentConfigs();
}
}
Loading
Loading