namespace TaxBaik.Application.Services; using System.Text.RegularExpressions; using TaxBaik.Domain.Entities; using TaxBaik.Domain.Interfaces; public class BlogService(IBlogPostRepository repository) { public async Task GetBySlugAsync(string slug, CancellationToken ct = default) => await repository.GetBySlugAsync(slug, ct); public async Task<(IEnumerable, int)> GetPublishedPagedAsync( int page, int pageSize, int? categoryId = null, CancellationToken ct = default) => await repository.GetPublishedPagedAsync(page, pageSize, categoryId, ct); public async Task> GetAllForAdminAsync(CancellationToken ct = default) => await repository.GetAllForAdminAsync(ct); public async Task CreateAsync(BlogPost post, CancellationToken ct = default) { post.Slug = GenerateSlug(post.Title); post.IsPublished = false; return await repository.CreateAsync(post, ct); } public async Task UpdateAsync(BlogPost post, CancellationToken ct = default) => await repository.UpdateAsync(post, ct); public async Task DeleteAsync(int id, CancellationToken ct = default) => await repository.DeleteAsync(id, ct); public async Task IncrementViewCountAsync(int id, CancellationToken ct = default) => await repository.IncrementViewCountAsync(id, ct); private static string GenerateSlug(string title) { var slug = Regex.Replace(title.ToLowerInvariant(), @"[^\w\s-]", ""); slug = Regex.Replace(slug, @"\s+", "-"); slug = Regex.Replace(slug, @"-+", "-").Trim('-'); return slug.Length > 100 ? slug[..100] : slug; } }