Files
mugladijitalmedya/app/admin/actions.ts

261 lines
9.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use server';
import sql from '@/lib/db';
import { cookies } from 'next/headers';
import { redirect } from 'next/navigation';
export async function login(prevState: any, formData: FormData) {
const password = formData.get('password') as string;
if (password === process.env.ADMIN_PASSWORD) {
const cookieStore = await cookies();
cookieStore.set('admin_session', 'authenticated', {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
maxAge: 60 * 60 * 24 * 7, // 1 week
path: '/',
});
redirect('/admin');
}
return { error: 'Hatalı şifre' };
}
export async function logout() {
const cookieStore = await cookies();
cookieStore.delete('admin_session');
redirect('/admin/login');
}
export async function getDashboardStats() {
try {
const [leadsCount] = await sql`SELECT count(*) FROM leads`;
const [projectsCount] = await sql`SELECT count(*) FROM projects`;
const [servicesCount] = await sql`SELECT count(*) FROM services`;
return {
leads: Number(leadsCount.count),
projects: Number(projectsCount.count),
services: Number(servicesCount.count),
};
} catch (e) {
return { leads: 0, projects: 0, services: 0 };
}
}
export async function getLeadsAdmin() {
try {
return await sql`SELECT * FROM leads ORDER BY created_at DESC`;
} catch (e) {
return [];
}
}
export async function deleteLead(id: number) {
try {
await sql`DELETE FROM leads WHERE id = ${id}`;
return { success: true };
} catch (e) {
return { error: 'Silinemedi' };
}
}
export async function updateSettings(formData: FormData) {
try {
const data = {
site_name: formData.get('site_name') as string,
site_description: formData.get('site_description') as string,
office_address: formData.get('office_address') as string,
contact_email: formData.get('contact_email') as string,
contact_phone: formData.get('contact_phone') as string,
instagram_url: formData.get('instagram_url') as string,
twitter_url: formData.get('twitter_url') as string,
linkedin_url: formData.get('linkedin_url') as string,
status_badge_text: formData.get('status_badge_text') as string,
};
await sql`
UPDATE settings SET
site_name = ${data.site_name},
site_description = ${data.site_description},
office_address = ${data.office_address},
contact_email = ${data.contact_email},
contact_phone = ${data.contact_phone},
instagram_url = ${data.instagram_url},
twitter_url = ${data.twitter_url},
linkedin_url = ${data.linkedin_url},
status_badge_text = ${data.status_badge_text},
updated_at = CURRENT_TIMESTAMP
WHERE id = 1
`;
return { success: true };
} catch (e) {
return { error: 'Güncellenemedi' };
}
}
export async function getProjectsAdmin() {
try {
return await sql`SELECT * FROM projects ORDER BY created_at DESC`;
} catch (e) {
return [];
}
}
export async function getProjectByIdAdmin(id: number) {
try {
const result = await sql`SELECT * FROM projects WHERE id = ${id}`;
return result[0];
} catch (e) {
return null;
}
}
export async function deleteProject(id: number) {
try {
await sql`DELETE FROM projects WHERE id = ${id}`;
return { success: true };
} catch (e) {
return { error: 'Silinemedi' };
}
}
export async function createProjectAdmin(formData: FormData) {
try {
const slug = formData.get('slug') as string;
const title = formData.get('title') as string;
const subtitle = formData.get('subtitle') as string;
const year = formData.get('year') as string;
const hero_image = formData.get('hero_image') as string;
const client = formData.get('client') as string;
const role = formData.get('role') as string;
const location = formData.get('location') as string;
const narrative_title = formData.get('narrative_title') as string;
const narrative_desc = formData.get('narrative_desc') as string;
const is_featured = formData.get('is_featured') === 'on';
const categoriesRaw = formData.getAll('category') as string[];
const techStackRaw = formData.get('tech_stack') as string;
const galleryRaw = formData.get('gallery') as string;
const category = JSON.stringify(categoriesRaw.filter(Boolean));
const tech_stack = JSON.stringify(techStackRaw ? techStackRaw.split(/[\n,]/).map(s => s.trim()).filter(Boolean) : []);
const gallery = JSON.stringify(galleryRaw ? galleryRaw.split(/[\n,]/).map(s => s.trim()).filter(Boolean) : []);
await sql`
INSERT INTO projects (
slug, title, subtitle, category, year, hero_image, client, role, location,
narrative_title, narrative_desc, is_featured, tech_stack, gallery
) VALUES (
${slug}, ${title}, ${subtitle}, ${category}::jsonb, ${year}, ${hero_image}, ${client}, ${role}, ${location},
${narrative_title}, ${narrative_desc}, ${is_featured}, ${tech_stack}::jsonb, ${gallery}::jsonb
)
`;
return { success: true };
} catch (e: any) {
console.error('Error creating project:', e);
return { error: 'Ekleme başarısız: ' + (e.message || 'Bilinmeyen hata') };
}
}
export async function updateProjectAdmin(id: number, formData: FormData) {
try {
const slug = formData.get('slug') as string;
const title = formData.get('title') as string;
const subtitle = formData.get('subtitle') as string;
const year = formData.get('year') as string;
const hero_image = formData.get('hero_image') as string;
const client = formData.get('client') as string;
const role = formData.get('role') as string;
const location = formData.get('location') as string;
const narrative_title = formData.get('narrative_title') as string;
const narrative_desc = formData.get('narrative_desc') as string;
const is_featured = formData.get('is_featured') === 'on';
const categoriesRaw = formData.getAll('category') as string[];
const techStackRaw = formData.get('tech_stack') as string;
const galleryRaw = formData.get('gallery') as string;
const category = JSON.stringify(categoriesRaw.filter(Boolean));
const tech_stack = JSON.stringify(techStackRaw ? techStackRaw.split(/[\n,]/).map(s => s.trim()).filter(Boolean) : []);
const gallery = JSON.stringify(galleryRaw ? galleryRaw.split(/[\n,]/).map(s => s.trim()).filter(Boolean) : []);
await sql`
UPDATE projects SET
slug = ${slug}, title = ${title}, subtitle = ${subtitle}, category = ${category}::jsonb,
year = ${year}, hero_image = ${hero_image}, client = ${client}, role = ${role},
location = ${location}, narrative_title = ${narrative_title},
narrative_desc = ${narrative_desc}, is_featured = ${is_featured},
tech_stack = ${tech_stack}::jsonb, gallery = ${gallery}::jsonb
WHERE id = ${id}
`;
return { success: true };
} catch (e: any) {
console.error('Error updating project:', e);
return { error: 'Güncelleme başarısız: ' + (e.message || 'Bilinmeyen hata') };
}
}
export async function getServicesAdmin() {
try {
return await sql`SELECT * FROM services ORDER BY display_order ASC`;
} catch (e) {
return [];
}
}
export async function deleteService(id: number) {
try {
await sql`DELETE FROM services WHERE id = ${id}`;
return { success: true };
} catch (e) {
return { error: 'Silinemedi' };
}
}
export async function getPartnersAdmin() {
try {
return await sql`SELECT * FROM partners ORDER BY display_order ASC`;
} catch (e) {
return [];
}
}
export async function deletePartner(id: number) {
try {
await sql`DELETE FROM partners WHERE id = ${id}`;
return { success: true };
} catch (e) {
return { error: 'Silinemedi' };
}
}
export async function createPartnerAdmin(formData: FormData) {
try {
const name = formData.get('name') as string;
const logo = formData.get('logo') as string;
const display_order = Number(formData.get('display_order')) || 0;
await sql`
INSERT INTO partners (name, logo, display_order)
VALUES (${name}, ${logo}, ${display_order})
`;
return { success: true };
} catch (e: any) {
console.error('Error creating partner:', e);
return { error: 'Ekleme başarısız: ' + (e.message || 'Bilinmeyen hata') };
}
}
export async function updatePartner(id: number, name: string, display_order: number) {
try {
await sql`
UPDATE partners
SET name = ${name}, display_order = ${display_order}
WHERE id = ${id}
`;
return { success: true };
} catch (e) {
return { error: 'Güncellenemedi' };
}
}