Bu proje, oteller için geliştirilmiş, yüksek performanslı ve güvenli bir medya yönetim sistemidir. Kullanıcıların (otellerin) görsellerini kategorize etmesine, sürükle-bırak ile sıralamasına ve optimize ederek bulutta saklamasına olanak tanır.
- Çok Katmanlı Mimari: Frontend (React) ve Backend (Node.js/Express) olarak ayrılmış yapı.
- Görsel Optimizasyonu: Backend tarafında
sharpkullanılarak tüm görseller otomatik olarak WebP formatına çevrilir, maksimum 2000px genişliğe yeniden boyutlandırılır ve sıkıştırılır (%80 kalite). - Güvenli Depolama (RLS): Supabase Storage ve Database üzerinde Row Level Security (RLS) politikaları ile her otelin verisi tamamen izole edilir.
- Kategori Yönetimi: Görselleri kategorilere ayırma, dinamik filtreleme ve Kategori Kapak Resmi belirleme.
- Gelişmiş Sıralama: Sürükle-bırak ile yapılan sıralamalar kalıcı olarak veritabanına kaydedilir.
- Toplu İşlemler: Çoklu dosya yükleme, toplu silme, kategoriye taşıma ve toplu seçim araçları.
- Performans: Görsel listelerinde Lazy Loading (Tembel Yükleme) zorunlu tutulmuştur.
- Atomic İşlemler: Veritabanı ve Storage işlemleri senkronize çalışır; biri başarısız olursa diğeri geri alınır (Rollback).
- Etiket Sistemi: Görsellere etiket ekleme ve yönetme.
- Gelişmiş Filtreleme: Aynı anda birden fazla kategori seçimi.
- Metadata Analizi: Yüklenen görsellerin boyut ve format bilgilerinin otomatik saklanması.
- Node.js & Express: API sunucusu.
- TypeScript: Tip güvenliği.
- Supabase: PostgreSQL Veritabanı, Auth (Kimlik Doğrulama) ve Storage.
- Sharp: Görsel işleme kütüphanesi.
- React & Vite: Hızlı geliştirme ortamı.
- TypeScript: Tip güvenliği.
- Tailwind CSS: Modern UI tasarımı.
- dnd-kit: Sürükle bırak işlemleri.
Projeyi yerel makinenizde çalıştırmak için aşağıdaki adımları izleyin.
- Node.js (v18+)
- Supabase Hesabı ve Projesi
git clone https://github.com/kullaniciadi/hotel-media-service.git
cd hotel-media-servicecd backend
npm install.env dosyasını oluşturun (.env.example dosyasından kopyalayabilirsiniz):
PORT=3000
SUPABASE_URL=https://your-project.supabase.co
# DİKKAT: RLS Bypass için 'service_role' anahtarı gereklidir.
SUPABASE_SERVICE_ROLE_KEY=eyJh... (Supabase > Settings > API > Service Role Secret)
# Geliştirme Modu İçin Sabit Test ID (Dev Auth Bypass)
# Bu UUID, geliştirme sırasında tüm işlemlerin yapılacağı sanal otel ID'sidir.
TEST_HOTEL_ID=4676d4d3-a6c9-45f7-ac6b-9a720f07eef1Backend'i başlatın:
npm run dev(Sunucu 3000 portunda çalışmaya başlayacaktır. Konsolda "Using TEST_HOTEL_ID" uyarısını görmelisiniz.)
cd ../frontend
npm install.env dosyasını oluşturun:
VITE_API_URL=http://localhost:3000/api
# Geliştirme ortamında Anon Key yeterlidir, backend bypass yapar.
VITE_SUPABASE_ANON_KEY=eyJh... (Supabase > Settings > API > Anon Public)Frontend'i başlatın:
npm run dev(Uygulama http://localhost:5173 adresinde açılacaktır.)
Geliştirme sürecini hızlandırmak için Geliştirme Modunda (Development Mode) özel bir kimlik doğrulama bypass mekanizması bulunur.
- Backend Konfigürasyonu:
NODE_ENV=developmentolduğunda,authMiddlewaregerçek bir JWT token doğrulaması yapmak yerine, isteği otomatik olarakTEST_HOTEL_IDkullanıcısı adına yapılmış gibi kabul eder. - Service Role Kullanımı: Backend, veritabanı ile konuşurken
SUPABASE_SERVICE_ROLE_KEYkullanır. Bu, Supabase'in RLS kurallarını backend tarafında aşarak, geliştiricininTEST_HOTEL_IDadına özgürce okuma/yazma yapabilmesini sağlar. - Frontend Davranışı: Frontend tarafında giriş yapmanıza gerek yoktur. Sistem otomatik olarak "Anonim" anahtar ile istek atar ve Backend bu isteği "Test Kullanıcısı" olarak işler.
SUPABASE_SERVICE_ROLE_KEY ve Auth Bypass mekanizması SADECE geliştirme ortamında (NODE_ENV=development) çalışır. Canlı ortamda (Production) bu mekanizma devre dışı kalır ve gerçek JWT doğrulaması zorunlu hale gelir.
hotel-media-service/
├── backend/ # API Sunucusu
│ ├── config/ # Supabase ayarları
│ ├── controllers/ # İş mantığı (Image, Category)
│ ├── middleware/ # Auth ve Upload kontrolleri
│ ├── routes/ # API rotaları
│ └── index.ts # Giriş noktası
│
└── frontend/ # React Uygulaması
├── src/
│ ├── api/ # Axios istemcisi
│ ├── components/ # Reusable UI (MediaGrid, UploadZone)
│ ├── hooks/ # State yönetimi (useMediaLibrary)
│ ├── services/ # API servisleri
│ └── pages/ # Sayfalar
Bu proje MIT lisansı ile lisanslanmıştır.