# Resim API Endpoint'leri ve Dosya Yönetimi Dokümantasyonu

Bu belge, Django projenize eklenen yeni resim API endpoint'lerini ve ilgili dosya yönetimi özelliklerini açıklamaktadır.

---

## 1. Resim Yükleme ve Optimizasyon API Endpoint'i

Bu endpoint, resimleri yüklemenizi, boyutlandırmanızı, formatlarını değiştirmenizi ve kalitelerini ayarlamanızı sağlar. Yüklenen resimler en-boy oranı korunarak hedef boyutlara sığdırılır ve boş kalan alanlar doldurulur.

*   **Endpoint:** `POST /api/v1/images/upload/`
*   **İşlevsellik:**
    *   Kullanıcı tarafından gönderilen bir resim dosyasını alır.
    *   Belirtilen genişlik, yükseklik, kalite ve format parametrelerine göre resmi işler.
    *   Resmi, en-boy oranını bozmadan hedef `width` x `height` boyutlarına sığdırır. Kenarlarda kalan boşlukları (padding), PNG için şeffaf, diğer formatlar için (JPG, WebP, AVIF) beyaz renkle doldurur.
    *   İşlenmiş resmi Django'nun `MEDIA_ROOT` ayarında belirtilen dizin altındaki `processed/` klasörüne kaydeder.
    *   Resmin meta verilerini (`title`, `width`, `height`, `format`, `size`, `quality`, `slug`, `path` vb.) `PostImages` modeline kaydeder.
*   **İstek Metodu:** `POST`
*   **`Content-Type`:** `multipart/form-data`
*   **Parametreler (Form Data):**
    *   `image`: (`File`) Yüklenecek resim dosyası.
    *   `title`: (`string`, max_length=254) Resim için bir başlık.
    *   `width`: (`integer`) İşlenmiş resmin hedef genişliği (piksel).
    *   `height`: (`integer`) İşlenmiş resmin hedef yüksekliği (piksel).
    *   `quality`: (`integer`, 1-100, varsayılan: 85) JPG ve WebP gibi kayıplı formatlar için resmin sıkıştırma kalitesi. Daha düşük değerler dosya boyutunu azaltır.
    *   `format`: (`string`, seçimler: `png`, `webp`, `jpg`, `avif`, varsayılan: `webp`) Çıktı resminin dosya formatı. `webp` ve `avif` genellikle daha iyi sıkıştırma sunar.
*   **Başarılı Yanıt (HTTP 201 Created):**
    ```json
    {
        "id": 1,
        "title": "Yuklenen Resim Basligi",
        "path": "processed/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.webp",
        "processed_path": "original_image_name.jpg",
        "original_filename": "original_image_name.jpg",
        "format": "webp",
        "width": 800,
        "height": 600,
        "size": 123456,
        "quality": 85,
        "slug": "yuklenen-resim-basligi",
        "created_at": "2023-10-27T10:00:00Z",
        "updated_at": "2023-10-27T10:00:00Z",
        "is_active": true,
        "is_front": true
    }
    ```
*   **Değiştirilen/Oluşturulan Dosyalar:**
    *   `image/serializers.py`: `PostImageCreateSerializer` ve `PostImagesSerializer` tanımlandı.
    *   `image/views.py`: `ImageUploadView` eklendi.
    *   `image/urls.py`: `upload/` URL deseni eklendi.
    *   `core/urls.py`: `image` uygulaması URL'leri `/api/v1/images/` altında dahil edildi.

---

## 2. Resim İndirme API Endpoint'i

Bu endpoint, önceden işlenmiş bir resmi `slug`'ını kullanarak doğrudan indirmek için kullanılır.

*   **Endpoint:** `GET /api/v1/images/<slug>/download/`
    *   `<slug>`: İndirilmek istenen resmin benzersiz slug değeri. Bu değer, yükleme endpoint'inden dönen yanıtta bulunur.
*   **İşlevsellik:**
    *   URL'den alınan `slug` değerine sahip `PostImages` nesnesini veritabanından bulur.
    *   İlişkili resim dosyasını sunucudan okur.
    *   Resmi, tarayıcının indirme işlemi başlatmasını sağlayacak uygun HTTP başlıkları (`Content-Type`, `Content-Disposition`) ile bir `FileResponse` olarak gönderir.
*   **İstek Metodu:** `GET`
*   **Başarılı Yanıt (HTTP 200 OK):** Doğrudan resim dosyası içeriği döner, tarayıcı tarafından indirme işlemi başlatılır.
*   **Hata Durumları (HTTP 404 Not Found):** Belirtilen `slug` ile resim bulunamazsa veya dosya sunucuda yoksa.
*   **Değiştirilen Dosyalar:**
    *   `image/views.py`: `ImageDownloadView` eklendi.
    *   `image/urls.py`: `<slug>/download/` URL deseni eklendi.

---

## 3. Model Silindiğinde Otomatik Dosya Silme

Bu özellik, `PostImages` modelinden bir kayıt silindiğinde, ilişkili resim dosyasının sunucudan otomatik olarak kaldırılmasını sağlar.

*   **İşlevsellik:**
    *   Django admin panelinden veya kod aracılığıyla bir `PostImages` nesnesi silindiğinde, Django'nun `post_delete` sinyali yakalanır.
    *   Bu sinyal tetiklendiğinde, silinen `PostImages` nesnesinin `path` alanında belirtilen dosya yolu kullanılarak `MEDIA_ROOT` dizinindeki ilgili resim dosyası silinir.
*   **Mekanizma:** Django Sinyalleri
*   **Değiştirilen/Oluşturulan Dosyalar:**
    *   `image/signals.py` (Yeni dosya): `post_delete` alıcısı (`delete_image_file` fonksiyonu) tanımlandı.
    *   `image/apps.py`: Uygulama başlatıldığında `image.signals`'i içe aktarmak için `ready()` metodu güncellendi.
    *   `core/settings.py`: `INSTALLED_APPS` listesindeki `'image'` girdisi, `'image.apps.ImageConfig'` olarak değiştirilerek sinyal mekanizmasının doğru şekilde çalışması sağlandı.

---

**Not:** Bu değişikliklerin geçerli olması için Django geliştirme sunucunuzu yeniden başlatmanız gerekebilir. Ayrıca, `settings.py` dosyasında `MEDIA_ROOT` ve `MEDIA_URL` ayarlarının doğru yapıldığından emin olun.
