feat: cli

This commit is contained in:
Acbox
2026-01-11 02:08:55 +08:00
parent 9445680bb8
commit 0f28176fd4
23 changed files with 3032 additions and 24 deletions
+35 -4
View File
@@ -11,20 +11,51 @@ export const validateUser = async (username: string, password: string) => {
const rootUser = process.env.ROOT_USER
const rootPassword = process.env.ROOT_USER_PASSWORD
let userId: string | null = null
if (rootUser && rootPassword && username === rootUser) {
if (password === rootPassword) {
// 检查 root 用户是否存在于数据库中
const [existingUser] = await db
.select()
.from(users)
.where(eq(users.username, rootUser))
userId = existingUser?.id
if (!existingUser) {
// 为 root 用户创建数据库记录
// 使用占位符密码哈希,因为实际密码在环境变量中
const [newUser] = await db
.insert(users)
.values({
username: rootUser,
passwordHash: 'ENV_BASED_AUTH', // 占位符,实际使用环境变量验证
role: 'admin',
displayName: 'Root User',
email: null,
avatarUrl: null,
isActive: true,
})
.onConflictDoNothing() // 避免并发创建导致的冲突
.returning({
id: users.id,
})
userId = newUser.id
}
// 检查 root 用户的 settings 是否存在,不存在则创建
const [existingSettings] = await db
.select()
.from(settings)
.where(eq(settings.userId, 'root'))
.where(eq(settings.userId, userId))
if (!existingSettings) {
// 为 root 用户创建默认 settings
await db
.insert(settings)
.values({
userId: 'root',
userId: userId,
defaultChatModel: null,
defaultEmbeddingModel: null,
defaultSummaryModel: null,
@@ -36,7 +67,7 @@ export const validateUser = async (username: string, password: string) => {
// 返回 ROOT 用户信息
return {
id: 'root',
id: userId,
username: rootUser,
role: 'admin' as const,
displayName: 'Root User',
@@ -49,7 +80,7 @@ export const validateUser = async (username: string, password: string) => {
const [user] = await db
.select()
.from(users)
.where(eq(users.username, username))
.where(eq(users.id, userId!))
if (!user) {
return null
@@ -94,6 +94,7 @@ export const createSchedule = async (
userId: string,
data: CreateScheduleInput
) => {
const { scheduleTask } = createScheduler()
const [newSchedule] = await db
.insert(schedule)
.values({
@@ -106,6 +107,15 @@ export const createSchedule = async (
active: true,
})
.returning()
scheduleTask(userId, {
id: newSchedule.id!,
pattern: newSchedule.pattern,
name: newSchedule.name,
description: newSchedule.description,
command: newSchedule.command,
maxCalls: newSchedule.maxCalls || undefined,
})
return newSchedule
}