117 lines
3.1 KiB
TypeScript
117 lines
3.1 KiB
TypeScript
|
|
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')
|
|||
|
|
}
|
|||
|
|
}
|