117 lines
3.1 KiB
TypeScript
Raw Normal View History

import { NextApiRequest, NextApiResponse } from 'next'
import { auth, db } from '../../../lib/supabase'
import { handleApiError, validateEmail, validatePassword } from '../../../lib/api-utils'
interface RegisterRequest {
email: string
password: string
name: string
phone?: string
user_type: 'individual' | 'enterprise'
enterprise_id?: string
}
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
) {
if (req.method !== 'POST') {
return res.status(405).json({ success: false, error: '方法不允许' })
}
try {
const { email, password, name, phone, user_type, enterprise_id }: RegisterRequest = req.body
// 验证必填字段
if (!email || !password || !name || !user_type) {
return res.status(400).json({
success: false,
error: '缺少必填字段',
details: '邮箱、密码、姓名和用户类型为必填项'
})
}
// 验证邮箱格式
if (!validateEmail(email)) {
return res.status(400).json({
success: false,
error: '邮箱格式不正确'
})
}
// 验证密码强度
const passwordValidation = validatePassword(password)
if (!passwordValidation.valid) {
return res.status(400).json({
success: false,
error: passwordValidation.message
})
}
// 检查邮箱是否已注册
try {
const existingUsers = await db.select('users', '*')
const existingUser = existingUsers.find((user: any) => user.email === email)
if (existingUser) {
return res.status(400).json({
success: false,
error: '该邮箱已被注册'
})
}
} catch (error) {
console.error('Check existing user error:', error)
// 继续注册流程让Supabase处理重复邮箱的情况
}
// 注册用户
const authData = await auth.signUp(email, password, {
name,
phone,
user_type,
enterprise_id
})
if (!authData?.user) {
return res.status(400).json({
success: false,
error: '注册失败,请稍后重试'
})
}
// 创建用户记录
try {
const userData = {
id: authData.user.id,
email,
name,
phone: phone || null,
user_type,
enterprise_id: enterprise_id || null,
status: 'active',
created_at: new Date().toISOString(),
updated_at: new Date().toISOString()
}
const userRecord = await db.insert('users', userData)
return res.status(201).json({
success: true,
message: '注册成功',
data: {
user: userRecord,
needEmailVerification: !authData.session // 如果没有session说明需要邮箱验证
}
})
} catch (dbError) {
console.error('Create user record error:', dbError)
return res.status(500).json({
success: false,
error: '用户注册成功,但创建用户记录失败',
details: process.env.NODE_ENV === 'development' ? (dbError as Error).message : undefined
})
}
} catch (error) {
return handleApiError(res, error, 'Register')
}
}