Carousel Manager
Müşteri sitesindeki carousel gruplarını ve slide item'larını yönetmek için kullanılan tenant modülüdür. Her carousel benzersiz bir code ile tanımlanır; her carousel altında sıralı item listesi bulunur. Item alanları çok dillidir ve görseller Media Manager üzerinden referanslanır.
Base URL: /api/tenant/carousel-manager/carousels
Yetkilendirme: Bearer Token + X-Api-Key
Modül: carousel-manager
Headers:
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
X-Api-Key: customer-api-key
Veri Modeli
Carousel:code,name,isActiveCarouselItem:desktopImageMediaFileId,mobileImageMediaFileId,sortOrder,isActive,publishStartDate,publishEndDate,openInNewTabCarouselItemTranslation:title,subtitle,ctaText,ctaLink,altText
desktopImageMediaFileId ve mobileImageMediaFileId alanları doğrudan URL değil, Media Manager dosya ID'si bekler. Response içinde URL karşılıkları da döner.
POST /
Yeni carousel oluşturur.
Request Body:
{
"code": "home-hero",
"name": "Homepage Hero",
"isActive": true,
"items": [
{
"desktopImageMediaFileId": "11111111-1111-1111-1111-111111111111",
"mobileImageMediaFileId": "22222222-2222-2222-2222-222222222222",
"sortOrder": 1,
"isActive": true,
"publishStartDate": "2026-03-29T00:00:00Z",
"publishEndDate": "2026-04-30T23:59:59Z",
"openInNewTab": false,
"translations": [
{
"languageId": "9cd14a82-1111-1111-1111-111111111111",
"title": "Yeni Sezon Koleksiyonu",
"subtitle": "Kampanyayi kesfet",
"ctaText": "Incele",
"ctaLink": "/kampanyalar/yeni-sezon",
"altText": "Yeni sezon banner gorseli"
}
]
}
]
}
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
code | string | Evet | Tenant içinde benzersiz carousel kodu |
name | string | Evet | Panelde görünecek yönetim adı |
isActive | bool | Hayır | Carousel aktiflik durumu |
items | CreateCarouselItemRequest[] | Hayır | İstenirse ilk item listesi |
CreateCarouselItemRequest
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
desktopImageMediaFileId | Guid? | Koşullu | Desktop görsel ID, mobile ile birlikte en az biri zorunlu |
mobileImageMediaFileId | Guid? | Koşullu | Mobile görsel ID, desktop ile birlikte en az biri zorunlu |
sortOrder | int | Evet | Item sıralaması, aynı carousel içinde benzersiz olmalı |
isActive | bool | Hayır | Item aktiflik durumu |
publishStartDate | DateTime? | Hayır | Yayın başlangıç tarihi |
publishEndDate | DateTime? | Hayır | Yayın bitiş tarihi |
openInNewTab | bool | Hayır | CTA linki yeni sekmede açılsın mı |
translations | CarouselItemTranslationRequest[] | Evet | Dil çevirileri |
CarouselItemTranslationRequest
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
languageId | Guid | Evet | Dil ID |
title | string? | Hayır | Başlık |
subtitle | string? | Hayır | Alt başlık |
ctaText | string? | Hayır | CTA buton metni |
ctaLink | string? | Hayır | Relative veya absolute hedef link |
altText | string? | Hayır | Görsel alt metni |
Response — 201 Created:
{
"success": true,
"data": {
"id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
"code": "home-hero",
"name": "Homepage Hero",
"isActive": true,
"createdAt": "2026-03-29T09:50:00Z",
"updatedAt": null,
"items": [
{
"id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
"desktopImageMediaFileId": "11111111-1111-1111-1111-111111111111",
"desktopImageUrl": "https://cdn.example.com/hero-desktop.webp",
"mobileImageMediaFileId": "22222222-2222-2222-2222-222222222222",
"mobileImageUrl": "https://cdn.example.com/hero-mobile.webp",
"sortOrder": 1,
"isActive": true,
"publishStartDate": "2026-03-29T00:00:00Z",
"publishEndDate": "2026-04-30T23:59:59Z",
"openInNewTab": false,
"translations": [
{
"languageId": "9cd14a82-1111-1111-1111-111111111111",
"languageCode": "tr",
"title": "Yeni Sezon Koleksiyonu",
"subtitle": "Kampanyayi kesfet",
"ctaText": "Incele",
"ctaLink": "/kampanyalar/yeni-sezon",
"altText": "Yeni sezon banner gorseli"
}
]
}
]
}
}
GET /
Carousel kayıtlarını filtreli ve sayfalı listeler.
Query Parametreleri:
| Parametre | Tip | Varsayılan | Açıklama |
|---|---|---|---|
page | int | 1 | Sayfa numarası |
pageSize | int | 10 | Sayfa başına kayıt |
search | string | — | code, name, item title veya subtitle alanlarında arama |
isActive | bool | — | Carousel aktiflik filtresi |
Response — 200 OK:
{
"success": true,
"data": {
"items": [
{
"id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
"code": "home-hero",
"name": "Homepage Hero",
"isActive": true,
"createdAt": "2026-03-29T09:50:00Z",
"itemCount": 2,
"activeItemCount": 2
}
],
"page": 1,
"pageSize": 10,
"totalCount": 1,
"totalPages": 1
}
}
GET /{id}
Carousel detayını tüm item ve çevirileriyle getirir.
Response — 200 OK: POST / ile aynı data yapısını döner.
GET /by-code/{code}
Carousel detayını benzersiz code ile getirir.
Örnek: GET /api/tenant/carousel-manager/carousels/by-code/home-hero
PUT /{id}
Carousel metadata kaydını günceller. Bu endpoint artık item listesini değiştirmez.
Request Body:
{
"code": "home-hero",
"name": "Homepage Hero",
"isActive": true
}
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
code | string | Evet | Benzersiz carousel kodu |
name | string | Evet | Yönetim adı |
isActive | bool | Hayır | Carousel aktiflik durumu |
Sadece 1 item eklemek veya güncellemek için artık carousel'in tüm item listesini tekrar göndermeniz gerekmez. Bunun yerine aşağıdaki item endpoint'leri kullanılır.
POST /{carouselId}/items
Belirli bir carousel'e tek bir item ekler.
Request Body: CreateCarouselItemRequest
Örnek:
{
"desktopImageMediaFileId": "11111111-1111-1111-1111-111111111111",
"mobileImageMediaFileId": "22222222-2222-2222-2222-222222222222",
"sortOrder": 3,
"isActive": true,
"publishStartDate": "2026-03-29T00:00:00Z",
"publishEndDate": "2026-04-30T23:59:59Z",
"openInNewTab": false,
"translations": [
{
"languageId": "9cd14a82-1111-1111-1111-111111111111",
"title": "Yeni kampanya",
"subtitle": "Tek item ekleme ornegi",
"ctaText": "Detay",
"ctaLink": "/kampanya/yeni",
"altText": "Kampanya gorseli"
}
]
}
Response — 201 Created: tek bir CarouselItemResponse döner.
GET /{carouselId}/items/{itemId}
Belirli bir carousel item kaydını getirir.
Response — 200 OK: tek bir CarouselItemResponse döner.
PUT /{carouselId}/items/{itemId}
Belirli bir item kaydını günceller. Bu endpoint ilgili item için full replace mantığıyla çalışır; gönderilmeyen translation kayıtları soft delete ile kaldırılır.
Request Body: CreateCarouselItemRequest ile aynı alanları kullanır.
DELETE /{carouselId}/items/{itemId}
Belirli bir item kaydını ve alt translation kayıtlarını soft delete ile siler.
Response — 204 No Content
DELETE /{id}
Carousel kaydını ve altındaki item/translation kayıtlarını soft delete ile siler.
Response — 204 No Content
Validasyon Kuralları
codebenzersiz olmalıdır.- Her item için en az bir görsel (
desktopImageMediaFileIdveyamobileImageMediaFileId) verilmelidir. - Her item için varsayılan dil çevirisi zorunludur.
- Aynı carousel içinde
sortOrderdeğerleri çakışamaz. publishStartDate,publishEndDatedeğerinden büyük olamaz.ctaLinkrelative (/kampanya), anchor (#section),mailto:,tel:veya absolute URL olabilir.
Olası Hatalar
| Kod | Durum |
|---|---|
401 | Token eksik veya geçersiz |
403 | Tenant kullanıcısı yetkisi yok veya carousel-manager modül erişimi yok |
404 | Carousel kaydı bulunamadı |
409 | code çakışması |
400 | Geçersiz body, language, link veya medya referansı |