Skip to content

Commit 142c780

Browse files
committed
Fix TypeScript errors: Update User type system across all storage implementations
1 parent d83e2c6 commit 142c780

File tree

9 files changed

+574
-22
lines changed

9 files changed

+574
-22
lines changed

public/sw.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/app/api/admin/users/route.ts

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
/* eslint-disable no-console, @typescript-eslint/no-explicit-any */
2+
import { NextRequest, NextResponse } from 'next/server';
3+
4+
import { getStorage } from '@/lib/db';
5+
import { User } from '@/lib/types';
6+
7+
export const runtime = 'edge';
8+
9+
// 检查是否为站长账户
10+
function isOwnerAccount(username: string): boolean {
11+
const ownerUsername = process.env.USERNAME || 'admin';
12+
return username === ownerUsername;
13+
}
14+
15+
export async function GET(request: NextRequest) {
16+
try {
17+
// 从Authorization头获取当前用户
18+
const auth = request.headers.get('Authorization')?.replace('Bearer ', '');
19+
if (!auth) {
20+
return NextResponse.json({ error: '需要认证' }, { status: 401 });
21+
}
22+
23+
const currentUsername = decodeURIComponent(auth);
24+
25+
// 检查是否为站长账户
26+
if (!isOwnerAccount(currentUsername)) {
27+
return NextResponse.json({ error: '权限不足' }, { status: 403 });
28+
}
29+
30+
// 获取所有用户及其设置
31+
const storage = getStorage();
32+
const users: User[] = await storage.getAllUsers();
33+
const usersWithSettings = await Promise.all(
34+
users.map(async (user) => {
35+
const settings = await storage.getUserSettings(user.username);
36+
return {
37+
username: user.username,
38+
role: user.role || 'user',
39+
created_at: user.created_at,
40+
filter_adult_content: settings?.filter_adult_content ?? true,
41+
can_disable_filter: settings?.can_disable_filter ?? true,
42+
managed_by_admin: settings?.managed_by_admin ?? false,
43+
last_filter_change: settings?.last_filter_change
44+
};
45+
})
46+
);
47+
48+
return NextResponse.json({
49+
users: usersWithSettings,
50+
total: usersWithSettings.length
51+
});
52+
53+
} catch (error) {
54+
console.error('获取用户列表失败:', error);
55+
return NextResponse.json({ error: '获取用户列表失败' }, { status: 500 });
56+
}
57+
}
58+
59+
export async function POST(request: NextRequest) {
60+
try {
61+
// 从Authorization头获取当前用户
62+
const auth = request.headers.get('Authorization')?.replace('Bearer ', '');
63+
if (!auth) {
64+
return NextResponse.json({ error: '需要认证' }, { status: 401 });
65+
}
66+
67+
const currentUsername = decodeURIComponent(auth);
68+
69+
// 检查是否为站长账户
70+
if (!isOwnerAccount(currentUsername)) {
71+
return NextResponse.json({ error: '权限不足' }, { status: 403 });
72+
}
73+
74+
const storage = getStorage();
75+
const { action, username, settings } = await request.json();
76+
77+
switch (action) {
78+
case 'update_settings': {
79+
// 更新用户设置
80+
const currentSettings = await storage.getUserSettings(username);
81+
const newSettings = {
82+
...currentSettings,
83+
...settings,
84+
last_filter_change: new Date().toISOString()
85+
};
86+
87+
await storage.setUserSettings(username, newSettings);
88+
89+
return NextResponse.json({
90+
success: true,
91+
message: `已更新用户 ${username} 的设置`
92+
});
93+
}
94+
95+
case 'force_filter': {
96+
// 强制开启某用户的成人内容过滤
97+
const currentSettings = await storage.getUserSettings(username) || {
98+
filter_adult_content: true,
99+
theme: 'auto' as const,
100+
language: 'zh-CN',
101+
auto_play: false,
102+
video_quality: 'auto'
103+
};
104+
105+
await storage.setUserSettings(username, {
106+
...currentSettings,
107+
filter_adult_content: true,
108+
can_disable_filter: false,
109+
managed_by_admin: true,
110+
last_filter_change: new Date().toISOString()
111+
});
112+
113+
return NextResponse.json({
114+
success: true,
115+
message: `已强制开启用户 ${username} 的成人内容过滤`
116+
});
117+
}
118+
119+
case 'allow_disable': {
120+
// 允许用户自己管理过滤设置
121+
const existingSettings = await storage.getUserSettings(username) || {
122+
filter_adult_content: true,
123+
theme: 'auto' as const,
124+
language: 'zh-CN',
125+
auto_play: false,
126+
video_quality: 'auto'
127+
};
128+
129+
await storage.setUserSettings(username, {
130+
...existingSettings,
131+
filter_adult_content: existingSettings.filter_adult_content ?? true,
132+
theme: existingSettings.theme || 'auto',
133+
language: existingSettings.language || 'zh-CN',
134+
auto_play: existingSettings.auto_play ?? false,
135+
video_quality: existingSettings.video_quality || 'auto',
136+
can_disable_filter: true,
137+
managed_by_admin: false,
138+
last_filter_change: new Date().toISOString()
139+
});
140+
141+
return NextResponse.json({
142+
success: true,
143+
message: `已允许用户 ${username} 自己管理过滤设置`
144+
});
145+
}
146+
147+
default:
148+
return NextResponse.json({ error: '未知操作' }, { status: 400 });
149+
}
150+
151+
} catch (error) {
152+
console.error('用户管理操作失败:', error);
153+
return NextResponse.json({ error: '操作失败' }, { status: 500 });
154+
}
155+
}

0 commit comments

Comments
 (0)