Blog Yazıları
Blog yazılarının CRUD işlemleri ve kapak görseli yönetimi.
Base URL: /api/tenant/blog/posts
Yetkilendirme: Bearer Token + X-Api-Key
Modül: Blog modülü müşteriye atanmış olmalıdır.
Headers:
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
X-Api-Key: customer-api-key
POST /
Yeni blog yazısı oluşturur.
Request Body:
{
"status": "Draft",
"publishDate": "2026-04-01T10:00:00Z",
"categoryIds": ["3fa85f64-..."],
"tagIds": ["7ba92e31-..."],
"translations": [
{
"languageId": "9cd14a82-...",
"title": "İlk Blog Yazısı",
"content": "<p>İçerik buraya...</p>",
"slug": "ilk-blog-yazisi",
"metaTitle": "İlk Blog Yazısı | Kompanse",
"metaDescription": "İlk blog yazımız hakkında kısa açıklama."
}
]
}
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
status | string | Evet | Draft veya Published |
publishDate | DateTime? | Hayır | Yayın tarihi |
categoryIds | Guid[] | Hayır | Kategori ID listesi |
tagIds | Guid[] | Hayır | Etiket ID listesi |
translations | BlogPostTranslationRequest[] | Evet | Dil çevirileri |
BlogPostTranslationRequest
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
languageId | Guid | Evet | Dil ID |
title | string | Evet | Başlık |
content | string | Evet | İçerik (HTML) |
slug | string | Evet | URL slug |
metaTitle | string | Hayır | SEO başlığı |
metaDescription | string | Hayır | SEO açıklaması |
Response — 201 Created:
{
"success": true,
"data": {
"id": "3fa85f64-...",
"coverImageUrl": null,
"status": "Draft",
"publishDate": "2026-04-01T10:00:00Z",
"createdAt": "2026-03-27T10:00:00Z",
"updatedAt": null,
"translations": [
{
"languageId": "9cd14a82-...",
"languageCode": "tr",
"title": "İlk Blog Yazısı",
"content": "<p>İçerik buraya...</p>",
"slug": "ilk-blog-yazisi",
"metaTitle": "İlk Blog Yazısı | Kompanse",
"metaDescription": "İlk blog yazımız hakkında kısa açıklama."
}
]
}
}
GET /
Blog yazılarını filtreli ve sayfalanmış olarak listeler.
Query Parametreleri:
| Parametre | Tip | Varsayılan | Açıklama |
|---|---|---|---|
page | int | 1 | Sayfa numarası |
pageSize | int | 10 | Sayfa başına kayıt |
status | string | — | Draft veya Published filtresi |
categoryId | Guid | — | Kategori filtresi |
tagId | Guid | — | Etiket filtresi |
search | string | — | Başlıkta arama |
lang | string | — | Dil kodu filtresi |
Response — 200 OK:
{
"success": true,
"data": {
"items": [
{
"id": "3fa85f64-...",
"coverImageUrl": "https://minio.example.com/covers/image.jpg",
"status": "Published",
"publishDate": "2026-04-01T10:00:00Z",
"createdAt": "2026-03-27T10:00:00Z",
"title": "İlk Blog Yazısı",
"slug": "ilk-blog-yazisi"
}
],
"page": 1,
"pageSize": 10,
"totalCount": 1,
"totalPages": 1
}
}
GET /{id}
Blog yazısı detayını (kategoriler, etiketler, tüm çeviriler) getirir.
Response — 200 OK:
{
"success": true,
"data": {
"id": "3fa85f64-...",
"coverImageUrl": "https://minio.example.com/covers/image.jpg",
"status": "Published",
"publishDate": "2026-04-01T10:00:00Z",
"createdAt": "2026-03-27T10:00:00Z",
"updatedAt": "2026-03-28T14:00:00Z",
"translations": [
{
"languageId": "9cd14a82-...",
"languageCode": "tr",
"title": "İlk Blog Yazısı",
"content": "<p>İçerik...</p>",
"slug": "ilk-blog-yazisi",
"metaTitle": "İlk Blog Yazısı | Kompanse",
"metaDescription": "Açıklama"
}
],
"categories": [
{
"id": "cat-id-...",
"isActive": true,
"createdAt": "2026-03-27T10:00:00Z",
"translations": [
{ "languageId": "...", "languageCode": "tr", "name": "Teknoloji", "slug": "teknoloji" }
]
}
],
"tags": [
{
"id": "tag-id-...",
"isActive": true,
"createdAt": "2026-03-27T10:00:00Z",
"translations": [
{ "languageId": "...", "languageCode": "tr", "name": "CMS", "slug": "cms" }
]
}
]
}
}
PUT /{id}
Blog yazısını günceller.
Request Body: CreateBlogPostRequest ile aynı yapıdadır.
Response — 200 OK: BlogPostResponse objesi döner.
DELETE /{id}
Blog yazısını siler (soft delete).
Response — 204 No Content
Kapak Görseli
POST /{id}/cover
Blog yazısına kapak görseli yükler.
Content-Type: multipart/form-data
| Alan | Tip | Açıklama |
|---|---|---|
file | IFormFile | Görsel dosyası |
Response — 200 OK:
{
"success": true,
"data": {
"coverImageUrl": "https://minio.example.com/covers/post-id/image.jpg"
}
}
DELETE /{id}/cover
Kapak görselini siler.
Response — 204 No Content
Olası Hatalar
| Kod | Durum |
|---|---|
401 | Token eksik veya geçersiz |
403 | Tenant kullanıcısı yetkisi yok veya blog modül erişimi yok |
404 | Blog yazısı bulunamadı |
409 | Slug veya ilişkili veri çakışması |
400 | Geçersiz filtre, body veya dosya yükleme isteği |