72 lines
2.4 KiB
TypeScript
72 lines
2.4 KiB
TypeScript
'use server'
|
||
|
||
import prisma from '@/lib/prisma'
|
||
import bcrypt from 'bcryptjs'
|
||
import { revalidatePath } from 'next/cache'
|
||
|
||
export async function createUser(_prevState: unknown, formData: FormData) {
|
||
const username = (formData.get('username') as string)?.trim()
|
||
const password = formData.get('password') as string
|
||
const role = (formData.get('role') as string) || 'admin'
|
||
|
||
if (!username || !password) {
|
||
return { error: 'Kullanıcı adı ve şifre zorunludur.' }
|
||
}
|
||
if (password.length < 6) {
|
||
return { error: 'Şifre en az 6 karakter olmalıdır.' }
|
||
}
|
||
|
||
try {
|
||
const existing = await prisma.users.findUnique({ where: { username } })
|
||
if (existing) {
|
||
return { error: 'Bu kullanıcı adı zaten kullanılıyor.' }
|
||
}
|
||
|
||
const password_hash = await bcrypt.hash(password, 12)
|
||
await prisma.users.create({ data: { username, password_hash, role } })
|
||
revalidatePath('/admin/users')
|
||
return { success: true }
|
||
} catch (error) {
|
||
console.error('Create user error:', error)
|
||
return { error: 'Kullanıcı oluşturulurken hata oluştu.' }
|
||
}
|
||
}
|
||
|
||
export async function changePassword(userId: number, _prevState: unknown, formData: FormData) {
|
||
const newPassword = formData.get('new_password') as string
|
||
const confirmPassword = formData.get('confirm_password') as string
|
||
|
||
if (!newPassword || newPassword.length < 6) {
|
||
return { error: 'Şifre en az 6 karakter olmalıdır.' }
|
||
}
|
||
if (newPassword !== confirmPassword) {
|
||
return { error: 'Şifreler eşleşmiyor.' }
|
||
}
|
||
|
||
try {
|
||
const password_hash = await bcrypt.hash(newPassword, 12)
|
||
await prisma.users.update({ where: { id: userId }, data: { password_hash } })
|
||
revalidatePath('/admin/users')
|
||
return { success: true, message: 'Şifre güncellendi.' }
|
||
} catch (error) {
|
||
console.error('Change password error:', error)
|
||
return { error: 'Şifre güncellenirken hata oluştu.' }
|
||
}
|
||
}
|
||
|
||
export async function deleteUser(userId: number) {
|
||
try {
|
||
// Count total users — don't allow deleting the last admin
|
||
const count = await prisma.users.count()
|
||
if (count <= 1) {
|
||
return { error: 'Son yönetici kullanıcı silinemez.' }
|
||
}
|
||
await prisma.users.delete({ where: { id: userId } })
|
||
revalidatePath('/admin/users')
|
||
return { success: true }
|
||
} catch (error) {
|
||
console.error('Delete user error:', error)
|
||
return { error: 'Kullanıcı silinirken hata oluştu.' }
|
||
}
|
||
}
|