Masadan Sipariş
Gerçek bir restoran için geliştirilmiş, müşterinin telefonundan mutfak yazıcısına kadar uzanan, kendi sunucusunda çalışan bir QR sipariş sistemi.
- Rol
- Tek geliştirici — tasarım, geliştirme ve kurulum
- Yıl
- 2026
- Teknolojiler
- TypeScript, Next.js 16 (App Router), React 19, Tailwind CSS 4, PostgreSQL, Prisma 6, Server-Sent Events, Zod, jose, bcryptjs, sharp, ESC/POS over TCP, Vitest, GitHub Actions
- Bağlantılar
Problem
Bir restoran (Heaven Restaurant, ~25–30 masa), misafirlerin uygulama yüklemeden ya da hesap açmadan kendi telefonlarından sipariş verebilmesini istiyordu. Siparişlerin de üçüncü taraf bir bulut hizmetine bağımlı olmadan, mevcut donanımla mutfağa güvenilir şekilde ulaşması gerekiyordu.
Ne yaptım
İşletmenin kendi ağında çalışan, kendi sunucusunda barındırılan tek bir Next.js uygulaması geliştirdim. Misafirler imzalı bir masa QR kodunu okutuyor, iki dilli (Türkçe/İngilizce) menüye göz atıyor, sipariş veriyor ve siparişin durumunu Server-Sent Events üzerinden canlı takip ediyor; personel ise siparişleri ve masa hesaplarını canlı bir panelden yönetiyor.
Güvenlik modeli başlı başına bir tasarım problemiydi: QR kodları HMAC imzası taşıyor, masa oturumlarının bir süresi ve masa başına bir üst sınırı var, ve bir sipariş denemesi kaydı kötüye kullanımı kayıt altına alıyor.
En zor kısım donanımdı. Onaylanan siparişler bir PostgreSQL “outbox” tablosuna yazılıyor; işletmede çalışan bir köprü ajanı bunları çekip TCP üzerinden ESC/POS mutfak yazıcısına basıyor. Sahiplenme, onay, yeniden deneme ve başarısız teslimat yönetimi sayesinde bir yazıcı sorunu hiçbir fişin sessizce kaybolmasına yol açmıyor.
Sonuç
Uçtan uca eksiksiz bir sistem — QR okutma → sipariş → personel onayı → mutfak çıktısı — tek bir makinede denetimli bir servis olarak çalışacak şekilde tasarlandı. CI (lint, tip kontrolleri, Vitest) QR/oturum doğrulamasını, kimlik doğrulamayı, istek sınırlarını, sipariş idempotency’sini, hesap kesimini ve yazıcı protokolünü kapsıyor.
Küçük bir işletmenin sistemi gerçekten çalıştırıp bakımını yapabilmesi için Redis’ten, barındırılan depolama hizmetlerinden ve harici zamanlayıcılardan bilinçli olarak kaçınıyor.