156 lines
4.7 KiB
TypeScript
156 lines
4.7 KiB
TypeScript
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
|
|
import { fail } from '@sveltejs/kit';
|
|
import type { PageServerLoad, Actions } from './$types';
|
|
import { fetchAnalytics } from '$lib/server/cloudflare';
|
|
|
|
export const load: PageServerLoad = async ({ locals, platform }) => {
|
|
const db = platform?.env?.DB;
|
|
const settings: Record<string, string> = {};
|
|
|
|
if (db) {
|
|
try {
|
|
const { results } = await db.prepare('SELECT key, value FROM settings').all();
|
|
results.forEach((row: any) => {
|
|
settings[row.key] = row.value;
|
|
});
|
|
} catch (err: any) {
|
|
console.error('Failed to load settings', err);
|
|
}
|
|
}
|
|
|
|
return {
|
|
user: locals.user,
|
|
platformEnv: db ? 'Cloudflare D1 (Connected)' : 'Local Mock',
|
|
settings,
|
|
analytics: fetchAnalytics(platform) // Streaming promise
|
|
};
|
|
};
|
|
|
|
export const actions: Actions = {
|
|
updateSiteInfo: async ({ request, platform }) => {
|
|
const db = platform?.env?.DB;
|
|
if (!db) return fail(500, { error: '数据库未连接' });
|
|
|
|
const data = await request.formData();
|
|
const updates = [
|
|
{ key: 'site.title', value: data.get('site_title')?.toString() || 'BlogFlare' },
|
|
{
|
|
key: 'site.description',
|
|
value:
|
|
data.get('site_description')?.toString() ||
|
|
'A high-performance blog powered by Cloudflare D1, R2, and KV.'
|
|
},
|
|
{
|
|
key: 'r2.public_domain',
|
|
value: (
|
|
data.get('r2_public_domain')?.toString() || 'https://assets.yourdomain.com'
|
|
).replace(/\/+$/, '')
|
|
},
|
|
{
|
|
key: 'site.launch_date',
|
|
value: data.get('site_launch_date')?.toString() || ''
|
|
}
|
|
];
|
|
|
|
try {
|
|
for (const { key, value } of updates) {
|
|
await db
|
|
.prepare(
|
|
`INSERT INTO settings (key, value, updated_at)
|
|
VALUES (?, ?, CURRENT_TIMESTAMP)
|
|
ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = CURRENT_TIMESTAMP`
|
|
)
|
|
.bind(key, value)
|
|
.run();
|
|
}
|
|
return { success: true };
|
|
} catch (err: any) {
|
|
console.error('Failed to update site info', err);
|
|
return fail(500, { error: '保存站点信息失败' });
|
|
}
|
|
},
|
|
updateApiToken: async ({ request, platform }) => {
|
|
const db = platform?.env?.DB;
|
|
if (!db) return fail(500, { error: '数据库未连接' });
|
|
|
|
const data = await request.formData();
|
|
const token = data.get('agent_api_token')?.toString() || '';
|
|
|
|
try {
|
|
await db
|
|
.prepare(
|
|
`INSERT INTO settings (key, value, updated_at)
|
|
VALUES (?, ?, CURRENT_TIMESTAMP)
|
|
ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = CURRENT_TIMESTAMP`
|
|
)
|
|
.bind('agent.api_token', token)
|
|
.run();
|
|
return { success: true };
|
|
} catch (err: unknown) {
|
|
console.error('Failed to update api token', err);
|
|
return fail(500, { error: '保存 API Token 失败' });
|
|
}
|
|
},
|
|
updateAliases: async ({ request, platform }) => {
|
|
const db = platform?.env?.DB;
|
|
if (!db) return fail(500, { error: '数据库未连接' });
|
|
|
|
const data = await request.formData();
|
|
const updates = [
|
|
{ key: 'alias.post', value: data.get('alias_post')?.toString() || '文章' },
|
|
{ key: 'alias.page', value: data.get('alias_page')?.toString() || '页面' },
|
|
{ key: 'alias.category', value: data.get('alias_category')?.toString() || '分类' },
|
|
{ key: 'alias.tag', value: data.get('alias_tag')?.toString() || '标签' },
|
|
{ key: 'alias.series', value: data.get('alias_series')?.toString() || '系列' }
|
|
];
|
|
|
|
try {
|
|
for (const { key, value } of updates) {
|
|
await db
|
|
.prepare(
|
|
`INSERT INTO settings (key, value, updated_at)
|
|
VALUES (?, ?, CURRENT_TIMESTAMP)
|
|
ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = CURRENT_TIMESTAMP`
|
|
)
|
|
.bind(key, value)
|
|
.run();
|
|
}
|
|
return { success: true };
|
|
} catch (err: any) {
|
|
console.error('Failed to update aliases', err);
|
|
return fail(500, { error: '保存失败' });
|
|
}
|
|
},
|
|
updateAppearance: async ({ request, platform }) => {
|
|
const db = platform?.env?.DB;
|
|
if (!db) return fail(500, { error: '数据库未连接' });
|
|
|
|
const data = await request.formData();
|
|
const avatarEnabled = data.get('site_avatar_enabled')?.toString() === 'true' ? 'true' : 'false';
|
|
const avatarUrl = data.get('site_avatar_url')?.toString() || '';
|
|
|
|
const updates = [
|
|
{ key: 'site.avatar_enabled', value: avatarEnabled },
|
|
{ key: 'site.avatar_url', value: avatarUrl }
|
|
];
|
|
|
|
try {
|
|
for (const { key, value } of updates) {
|
|
await db
|
|
.prepare(
|
|
`INSERT INTO settings (key, value, updated_at)
|
|
VALUES (?, ?, CURRENT_TIMESTAMP)
|
|
ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = CURRENT_TIMESTAMP`
|
|
)
|
|
.bind(key, value)
|
|
.run();
|
|
}
|
|
return { success: true };
|
|
} catch (err: any) {
|
|
console.error('Failed to update appearance', err);
|
|
return fail(500, { error: '保存外观偏好失败' });
|
|
}
|
|
}
|
|
};
|