码桶

发现社区成员的开源项目

main
app-settings.js1.8 KB
// App-level settings management (admin only, enforced by middleware)
// Stored in KV as APP_SETTINGS JSON

const DEFAULT_SETTINGS = {
    openRegistration: false,
    webhookUrl: ''
};

// GET: Retrieve app settings
export async function onRequestGet(context) {
    const { env } = context;
    const kv = env.CF_DNS_KV;

    if (!kv) {
        return new Response(JSON.stringify({ error: 'KV storage not configured.' }), {
            status: 500,
            headers: { 'Content-Type': 'application/json' }
        });
    }

    const raw = await kv.get('APP_SETTINGS');
    const settings = raw ? { ...DEFAULT_SETTINGS, ...JSON.parse(raw) } : { ...DEFAULT_SETTINGS };

    return new Response(JSON.stringify({ settings }), {
        headers: { 'Content-Type': 'application/json' }
    });
}

// PUT: Update app settings
export async function onRequestPut(context) {
    const { env } = context;
    const kv = env.CF_DNS_KV;

    if (!kv) {
        return new Response(JSON.stringify({ error: 'KV storage not configured.' }), {
            status: 500,
            headers: { 'Content-Type': 'application/json' }
        });
    }

    const body = await context.request.json();

    const raw = await kv.get('APP_SETTINGS');
    const settings = raw ? { ...DEFAULT_SETTINGS, ...JSON.parse(raw) } : { ...DEFAULT_SETTINGS };

    // Only allow known keys
    if (body.openRegistration !== undefined) {
        settings.openRegistration = !!body.openRegistration;
    }

    if (body.webhookUrl !== undefined) {
        settings.webhookUrl = typeof body.webhookUrl === 'string' ? body.webhookUrl.trim() : '';
    }

    await kv.put('APP_SETTINGS', JSON.stringify(settings));

    return new Response(JSON.stringify({ success: true, settings }), {
        headers: { 'Content-Type': 'application/json' }
    });
}