initial commit: project completion with proper gitignore

This commit is contained in:
AyrisAI
2026-05-16 00:43:22 +03:00
commit e708ba2156
84 changed files with 11035 additions and 0 deletions

260
app/admin/actions.ts Normal file
View File

@@ -0,0 +1,260 @@
'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' };
}
}