first commit

This commit is contained in:
mstfyldz
2026-05-30 18:23:21 +03:00
commit e927cd6af3
57 changed files with 12945 additions and 0 deletions
+352
View File
@@ -0,0 +1,352 @@
"use server";
import { prisma } from "@/lib/prisma";
import { revalidatePath } from "next/cache";
import { verifyPassword, signToken, verifyToken } from "@/lib/auth";
import { cookies } from "next/headers";
// ── PROJECTS ACTIONS ──
export async function getProjects() {
try {
return await prisma.project.findMany({
orderBy: { num: "asc" },
});
} catch (error) {
console.error("Error fetching projects:", error);
return [];
}
}
export async function saveProject(data: any) {
try {
const { id, num, slug, title, tag, desc, spec, year, client, duration, tech, challenge, solution, results, image, gallery, website } = data;
let project;
if (id) {
// Update
project = await prisma.project.update({
where: { id: Number(id) },
data: {
num,
slug,
title,
tag,
desc,
spec,
year,
client,
duration,
tech,
challenge,
solution,
results,
image: image || "",
gallery: gallery || [],
website: website || "",
},
});
} else {
// Create
// Ensure slug is unique
const existing = await prisma.project.findFirst({ where: { slug } });
if (existing) {
throw new Error("A project with this slug already exists.");
}
project = await prisma.project.create({
data: {
num,
slug,
title,
tag,
desc,
spec,
year,
client,
duration,
tech,
challenge,
solution,
results,
image: image || "",
gallery: gallery || [],
website: website || "",
},
});
}
revalidatePath("/[lang]/work", "layout");
revalidatePath("/[lang]/admin", "page");
return { success: true, project };
} catch (error: any) {
console.error("Error saving project:", error);
return { success: false, error: error.message };
}
}
export async function deleteProject(id: number) {
try {
await prisma.project.delete({
where: { id },
});
revalidatePath("/[lang]/work", "layout");
revalidatePath("/[lang]/admin", "page");
return { success: true };
} catch (error: any) {
console.error("Error deleting project:", error);
return { success: false, error: error.message };
}
}
// ── BLOG POSTS ACTIONS ──
export async function getBlogPosts() {
try {
const posts = await prisma.blogPost.findMany({
orderBy: { date: "desc" },
});
return posts;
} catch (error) {
console.error("Error fetching blog posts:", error);
return [];
}
}
export async function saveBlogPost(data: any) {
try {
const {
id,
slug,
date,
author,
authorRole,
image,
trTitle,
trExcerpt,
trReadingTime,
trCategory,
trTags,
trContent,
enTitle,
enExcerpt,
enReadingTime,
enCategory,
enTags,
enContent,
} = data;
let post;
if (id) {
// Update
post = await prisma.blogPost.update({
where: { id: Number(id) },
data: {
slug,
date,
author,
authorRole,
image,
trTitle,
trExcerpt,
trReadingTime,
trCategory,
trTags,
trContent,
enTitle,
enExcerpt,
enReadingTime,
enCategory,
enTags,
enContent,
},
});
} else {
// Create
const existing = await prisma.blogPost.findFirst({ where: { slug } });
if (existing) {
throw new Error("A blog post with this slug already exists.");
}
post = await prisma.blogPost.create({
data: {
slug,
date,
author,
authorRole,
image,
trTitle,
trExcerpt,
trReadingTime,
trCategory,
trTags,
trContent,
enTitle,
enExcerpt,
enReadingTime,
enCategory,
enTags,
enContent,
},
});
}
revalidatePath("/[lang]/blog", "layout");
revalidatePath("/[lang]/admin", "page");
return { success: true, post };
} catch (error: any) {
console.error("Error saving blog post:", error);
return { success: false, error: error.message };
}
}
export async function deleteBlogPost(id: number) {
try {
await prisma.blogPost.delete({
where: { id },
});
revalidatePath("/[lang]/blog", "layout");
revalidatePath("/[lang]/admin", "page");
return { success: true };
} catch (error: any) {
console.error("Error deleting blog post:", error);
return { success: false, error: error.message };
}
}
// ── PARTNERS ACTIONS ──
export async function getPartners() {
try {
return await prisma.partner.findMany({
orderBy: { id: "asc" },
});
} catch (error) {
console.error("Error fetching partners:", error);
return [];
}
}
export async function savePartner(data: any) {
try {
const { id, name, tag, mono, year, desc } = data;
let partner;
if (id) {
// Update
partner = await prisma.partner.update({
where: { id: Number(id) },
data: {
name,
tag,
mono,
year,
desc,
},
});
} else {
// Create
// Ensure name is unique
const existing = await prisma.partner.findFirst({ where: { name } });
if (existing) {
throw new Error("Bu isimde bir partner zaten mevcut.");
}
partner = await prisma.partner.create({
data: {
name,
tag,
mono,
year,
desc,
},
});
}
revalidatePath("/[lang]/partners", "layout");
revalidatePath("/[lang]/admin", "page");
return { success: true, partner };
} catch (error: any) {
console.error("Error saving partner:", error);
return { success: false, error: error.message };
}
}
export async function deletePartner(id: number) {
try {
await prisma.partner.delete({
where: { id },
});
revalidatePath("/[lang]/partners", "layout");
revalidatePath("/[lang]/admin", "page");
return { success: true };
} catch (error: any) {
console.error("Error deleting partner:", error);
return { success: false, error: error.message };
}
}
// ── AUTHENTICATION ACTIONS ──
const COOKIE_NAME = "ayris_session";
export async function getAdminSession() {
try {
const cookieStore = await cookies();
const token = cookieStore.get(COOKIE_NAME)?.value;
if (!token) return null;
return verifyToken(token);
} catch (error) {
console.error("Error reading admin session:", error);
return null;
}
}
export async function adminLoginAction(data: any) {
try {
const { username, password } = data;
if (!username || !password) {
return { success: false, error: "Kullanıcı adı ve şifre zorunludur!" };
}
const user = await prisma.user.findUnique({
where: { username },
});
if (!user) {
return { success: false, error: "Geçersiz kullanıcı adı veya şifre!" };
}
const isValid = verifyPassword(password, user.password);
if (!isValid) {
return { success: false, error: "Geçersiz kullanıcı adı veya şifre!" };
}
const token = signToken({ userId: user.id, username: user.username });
const cookieStore = await cookies();
cookieStore.set(COOKIE_NAME, token, {
httpOnly: true,
secure: process.env.NODE_ENV === "production",
sameSite: "strict",
maxAge: 24 * 60 * 60, // 24 hours
path: "/",
});
return { success: true };
} catch (error: any) {
console.error("Login action error:", error);
return { success: false, error: "Giriş yapılırken beklenmedik bir hata oluştu!" };
}
}
export async function adminLogoutAction() {
try {
const cookieStore = await cookies();
cookieStore.delete(COOKIE_NAME);
return { success: true };
} catch (error: any) {
console.error("Logout action error:", error);
return { success: false, error: "Çıkış yapılırken bir hata oluştu!" };
}
}