115 lines
3.0 KiB
TypeScript
115 lines
3.0 KiB
TypeScript
"use server";
|
||
|
||
import prisma from "@/lib/prisma";
|
||
import bcrypt from "bcryptjs";
|
||
import { revalidatePath } from "next/cache";
|
||
|
||
export type UserActionState = {
|
||
success?: boolean;
|
||
message?: string;
|
||
} | null;
|
||
|
||
export async function getUsers() {
|
||
return await prisma.user.findMany({
|
||
select: {
|
||
id: true,
|
||
username: true,
|
||
createdAt: true,
|
||
updatedAt: true,
|
||
},
|
||
orderBy: {
|
||
createdAt: 'desc'
|
||
}
|
||
});
|
||
}
|
||
|
||
export async function createUser(prevState: UserActionState, formData: FormData): Promise<UserActionState> {
|
||
const username = formData.get("username") as string;
|
||
const password = formData.get("password") as string;
|
||
|
||
if (!username || !password) {
|
||
return { success: false, message: "Kullanıcı adı ve şifre gereklidir." };
|
||
}
|
||
|
||
try {
|
||
const existingUser = await prisma.user.findUnique({
|
||
where: { username }
|
||
});
|
||
|
||
if (existingUser) {
|
||
return { success: false, message: "Bu kullanıcı adı zaten kullanılıyor." };
|
||
}
|
||
|
||
const hashedPassword = await bcrypt.hash(password, 10);
|
||
|
||
await prisma.user.create({
|
||
data: {
|
||
username,
|
||
password: hashedPassword,
|
||
}
|
||
});
|
||
|
||
revalidatePath("/admin/users");
|
||
return { success: true, message: "Kullanıcı başarıyla oluşturuldu." };
|
||
} catch (error) {
|
||
return { success: false, message: "Kullanıcı oluşturulurken bir hata oluştu." };
|
||
}
|
||
}
|
||
|
||
export async function updateUser(prevState: UserActionState, formData: FormData): Promise<UserActionState> {
|
||
const idStr = formData.get("id") as string;
|
||
const username = formData.get("username") as string;
|
||
const password = formData.get("password") as string; // Optional during update
|
||
|
||
if (!idStr || !username) {
|
||
return { success: false, message: "Kullanıcı adı gereklidir." };
|
||
}
|
||
|
||
const id = parseInt(idStr, 10);
|
||
|
||
try {
|
||
const existingUser = await prisma.user.findUnique({
|
||
where: { username }
|
||
});
|
||
|
||
if (existingUser && existingUser.id !== id) {
|
||
return { success: false, message: "Bu kullanıcı adı zaten kullanılıyor." };
|
||
}
|
||
|
||
const dataToUpdate: any = { username };
|
||
|
||
if (password) {
|
||
dataToUpdate.password = await bcrypt.hash(password, 10);
|
||
}
|
||
|
||
await prisma.user.update({
|
||
where: { id },
|
||
data: dataToUpdate,
|
||
});
|
||
|
||
revalidatePath("/admin/users");
|
||
return { success: true, message: "Kullanıcı başarıyla güncellendi." };
|
||
} catch (error) {
|
||
return { success: false, message: "Kullanıcı güncellenirken bir hata oluştu." };
|
||
}
|
||
}
|
||
|
||
export async function deleteUser(id: number) {
|
||
try {
|
||
const userCount = await prisma.user.count();
|
||
|
||
if (userCount <= 1) {
|
||
return { success: false, message: "Sistemde en az bir yönetici bulunmalıdır. Bu kullanıcıyı silemezsiniz." };
|
||
}
|
||
|
||
await prisma.user.delete({
|
||
where: { id }
|
||
});
|
||
|
||
revalidatePath("/admin/users");
|
||
return { success: true, message: "Kullanıcı başarıyla silindi." };
|
||
} catch (error) {
|
||
return { success: false, message: "Kullanıcı silinirken bir hata oluştu." };
|
||
}
|
||
}
|