Lüks restoranlarda rezervasyon yapmak, bazen yorucu bir süreç haline gelebilir. Peki, modern web teknolojilerini kullanarak, bu deneyimi hem restoranlar hem de müşteriler için pürüzsüz ve keyifli bir hale getirebilir miyiz? Bu makalede, Next.js ve Prisma ikilisinin gücünü birleştirerek nasıl üst düzey bir restoran rezervasyon sistemi geliştirebileceğimizi adım adım inceleyeceğiz. Bu rehber, sadece teknik detayları değil, aynı zamanda kullanıcı deneyimi ve ölçeklenebilirlik gibi kritik faktörleri de kapsayarak, projeyi sıfırdan hayata geçirmenize yardımcı olacak.
Günümüzün dijital çağında, kullanıcıların beklentileri her zamankinden daha yüksek. Özellikle lüks segmentte hizmet veren restoranlar için, rezervasyon sürecinin karmaşıklığı, müşteri memnuniyetini doğrudan etkileyen kritik bir faktör. Telefon trafiği, manuel ajandalar, çakışan rezervasyonlar ve son dakika iptallerinin yarattığı operasyonel yük, çoğu zaman restoranların kârlılığını ve itibarını olumsuz etkileyebilir. Müşteriler ise, özel bir akşam yemeği planlarken, hızlı, kolay ve hatasız bir rezervasyon deneyimi arayışındadırlar. Peki, bu sorunu modern bir yaklaşımla, ölçeklenebilir ve güvenilir bir teknoloji altyapısıyla çözebilir miyiz?
Kesinlikle evet! İşte tam bu noktada, Next.js ve Prisma gibi güçlü araçlar devreye giriyor. Next.js, React tabanlı, server-side rendering (SSR) ve static site generation (SSG) yetenekleriyle öne çıkan bir framework olarak, hem hızlı ve SEO dostu frontendler oluşturmamıza olanak tanır hem de API rotaları sayesinde güçlü bir backend altyapısı sunar. Bu sayede, dinamik içerik sunumu ve hızlı sayfa yükleme süreleri sayesinde kullanıcı deneyimini zirveye taşıyabiliriz. Öte yandan Prisma, veritabanı etkileşimini basitleştiren, tip güvenliğine sahip ve geliştirici dostu bir ORM (Object-Relational Mapper) aracıdır. Karmaşık SQL sorguları yazmak yerine, TypeScript’in gücünü kullanarak veritabanı işlemlerini çok daha okunabilir ve yönetilebilir hale getirebiliriz. Bu ikili, lüks bir restoranın tüm rezervasyon ihtiyaçlarını karşılayacak, yüksek performanslı ve güvenli bir sistemin temelini atmak için ideal bir kombinasyondur. Örneğin, yoğun saatlerde binlerce eş zamanlı rezervasyon talebini sorunsuz bir şekilde yönetmek veya anlık masa müsaitliği güncellemeleri sunmak, Next.js ve Prisma ile oldukça gerçekçi hale gelir. Bu yaklaşım, sadece operasyonel verimliliği artırmakla kalmayacak, aynı zamanda müşterilere sunulan hizmet kalitesini de gözle görülür şekilde yükseltecektir. Dolayısıyla, lüks bir restoranın marka değerine yakışır, teknolojik olarak gelişmiş bir rezervasyon sistemi inşa etmek, artık hayal değil, ulaşılabilir bir hedeftir.
🛠️ Temel Taşlar: Next.js ve Prisma Neden İdeal Bir İkili?
Bir lüks restoran rezervasyon sistemi gibi karmaşık bir uygulamayı geliştirirken doğru teknolojileri seçmek, projenin başarısı için kritik öneme sahiptir. Bu bağlamda, Next.js ve Prisma, modern web geliştirmenin sunduğu en güçlü araçlardan ikisidir ve birlikte benzersiz avantajlar sunarlar. Bu iki teknolojinin neden ideal bir ikili olduğunu daha yakından inceleyelim.
Next.js: Frontend’in ve Hafif Backend’in Gücü
Next.js, bir React framework’ü olmasının ötesinde, tam teşekküllü bir web geliştirme platformu olarak kabul edilir. Sunduğu özellikler sayesinde, sadece estetik ve reaktif kullanıcı arayüzleri oluşturmakla kalmaz, aynı zamanda sunucu tarafında işlenen (Server-Side Rendered – SSR) sayfalar ve statik olarak oluşturulan (Static Site Generated – SSG) içerikler aracılığıyla performans ve SEO açısından da büyük avantajlar sağlar. Lüks bir restoranın web sitesi için hızlı yükleme süreleri ve arama motorlarında üst sıralarda yer almak, müşteri çekmek açısından hayati öneme sahiptir. Next.js’in sunduğu otomatik kod bölme (automatic code splitting) ve görüntü optimizasyonu gibi özellikler, bu hedeflere ulaşmayı kolaylaştırır. Ayrıca, Next.js’in yerleşik API Routes özelliği, ayrı bir backend projesi kurma ihtiyacını ortadan kaldırarak, uygulamamızın hem frontend hem de backend kısımlarını tek bir codebase içinde geliştirmemizi sağlar. Bu, geliştirme sürecini basitleştirir, deploy (dağıtım) süreçlerini hızlandırır ve genel proje yönetimini kolaylaştırır. Özellikle rezervasyon taleplerini işlemek, kullanıcı doğrulamasını sağlamak ve restoran bilgilerini sunmak gibi görevler için bu API Routes, oldukça verimli bir çözüm sunar. Örneğin, bir kullanıcının belirli bir tarih ve saat aralığındaki müsait masaları sorguladığı bir senaryoda, Next.js API route’u hızla veritabanından veri çekip anında geri dönebilir, böylece kullanıcıya kesintisiz bir deneyim sunulur.
Prisma: Veritabanı Yönetimini Basitleştiren Köprü
Prisma, modern bir veritabanı araç seti olup, ORM yetenekleriyle ön plana çıkar. Geleneksel ORM’lerden farklı olarak, veritabanı etkileşimlerini TypeScript ile uçtan uca tip güvenliği sağlayarak geliştirir. Bu, geliştirme sırasında potansiyel hataları yakalamayı kolaylaştırır ve kodun daha okunabilir, sürdürülebilir olmasını sağlar. Rezervasyon sistemi gibi veri yoğun bir uygulamada, verilerin doğru bir şekilde saklanması, alınması ve güncellenmesi büyük önem taşır. Prisma’nın Schema-first yaklaşımı, veritabanı şemamızı (örneğin, Restaurant, Reservation, User modelleri) tek bir schema.prisma dosyasında tanımlamamıza olanak tanır. Bu şema üzerinden otomatik olarak bir Prisma Client oluşturulur ve bu client, uygulamamızın veritabanıyla güvenli ve tip kontrollü bir şekilde iletişim kurmasını sağlar. Desteklediği veritabanları arasında PostgreSQL, MySQL, SQLite, SQL Server ve MongoDB (Preview) gibi popüler seçenekler bulunur, bu da projenizin ihtiyaçlarına göre esneklik sağlar. Prisma’nın migration (göç) araçları sayesinde, veritabanı şemasında yapılan değişiklikleri güvenli bir şekilde yönetebilir ve dağıtabiliriz. Örneğin, yeni bir özellik eklendiğinde ve bu, veritabanı yapısında bir değişiklik gerektirdiğinde, Prisma migration’ları bu değişikliklerin izlenmesini ve uygulanmasını sorunsuz hale getirir. Bu, özellikle üretim ortamında canlı bir sistemi güncellerken büyük bir güvence sağlar. Next.js API Routes içinde Prisma Client’ı kullanmak, hem frontend hem de backend logic’ini TypeScript’in sağladığı avantajlarla birleştirerek, geliştirme hızını ve kod kalitesini önemli ölçüde artırır. Bu kombinasyon, özellikle lüks bir restoran gibi hata toleransının düşük olduğu ortamlarda, sağlam ve güvenilir bir altyapı oluşturmanın anahtarıdır.
⚙️ Proje Kurulumu ve İlk Adımlar: Sıfırdan Başlangıç Nasıl Yapılır?
Artık Next.js ve Prisma’nın neden güçlü bir ikili olduğunu anladığımıza göre, bu teknolojileri kullanarak projemizi nasıl sıfırdan kuracağımıza geçebiliriz. Bu bölüm, temel proje yapısını oluşturmaktan veritabanı şemamızı tanımlamaya kadar adım adım bir rehber sunacak.
Next.js Projesini Başlatma
İlk adım, Next.js projemizi oluşturmak. Terminalinizi açın ve aşağıdaki komutu çalıştırın. Bu komut, size TypeScript, ESLint ve Tailwind CSS gibi popüler araçları projenize dahil etme seçeneği sunacaktır; hepsi için “Yes” seçeneğini tercih etmeniz modern ve sağlam bir geliştirme deneyimi için önerilir.
npx create-next-app@latest rezervasyon-sistemi --typescript --eslint --tailwind
Proje oluşturulduktan sonra, dizine girin:
cd rezervasyon-sistemi
Ve geliştirme sunucusunu başlatın:
npm run dev
Artık tarayıcınızda http://localhost:3000 adresine giderek Next.js başlangıç sayfasını görebilirsiniz. Bu, frontend tarafınızın hazır olduğu anlamına gelir.
Prisma Kurulumu ve Veritabanı Bağlantısı
Şimdi sıra Prisma'yı projemize entegre etmeye geldi. Prisma'nın kurulumu ve veritabanı ile bağlantı kurması oldukça basittir.
- Prisma CLI ve Client Kütüphanelerini Kurun:
- Prisma'yı Başlatın: Bu komut, projenize bir
prismadizini ve içindeschema.prismadosyası oluşturacaktır. Ayrıca, veritabanı bağlantı dizenizi içeren bir.envdosyası da oluşturulacaktır. - Veritabanı Bağlantısını Yapılandırın:
.envdosyanızı açın veDATABASE_URLdeğişkenini kullanacağınız veritabanının bağlantı dizeniyle güncelleyin. Lüks restoran sistemleri için genellikle güvenilirliği ve ölçeklenebilirliği nedeniyle PostgreSQL tercih edilir.
npm install prisma @prisma/client
npx prisma init
DATABASE_URL="postgresql://kullanici:sifre@localhost:5432/restoran_rezervasyon?schema=public"
Yukarıdaki örnek bir PostgreSQL bağlantı dizesidir. Kendi veritabanı bilgilerinize göre (kullanıcı adı, şifre, host, port, veritabanı adı) güncellemeyi unutmayın. Eğer henüz bir PostgreSQL veritabanınız yoksa, Docker ile hızlıca bir tane kurabilirsiniz:
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres
Veritabanı Şemasını Tanımlama (schema.prisma)
Prisma'nın kalbi, prisma/schema.prisma dosyasında tanımlanan veri modelleridir. Bu modeller, veritabanımızdaki tabloları ve aralarındaki ilişkileri temsil eder. Rezervasyon sistemimiz için temel modelleri oluşturalım: User (Kullanıcı), Restaurant (Restoran) ve Reservation (Rezervasyon).
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id String @id @default(uuid())
email String @unique
name String?
password String // Şifreler hash'lenmelidir!
reservations Reservation[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Restaurant {
id String @id @default(uuid())
name String
address String
phone String
description String?
imageUrl String?
openingTime String // Örn: "09:00"
closingTime String // Örn: "23:00"
capacity Int // Toplam masa sayısı veya kapasite
tables Int // Mevcut masa sayısı
reservations Reservation[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Reservation {
id String @id @default(uuid())
userId String
user User @relation(fields: [userId], references: [id])
restaurantId String
restaurant Restaurant @relation(fields: [restaurantId], references: [id])
date DateTime
time String // Örn: "19:30"
partySize Int // Kişi sayısı
status String @default("PENDING") // PENDING, CONFIRMED, CANCELLED
notes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([restaurantId, date, time]) // Aynı restoranda, aynı saatte iki rezervasyon olamaz (basit kontrol)
}
Yukarıdaki şemada;
User: Rezervasyon yapan kullanıcıları temsil eder. Şifrenin güvenli bir şekilde hashlenmesi gerektiğini unutmayın.Restaurant: Rezervasyon yapılabilecek restoranları içerir. Kapasite, açılış/kapanış saatleri gibi bilgiler önemlidir.Reservation: Bir kullanıcının belirli bir restoran için yaptığı rezervasyonu tutar.userIdverestaurantIdalanları,@relationanotasyonları ile diğer modellerle ilişkilendirilir.@@unique([restaurantId, date, time])kısıtlaması, aynı restoranda, aynı tarih ve saat için mükerrer rezervasyonları engellemek için basit bir kontrol sağlar. Gerçek dünyada bu, masa numaraları ve müsaitlik durumu gibi daha karmaşık bir mantıkla ele alınmalıdır.
Veritabanı Migration'ları ve Prisma Client Oluşturma
Şema dosyamızı tanımladıktan sonra, bu şemayı veritabanımıza uygulamamız gerekiyor. Prisma'nın migration sistemi bu konuda bize yardımcı olur.
- Migration Oluşturma ve Uygulama:
- Prisma Client'ı Oluşturma: Herhangi bir model değişikliği yaptığınızda, Prisma Client'ı yeniden oluşturmanız gerekir. Bu, TypeScript'in modellerinizi tanımasını ve doğru tip ipuçları sağlamasını sağlar.
npx prisma migrate dev --name init
Bu komut, prisma/migrations dizini altında yeni bir migration dosyası oluşturacak ve ardından bu migration'ı veritabanınıza uygulayarak tabloları oluşturacaktır.
npx prisma generate
Artık projemiz temel Next.js yapısıyla ve veritabanı ile iletişim kurmaya hazır bir Prisma kurulumuyla donatılmış durumda. Sonraki adımlarda, bu temeller üzerine API'lerimizi ve kullanıcı arayüzümüzü inşa etmeye başlayabiliriz.
⚙️ Backend Geliştirme: Rezervasyon API'ları Next.js ile Nasıl Oluşturulur?
Projemizin temelini attığımıza göre, şimdi rezervasyon sistemimizin "beyni" olan backend kısmına odaklanabiliriz. Next.js'in API Routes özelliği sayesinde, RESTful API'lerimizi kolayca oluşturabilir ve veritabanımızla etkileşim kurabiliriz. Bu bölümde, kullanıcıların rezervasyon yapabileceği, mevcut rezervasyonları listeleyebileceği ve belki de iptal edebileceği temel API uç noktalarını nasıl oluşturacağımızı ele alacağız.
Next.js API Routes: Tanım ve Kullanım
Next.js'de API Routes, pages/api dizini altında tanımlanan dosyalardır. Bu dosyalar, sunucu tarafında çalışan ve HTTP isteklerine yanıt veren Node.js işlevleri olarak görev yapar. Bu sayede, ayrı bir backend framework'üne ihtiyaç duymadan, frontend ve backend mantığını aynı projede tutabiliriz. Örneğin, pages/api/reservations.ts adında bir dosya oluşturduğumuzda, bu dosya /api/reservations adresinden erişilebilen bir API endpoint'i haline gelir.
Prisma Client'ı Başlatma ve Kullanma
API Routes içinde veritabanımızla iletişim kurmak için Prisma Client'ı kullanacağız. Daha önce de bahsettiğimiz gibi, performans optimizasyonu için global bir Prisma Client örneği kullanmak en iyi uygulamadır.
// lib/prisma.ts (Yeni bir dosya oluşturun)
import { PrismaClient } from '@prisma/client';
let prisma: PrismaClient;
if (process.env.NODE_ENV === 'production') {
prisma = new PrismaClient();
} else {
if (!(global as any).prisma) {
(global as any).prisma = new PrismaClient();
}
prisma = (global as any).prisma;
}
export default prisma;
Bu kod parçası, geliştirme ortamında sıcak yeniden yükleme (hot-reloading) sırasında her defasında yeni bir Prisma Client örneği oluşturulmasını engellerken, üretim ortamında tek bir örnek kullanır. Şimdi bu Prisma Client'ı API rotalarımızda kullanabiliriz.
Rezervasyon Oluşturma (POST /api/reservations)
Yeni bir rezervasyon oluşturmak için bir POST isteği alacak bir API rotası oluşturalım. Bu rota, kullanıcının gönderdiği verileri doğrulayacak ve veritabanına yeni bir rezervasyon kaydı ekleyecektir. Öncelikle, pages/api/reservations/index.ts dosyasını oluşturalım:
// pages/api/reservations/index.ts
import type { NextApiRequest, NextApiResponse } from 'next';
import prisma from '@/lib/prisma'; // lib/prisma.ts dosyasını doğru yoldan import edin
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method === 'POST') {
const { userId, restaurantId, date, time, partySize, notes } = req.body;
// 1. Giriş verilerini doğrulama
if (!userId || !restaurantId || !date || !time || !partySize) {
return res.status(400).json({ message: 'Eksik rezervasyon bilgileri.' });
}
// 2. Tarih formatını kontrol etme (örneğin ISO string)
const reservationDate = new Date(date);
if (isNaN(reservationDate.getTime())) {
return res.status(400).json({ message: 'Geçersiz tarih formatı.' });
}
try {
// 3. Restoranın müsaitliğini kontrol etme (basit bir örnek)
// Daha karmaşık bir senaryoda, masa numaraları, kapasite ve diğer rezervasyonlar dikkate alınmalıdır.
const restaurant = await prisma.restaurant.findUnique({
where: { id: restaurantId },
});
if (!restaurant) {
return res.status(404).json({ message: 'Restoran bulunamadı.' });
}
// Aynı tarih ve saat için çakışma kontrolü (basit bir yaklaşımdır, gerçek sistemde masa bazında olmalı)
const existingReservation = await prisma.reservation.findFirst({
where: {
restaurantId,
date: reservationDate,
time,
},
});
if (existingReservation) {
return res.status(409).json({ message: 'Bu saatte başka bir rezervasyon mevcut.' });
}
// 4. Yeni rezervasyonu oluşturma
const newReservation = await prisma.reservation.create({
data: {
userId,
restaurantId,
date: reservationDate,
time,
partySize: parseInt(partySize, 10),
notes,
status: 'CONFIRMED', // Başlangıçta CONFIRMED olarak ayarlanabilir veya PENDING
},
});
return res.status(201).json(newReservation);
} catch (error) {
console.error('Rezervasyon oluşturulurken hata:', error);
return res.status(500).json({ message: 'Dahili sunucu hatası.' });
}
} else {
// Diğer HTTP metodlarına izin verme
res.setHeader('Allow', ['POST']);
return res.status(405).end(Metot ${req.method} Desteklenmiyor.);
}
}
Bu kod;
POSTisteğini işler.- Gerekli alanların doldurulup doldurulmadığını kontrol eder.
- Restoranın varlığını kontrol eder.
- Belirli bir tarih ve saat için çakışan rezervasyon olup olmadığını kontrol eder (bu, lüks bir sistem için başlangıç seviyesi bir kontroldür; daha gelişmiş sistemler masa numarası, alan vb. detayları hesaba katmalıdır).
- Herhangi bir hata durumunda uygun HTTP durum kodları ve mesajları ile yanıt verir.
Tüm Rezervasyonları Listeleme (GET /api/reservations)
Mevcut rezervasyonları listelemek için aynı pages/api/reservations/index.ts dosyasında bir GET isteği işleyici ekleyebiliriz.
// pages/api/reservations/index.ts (devam)
import type { NextApiRequest, NextApiResponse } from 'next';
import prisma from '@/lib/prisma';
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method === 'POST') {
// ... (yukarıdaki POST kodu)
} else if (req.method === 'GET') {
try {
// Query parametreleri ile filtreleme yapılabilir (örneğin userId, restaurantId, status)
const { userId, restaurantId, status } = req.query;
const reservations = await prisma.reservation.findMany({
where: {
...(userId && { userId: String(userId) }),
...(restaurantId && { restaurantId: String(restaurantId) }),
...(status && { status: String(status) }),
},
include: {
user: {
select: { id: true, name: true, email: true }, // Güvenlik için şifre veya hassas bilgi göndermeyin
},
restaurant: {
select: { id: true, name: true, address: true, phone: true },
},
},
orderBy: {
date: 'asc',
},
});
return res.status(200).json(reservations);
} catch (error) {
console.error('Rezervasyonlar getirilirken hata:', error);
return res.status(500).json({ message: 'Dahili sunucu hatası.' });
}
} else {
res.setHeader('Allow', ['POST', 'GET']);
return res.status(405).end(Metot ${req.method} Desteklenmiyor.);
}
}
Bu GET isteği işleyici;
- Gelen
userId,restaurantIdveyastatusquery parametrelerine göre rezervasyonları filtreler. includeözelliği ile ilgili kullanıcı ve restoran bilgilerini de rezervasyon objesine dahil eder (güvenlik nedeniyle hassas bilgileri hariç tutarak).- Rezervasyonları tarihe göre sıralar.
Hata Yönetimi ve Güvenlik İpuçları
- Giriş Doğrulama: Her zaman istemciden gelen verileri sunucu tarafında doğrulayın. Sadece boş olup olmadığını kontrol etmekle kalmayıp, veri türlerini, uzunluklarını ve formatlarını da kontrol edin (örneğin, e-posta formatı, tarih geçerliliği). Zod veya Yup gibi şema doğrulama kütüphanelerini kullanmak bu süreci çok daha kolay ve güvenli hale getirebilir.
- Hata Mesajları: Kullanıcılara anlaşılır ama genel hata mesajları sunun. Detaylı hata mesajları (örneğin, veritabanı hata mesajları) hassas bilgiler içerebileceği için üretim ortamında kesinlikle kaçınılmalıdır.
- Kimlik Doğrulama ve Yetkilendirme: API rotalarınıza erişimi kısıtlamak için kimlik doğrulama (authentication) ve yetkilendirme (authorization) mekanizmaları uygulayın. Kullanıcının gerçekten bir rezervasyon yapmaya veya kendi rezervasyonlarını görüntülemeye yetkili olup olmadığını kontrol edin. NextAuth.js, bu konuda güçlü bir çözüm sunar.
- Veri Güvenliği: Asla şifreleri düz metin olarak saklamayın. bcrypt gibi kütüphaneler kullanarak şifreleri hashleyin. Veritabanından hassas verileri (şifreler, API anahtarları) doğrudan istemciye göndermekten kaçının.
Bu temel API rotalarıyla, rezervasyon sistemimizin backend omurgasını oluşturmuş oluyoruz. İleri düzey senaryolarda, masa müsaitliği, iptal işlemleri, ödeme entegrasyonları gibi daha karmaşık mantıkları da bu API'lere ekleyebilirsiniz.
🎨 Frontend Mimarisi: Kullanıcı Deneyimi Odaklı Arayüz Nasıl Tasarlanır?
Güçlü bir backend'e sahip olmak harika, ancak lüks bir rezervasyon sisteminin başarısı büyük ölçüde kullanıcı arayüzünün (UI) ve kullanıcı deneyiminin (UX) kalitesine bağlıdır. Bu bölümde, Next.js ve React'ın bileşen tabanlı yapısını kullanarak, sezgisel, estetik ve işlevsel bir rezervasyon arayüzünü nasıl geliştireceğimizi inceleyeceğiz.
Kullanıcı Arayüzü İçin Bileşen Tabanlı Yaklaşım
React'ın en büyük avantajlarından biri, arayüzü yönetilebilir ve yeniden kullanılabilir bileşenlere ayırma yeteneğidir. Rezervasyon sistemi için şu temel bileşenleri düşünebiliriz:
- : Tarih, saat, kişi sayısı gibi bilgileri alan ana form.
- : Restoranları listeleyen ve her bir restoranın detaylarını gösteren kart.
- : Kullanıcının rezervasyon tarihini seçmesini sağlayan bir tarih seçici.
- : Müsait saat dilimlerini gösteren ve seçmeyi sağlayan bileşen.
- : Rezervasyon onayı veya hata mesajlarını gösteren modal pencere.
Bu bileşenleri bir araya getirerek, karmaşık bir arayüzü daha basit ve yönetilebilir parçalara ayırabiliriz.
Rezervasyon Formu Oluşturma
Ana rezervasyon formumuz, kullanıcının rezervasyon bilgilerini girmesi için merkezi bir nokta olacaktır. pages/book/[restaurantId].tsx veya components/ReservationForm.tsx gibi bir yapı düşünebiliriz.
// components/ReservationForm.tsx
"use client"; // Next.js 13+ App Router için, eğer App Router kullanılıyorsa
import React, { useState } from 'react';
import DatePicker from 'react-datepicker';
import 'react-datepicker/dist/react-datepicker.css';
import { useRouter } from 'next/router'; // Pages Router için
interface ReservationFormProps {
restaurantId: string;
}
const ReservationForm: React.FC = ({ restaurantId }) => {
const [selectedDate, setSelectedDate] = useState(null);
const [selectedTime, setSelectedTime] = useState('');
const [partySize, setPartySize] = useState(1);
const [notes, setNotes] = useState('');
const [error, setError] = useState(null);
const [loading, setLoading] = useState(false);
// Örnek müsait saatler (gerçekte API'den çekilmeli)
const availableTimes = ['18:00', '19:00', '20:00', '21:00'];
const router = useRouter();
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setLoading(true);
setError(null);
if (!selectedDate || !selectedTime || partySize < 1) {
setError('Lütfen tüm alanları doldurun.');
setLoading(false);
return;
}
try {
const response = await fetch('/api/reservations', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
userId: 'some-user-id', // Kimlik doğrulama sonrası dinamik olacak
restaurantId,
date: selectedDate.toISOString(),
time: selectedTime,
partySize,
notes,
}),
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.message || 'Rezervasyon başarısız.');
}
const data = await response.json();
alert('Rezervasyon başarıyla oluşturuldu!');
router.push(/reservations/${data.id}); // Rezervasyon detay sayfasına yönlendir
} catch (err: any) {
setError(err.message || 'Bir hata oluştu.');
} finally {
setLoading(false);
}
};
return (
);
};
export default ReservationForm;
Bu form bileşeni;
useStatehook'larını kullanarak form alanlarının durumunu yönetir.react-datepickerkütüphanesi ile kullanıcı dostu bir tarih seçici sunar.- Form gönderildiğinde,
/api/reservationsendpoint'ine bir POST isteği gönderir. - Yükleme (loading) durumunu ve hata mesajlarını kullanıcıya gösterir.
- Rezervasyon başarılı olduğunda kullanıcıyı rezervasyon detay sayfasına yönlendirir.
State Yönetimi ve Veri Çekme
Frontend tarafında veri çekme ve state yönetimi için React Query (veya SWR) gibi kütüphaneler kullanmak, önbellekleme, arka plan yenileme, hata tekrar deneme gibi birçok özelliği otomatik olarak yöneterek geliştirme deneyimini büyük ölçüde iyileştirir. Örneğin, bir restoranın müsait saatlerini çekmek için:
// pages/book/[restaurantId].tsx (sayfa içinde veya RestaurantDetails bileşeninde)
import { useQuery } from '@tanstack/react-query'; // React Query kullanılıyorsa
const fetchAvailableTimes = async (restaurantId: string, date: string) => {
const res = await fetch(/api/restaurants/${restaurantId}/available-times?date=${date});
if (!res.ok) {
throw new Error('Müsait saatler çekilemedi.');
}
return res.json();
};
function RestaurantBookingPage({ restaurantId }: { restaurantId: string }) {
const [selectedDate, setSelectedDate] = useState(new Date());
const { data: availableTimes, isLoading, error } = useQuery({
queryKey: ['availableTimes', restaurantId, selectedDate?.toISOString()],
queryFn: () => fetchAvailableTimes(restaurantId, selectedDate?.toISOString() || ''),
enabled: !!selectedDate, // Yalnızca tarih seçiliyse sorguyu çalıştır
});
if (isLoading) return Müsait saatler yükleniyor...;
if (error) return Hata: {error.message};
return (
{restaurantId} için Rezervasyon Yap
);
}
Bu yaklaşım, UI'ın veritabanı ile senkronize kalmasını ve kullanıcıya her zaman güncel bilgileri sunmasını sağlar.
Mobil Uyumluluk ve Duyarlı Tasarım
Lüks restoran müşterileri, rezervasyonlarını mobil cihazlarından yapmayı tercih edebilirler. Bu nedenle, duyarlı tasarım (responsive design) olmazsa olmazdır. Tailwind CSS gibi bir CSS framework'ü kullanarak veya elle media query'ler yazarak mobil uyumluluk sağlayabiliriz.
/* styles/globals.css veya bir CSS modülünde */
/* Küçük ekranlar için varsayılan stiller */
.reservation-container {
padding: 1rem;
max-width: 100%;
}
.reservation-form-group {
margin-bottom: 1rem;
}
/* Orta ve büyük ekranlar için media query */
@media (min-width: 768px) {
.reservation-container {
padding: 2rem;
max-width: 600px; /* Belirli bir genişlikten sonra formu merkeze al */
}
.reservation-form-group {
display: flex;
align-items: center;
gap: 1rem;
}
.reservation-form-group label {
flex: 1;
text-align: right;
}
.reservation-form-group input,
.reservation-form-group select,
.reservation-form-group textarea {
flex: 2;
}
}
Yukarıdaki CSS örneği, küçük ekranlarda form elemanlarının dikey olarak yığılmasını, daha büyük ekranlarda ise yatay olarak hizalanmasını sağlar. Bu sayede, farklı cihazlarda optimize edilmiş bir görüntü elde ederiz. Tailwind CSS kullanırken, bu tür duyarlı tasarımları doğrudan HTML sınıfları aracılığıyla çok daha hızlı bir şekilde yapabiliriz (örneğin, md:flex md:gap-4).
Kullanıcı deneyimi, sadece görsel estetikle sınırlı değildir. Hızlı yükleme süreleri, net geri bildirimler (başarı/hata mesajları), kolay navigasyon ve erişilebilirlik gibi faktörler, lüks bir rezervasyon sisteminin kalitesini belirler. Next.js'in performans optimizasyonları ve React'ın esnekliği sayesinde, bu hedeflere ulaşmak oldukça kolaydır.
🔒 Güvenlik ve Ölçeklenebilirlik: Lüks Sistemlerde Kritik Faktörler Nelerdir?
Bir lüks restoran rezervasyon sistemi, sadece işlevsel olmakla kalmayıp, aynı zamanda son derece güvenli ve ölçeklenebilir olmalıdır. Müşteri verilerinin gizliliği, rezervasyon bilgilerinin bütünlüğü ve yoğun talep anlarında sistemin sorunsuz çalışması, bu tür bir platform için hayati öneme sahiptir. Bu bölümde, projemizin güvenliğini ve gelecekteki büyümesini destekleyecek ölçeklenebilirlik stratejilerini ele alacağız.
Kimlik Doğrulama (Authentication) ve Yetkilendirme (Authorization)
Kullanıcıların sisteme güvenli bir şekilde giriş yapmasını ve yalnızca yetkili oldukları işlemleri gerçekleştirmesini sağlamak, güvenlik katmanının temelidir.
- Kimlik Doğrulama:
- NextAuth.js: Next.js uygulamaları için en popüler ve kapsamlı kimlik doğrulama kütüphanesidir. OAuth sağlayıcıları (Google, Facebook vb.), e-posta/şifre tabanlı giriş veya sihirli bağlantılar (magic links) gibi çeşitli yöntemleri destekler. Çerez tabanlı oturum yönetimi (session management) sunarak sunucu tarafında güvenliği sağlar.
- JWT (JSON Web Tokens): Eğer daha esnek veya mikroservis tabanlı bir mimari tercih ediliyorsa, JWT'ler kullanılabilir. Kullanıcı girişi sonrası verilen bir token, sonraki isteklerde kimlik doğrulaması için kullanılır. Ancak, JWT'lerin istemci tarafında güvenli bir şekilde saklanması (HTTP-only çerezlerde) ve yenilenme (refresh token) mekanizmalarının doğru kurulması önemlidir.
- Yetkilendirme:
- Rol Tabanlı Erişim Kontrolü (RBAC): Sistemde farklı kullanıcı rolleri tanımlayın (örneğin, Müşteri, Restoran Yöneticisi, Süper Yönetici). Her rolün belirli eylemleri gerçekleştirme veya belirli verilere erişim yetkisi olsun. Örneğin, bir müşteri sadece kendi rezervasyonlarını görüntüleyebilir ve değiştirebilirken, bir restoran yöneticisi kendi restoranının tüm rezervasyonlarını yönetebilir. Bu mantık, API rotalarınızda ve frontend'de uygulanmalıdır.
- Sunucu Tarafı Kontrolü: Asla yetkilendirme kararlarını yalnızca frontend üzerinde almayın. Kullanıcının bir eylemi gerçekleştirmeye yetkili olup olmadığını her zaman sunucu tarafında doğrulayın. Örneğin, bir rezervasyon iptal isteği geldiğinde, isteği yapan kullanıcının bu rezervasyonun sahibi olup olmadığını veya yönetici yetkisine sahip olup olmadığını kontrol edin.
// pages/api/reservations/[id].ts (Örnek: Rezervasyon güncelleme/iptal)
import type { NextApiRequest, NextApiResponse } from 'next';
import prisma from '@/lib/prisma';
// import { getSession } from 'next-auth/react'; // NextAuth.js ile oturum bilgisi almak için
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const { id } = req.query; // rezervasyon ID
// const session = await getSession({ req }); // NextAuth.js kullanılıyorsa
// if (!session) {
// return res.status(401).json({ message: 'Giriş yapmalısınız.' });
// }
if (req.method === 'PUT') {
const { status, notes } = req.body;
try {
const reservation = await prisma.reservation.findUnique({
where: { id: String(id) },
});
if (!reservation) {
return res.status(404).json({ message: 'Rezervasyon bulunamadı.' });
}
// Yetkilendirme kontrolü: Sadece rezervasyon sahibi veya admin güncelleyebilir
// if (reservation.userId !== session.user.id && session.user.role !== 'ADMIN') {
// return res.status(403).json({ message: 'Bu rezervasyonu güncelleme yetkiniz yok.' });
// }
const updatedReservation = await prisma.reservation.update({
where: { id: String(id) },
data: { status, notes },
});
return res.status(200).json(updatedReservation);
} catch (error) {
console.error('Rezervasyon güncellenirken hata:', error);
return res.status(500).json({ message: 'Dahili sunucu hatası.' });
}
} else {
res.setHeader('Allow', ['PUT']);
return res.status(405).end(Metot ${req.method} Desteklenmiyor.);
}
}
Veritabanı Optimizasyonları
Yoğun kullanımlı sistemlerde veritabanı performansı kritik öneme sahiptir. Prisma ile bile, veritabanı seviyesinde optimizasyonlara dikkat etmek gerekir.
- İndeksler (Indexes): Sıkça sorgulanan alanlara (örneğin
userId,restaurantId,date,time) indeks ekleyin. Prisma şemasında@@index([alanAdi])veya@@unique([alanAdi])kullanarak bunu yapabilirsiniz. Bu, sorgu sürelerini önemli ölçüde hızlandırır. - Sorgu Optimizasyonu: N+1 sorgu problemlerinden kaçının. Prisma'nın
includeveselectözelliklerini akıllıca kullanarak sadece ihtiyacınız olan veriyi çekin ve ilişkili verileri tek sorguda getirin. - Bağlantı Havuzlama (Connection Pooling): Özellikle sunucusuz (serverless) ortamlarda, her istek için yeni bir veritabanı bağlantısı açmak performansı düşürebilir. Prisma, bağlantı havuzlamayı yönetir, ancak sunucusuz fonksiyonlar için veritabanı sağlayıcınızın (örneğin Vercel Postgres, Supabase) sunduğu bağlantı havuzu çözümlerini (PgBouncer gibi) kullanmak önemlidir.
Ölçeklenebilirlik Stratejileri
Lüks bir restoran zinciri büyüdükçe veya popülaritesi arttıkça, rezervasyon sistemi de bu yükü kaldırabilmelidir.
- Sunucusuz (Serverless) Fonksiyonlar: Next.js API Routes, Vercel gibi platformlarda sunucusuz fonksiyonlar olarak dağıtılır. Bu, talep arttıkça otomatik olarak ölçeklenebilecekleri anlamına gelir. Kullanım başına ödeme modeli sayesinde maliyet avantajı da sağlayabilirler.
- Veri Önbellekleme (Caching): Sıkça erişilen ve nadiren değişen veriler için önbellekleme kullanın. Örneğin, restoran bilgileri gibi statik verileri CDN (Content Delivery Network) veya in-memory cache (Redis gibi) üzerinde önbellekleyebilirsiniz. Next.js'in veri önbellekleme mekanizmaları (örn.
revalidateoption ile ISR) veya React Query/SWR gibi kütüphanelerin istemci tarafı önbelleklemesi bu konuda yardımcı olur. - Veritabanı Ölçeklendirme: Dikey (daha güçlü sunucu) veya yatay (daha fazla sunucu, sharding) olarak veritabanınızı ölçeklendirmeye hazır olun. PostgreSQL gibi veritabanları, replikasyon ve okuma replikaları ile ölçeklenebilirlik sunar.
- Yük Dengeleme (Load Balancing): Çok sayıda istek geldiğinde, gelen trafiği birden fazla sunucuya dağıtmak için bir yük dengeleyici kullanın. Vercel gibi platformlar bu altyapıyı sizin için yönetir.
bcryptjs gibi bir kütüphane kullanarak şifreleri hash'leyin. Kullanıcı girişi sırasında da girilen şifreyi hashleyip veritabanındaki hash ile karşılaştırın. Örneğin:
// Şifre hashleme
import bcrypt from 'bcryptjs';
const hashedPassword = await bcrypt.hash(password, 10);
// Şifre karşılaştırma
const passwordMatch = await bcrypt.compare(plainPassword, hashedPassword);
Bu güvenlik ve ölçeklenebilirlik yaklaşımlarını projenin başından itibaren düşünmek, uzun vadede daha sağlam, güvenilir ve başarılı bir rezervasyon sistemi inşa etmenin anahtarıdır. Lüks bir sistemde, bu faktörlerin göz ardı edilmesi, hem müşteri kaybına hem de operasyonel sorunlara yol açabilir.
📈 İleri Düzey Optimizasyonlar ve Ek Özellikler: Deneyimi Nasıl Zenginleştirebiliriz?
Temel bir rezervasyon sistemi oluşturduk, ancak lüks segmentte rekabet edebilmek ve gerçekten üst düzey bir deneyim sunabilmek için ileri düzey özellikler ve optimizasyonlar eklememiz gerekiyor. Bu bölümde, sistemimizi bir adım öteye taşıyacak bazı ek özelliklere ve performans iyileştirmelerine odaklanacağız.
Gerçek Zamanlı Masa Müsaitliği ve Çakışma Yönetimi
Basit bir "aynı saatte başka rezervasyon var mı?" kontrolü, lüks bir restoran için yeterli değildir. Restoranların farklı masa tipleri (cam kenarı, özel oda), farklı kapasitelerdeki masaları ve anlık iptaller gibi durumları yönetmesi gerekir.
- Masa Yönetim Sistemi: Veritabanımızda
Table(Masa) adında ayrı bir model tanımlayabiliriz. Bu model, her masanın kapasitesini, konumunu ve mevcut durumunu (örneğin, temizleniyor, dolu, boş) içerebilir. Rezervasyon yaparken, kullanıcının tercihine ve kişi sayısına uygun bir masa otomatik olarak atanabilir. - WebSockets (Socket.io/Pusher): Gerçek zamanlı güncellemeler için WebSockets kullanmak, birden fazla kullanıcının veya restoran personelinin aynı anda masa müsaitliğini görmesini sağlar. Bir masa rezerve edildiğinde veya boşaldığında, bu bilgi anında diğer tüm kullanıcılara iletilir, böylece çakışmaların önüne geçilir ve doğru bilgi her zaman gösterilir.
- İyimser Kilitleme (Optimistic Locking): Eş zamanlı rezervasyon denemelerinde çakışmaları önlemek için bir stratejidir. Veritabanı kayıtlarına bir sürüm (version) alanı ekleyerek, bir kayıt güncellenmeye çalışıldığında sürüm kontrol edilir. Eğer sürüm değişmişse, başka bir kullanıcının kaydı daha önce güncellediği anlaşılır ve rezervasyon isteği reddedilir.
Güvenli Ödeme Entegrasyonu
Bazı lüks restoranlar, rezervasyon garantisi olarak ön ödeme veya depozito isteyebilir. Bu durumda, güvenli bir ödeme geçidi entegrasyonu şarttır.
- Stripe veya Braintree: Bu ödeme sağlayıcıları, kart bilgilerini güvenli bir şekilde işlemek için güçlü API'ler ve SDK'lar sunar. Kredi kartı bilgilerini kendi sunucularınızda saklamaktan kaçının (PCI DSS uyumluluğu nedeniyle). Bunun yerine, ödeme sağlayıcısının tokenizasyon hizmetlerini kullanın.
- Ön Yetkilendirme (Pre-authorization): Rezervasyon anında karttan belirli bir miktar çekmek yerine, sadece bir ön yetkilendirme yaparak kartın geçerliliğini ve yeterli bakiyeyi kontrol edebilirsiniz. Ödeme, misafir restorana geldiğinde veya belirli bir süre sonra tamamlanır.
Gelişmiş Yönetim Paneli ve Raporlama
Restoran yöneticileri için, rezervasyonları kolayca görüntüleyebilecekleri, yönetebilecekleri ve analiz edebilecekleri kapsamlı bir yönetim paneli olmazsa olmazdır.
- Admin Paneli: Belirli bir güne ait tüm rezervasyonları listeleme, filtreleme, arama, manuel olarak rezervasyon ekleme/düzenleme/iptal etme yeteneği.
- Masa Planı Görselleştirme: Restoranın masa düzenini gösteren interaktif bir harita, hangi masaların dolu, boş veya rezerve olduğunu anlık olarak gösterir.
- Raporlama ve Analiz: Doluluk oranları, en yoğun saatler, müşteri tercihleri, iptal oranları gibi verilerin görsel raporları, restoranın operasyonel kararlar almasına yardımcı olur. Metabase veya Grafana gibi araçlar, bu tür analizler için entegre edilebilir.
Bildirimler ve Hatırlatıcılar
Müşteri deneyimini artırmak ve no-show oranlarını azaltmak için otomatik bildirimler önemlidir.
- E-posta Onayı: Rezervasyon yapıldıktan hemen sonra detaylı bir onay e-postası gönderme.
- SMS Hatırlatıcıları: Rezervasyon tarihinden belirli bir süre önce (örneğin 24 saat önce) SMS ile hatırlatma gönderme. Twilio gibi servisler bu amaçla kullanılabilir.
- Webhook'lar: Harici CRM veya Pazarlama Otomasyon sistemlerine rezervasyon olaylarını (oluşturma, iptal) bildirmek için webhook'lar tanımlama.
Test Stratejileri
Uygulamanın kalitesini ve güvenilirliğini sağlamak için kapsamlı testler çok önemlidir.
- Birim Testleri (Unit Tests): Her bir fonksiyon veya bileşenin ayrı ayrı doğru çalıştığını test edin (Jest, React Testing Library).
- Entegrasyon Testleri (Integration Tests): Farklı modüllerin (örneğin, API rotası ve veritabanı etkileşimi) birlikte doğru çalıştığını test edin.
- Uçtan Uca Testler (End-to-End Tests - E2E): Kullanıcı senaryolarını bir tarayıcı ortamında test edin (Playwright, Cypress). Bir kullanıcının rezervasyon yapma sürecini baştan sona simüle edin.
Bu ileri düzey özellikler ve optimizasyonlar, bir lüks restoran rezervasyon sistemini sadece işlevsel olmaktan çıkarıp, rekabetçi bir piyasada öne çıkmasını sağlayan, kullanıcılar ve işletmeler için vazgeçilmez bir araç haline getirecektir. Next.js ve Prisma'nın modüler yapısı, bu özelliklerin kademeli olarak entegre edilmesine olanak tanır.
🎯 Sonuç: Geleceğin Lüks Rezervasyon Deneyimi Avcunuzda
Bu kapsamlı makale boyunca, modern web geliştirme dünyasının iki güçlü aktörü olan Next.js ve Prisma'yı kullanarak lüks bir restoran rezervasyon sistemini sıfırdan nasıl inşa edebileceğimizi adım adım inceledik. Giriş kısmında karşılaştığımız operasyonel zorluklardan, temel proje kurulumuna, güçlü API rotaları geliştirmekten zarif bir kullanıcı arayüzü tasarlamaya ve en önemlisi, güvenlik ve ölçeklenebilirlik gibi kritik konuları ele almaya kadar birçok önemli başlığı kapsadık. Ayrıca, gerçek zamanlı müsaitlik takibi, güvenli ödeme entegrasyonları ve kapsamlı yönetim panelleri gibi ileri düzey özelliklerle bu sistemin nasıl zenginleştirilebileceğini de gördük.
Geliştirdiğimiz bu sistem, sadece rezervasyon süreçlerini otomatikleştirerek restoranların operasyonel yükünü hafifletmekle kalmayacak, aynı zamanda müşterilere hızlı, sorunsuz ve güvenli bir deneyim sunarak lüks hizmet anlayışını dijital dünyaya taşıyacaktır. Next.js'in performans, SEO ve geliştirici deneyimi konusundaki avantajları ile Prisma'nın tip güvenliği, kolay veritabanı yönetimi ve hızlı prototipleme yetenekleri birleştiğinde, ortaya çıkan sonuç gerçekten etkileyicidir. Bu güçlü kombinasyon, hem küçük butik restoranlardan büyük zincirlere kadar geniş bir yelpazede işletmelerin ihtiyaçlarına cevap verebilecek, hem de gelecekteki büyüme ve ek özellik entegrasyonları için sağlam bir temel oluşturacaktır.
Unutmayın ki teknoloji sürekli gelişiyor. Bu makaledeki bilgiler, size sağlam bir başlangıç noktası sunsa da, en son teknolojileri ve en iyi uygulamaları takip etmek, sisteminizi her zaman güncel ve rekabetçi tutmanın anahtarıdır. Bu yolculukta edindiğiniz bilgilerle, siz de kendi lüks rezervasyon sisteminizi inşa edebilir ve misafirlerinize unutulmaz bir dijital deneyim sunabilirsiniz.
❓ Sıkça Sorulan Sorular (SSS)
-
Next.js ve Prisma ikilisi büyük ölçekli uygulamalar için uygun mu?
Kesinlikle evet. Next.js, SSR, SSG ve Incremental Static Regeneration (ISR) gibi özellikleri sayesinde yüksek trafikli web siteleri için olağanüstü performans ve ölçeklenebilirlik sunar. API Routes ise sunucusuz mimariyle birleştiğinde, talep arttıkça otomatik olarak ölçeklenebilir backend çözümleri sağlar. Prisma ise gelişmiş bağlantı havuzlama, sorgu optimizasyonu ve güçlü migration sistemi ile büyük veritabanlarını etkin bir şekilde yönetebilir. Bu iki teknoloji, birlikte çalışarak lüks rezervasyon sisteminiz için hem frontend hem de backend tarafında güçlü ve ölçeklenebilir bir altyapı oluşturur.
-
Sistemde güvenlik nasıl sağlanır?
Güvenlik, bu tür bir sistemde en önemli faktörlerden biridir. Makalede bahsedildiği gibi, NextAuth.js veya JWT kullanarak güçlü kimlik doğrulama mekanizmaları uygulayabiliriz. Veritabanında hassas verileri (örneğin şifreleri) asla düz metin olarak saklamamalı, bunun yerine bcrypt gibi kütüphanelerle hashlemeliyiz. Tüm API istekleri için sunucu tarafında kapsamlı giriş doğrulama ve yetkilendirme (rol tabanlı erişim kontrolü) yapılmalıdır. Ayrıca, SQL enjeksiyonu gibi yaygın güvenlik açıklarına karşı Prisma gibi ORM'ler doğal koruma sağlar.
-
Mobil uyumluluk için nelere dikkat etmeliyim?
Mobil uyumluluk için duyarlı tasarım (responsive design) şarttır. Tailwind CSS gibi bir utility-first CSS framework'ü kullanarak veya CSS media query'leri ile farklı ekran boyutlarına uygun stiller tanımlayarak başlayabilirsiniz. Kullanıcı arayüzü bileşenlerinin küçük ekranlarda iyi görünmesini ve kolayca etkileşim kurulabilmesini sağlamalısınız. Dokunmatik ekran dostu navigasyon, büyük ve tıklanabilir düğmeler, okunabilir yazı tipleri ve form elemanlarının optimize edilmiş düzeni mobil deneyimi iyileştirir.
-
Rezervasyon sistemini canlıya almak (deploy etmek) için hangi platformları önerirsiniz?
Next.js uygulamaları için Vercel, en popüler ve önerilen dağıtım platformudur. Next.js'in yaratıcıları tarafından geliştirildiği için en iyi performansı ve entegrasyonu sunar. Otomatik dağıtım, sunucusuz fonksiyonlar için optimize edilmiş hosting, CDN ve global edge network gibi özellikler içerir. Veritabanı için ise Vercel'in kendi Postgres çözümü, Supabase veya Railway gibi yönetilen PostgreSQL hizmetleri hızlı ve kolay kurulum sağlar.
-
Gerçek zamanlı masa müsaitliği özelliği nasıl uygulanır?
Gerçek zamanlı masa müsaitliği için WebSockets teknolojisinden faydalanabilirsiniz. Socket.io veya Pusher gibi kütüphaneleri kullanarak istemci ile sunucu arasında çift yönlü, kalıcı bir bağlantı kurabilirsiniz. Bir masa rezerve edildiğinde veya iptal edildiğinde, sunucu bu durumu WebSocket üzerinden bağlı tüm istemcilere (örneğin, diğer müşterilere veya restoran personeline ait panellere) anında bildirir. Bu sayede, kullanıcılar her zaman güncel müsaitlik durumunu görür ve çakışan rezervasyonların önüne geçilmiş olur.
