using Netina.Domain.Entities.Blogs; namespace Netina.Api.Controllers; public class BlogCategoryController : ICarterModule { public virtual void AddRoutes(IEndpointRouteBuilder app) { var group = app.NewVersionedApi("BlogCategory") .MapGroup($"api/blog/category"); group.MapGet("", GetAllAsync) .WithDisplayName("Get BlogCategories") .HasApiVersion(1.0); group.MapGet("{id}", GetAsync) .WithDisplayName("Get BlogCategory") .HasApiVersion(1.0); group.MapPost("", Post) .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission,ApplicationPermission.ManageBlogs)) .WithDisplayName("Create BlogCategory") .HasApiVersion(1.0); group.MapPut("", Put) .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageBlogs)) .WithDisplayName("Update BlogCategory") .HasApiVersion(1.0); group.MapDelete("{id}", Delete) .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageBlogs)) .WithDisplayName("Delete BlogCategory") .HasApiVersion(1.0); } // GET:Get All Entity public async Task GetAllAsync([FromQuery] int? page,[FromQuery]string? categoryName , IRepositoryWrapper repositoryWrapper, CancellationToken cancellationToken) { var query = repositoryWrapper.SetRepository() .TableNoTracking; if (categoryName != null) query = query.Where(q => q.Name.Trim().ToUpper().Contains(categoryName.Trim().ToUpper())); if (page != null) { return TypedResults.Ok(await query.OrderByDescending(b => b.Name).Skip(page.Value * 10).Take(10) .Select(BlogCategoryMapper.ProjectToSDto) .ToListAsync(cancellationToken)); } else { return TypedResults.Ok(await query.OrderByDescending(b => b.Name) .Select(BlogCategoryMapper.ProjectToSDto) .ToListAsync(cancellationToken)); } } // GET:Get An Entity By Id public async Task GetAsync(Guid id, IRepositoryWrapper repositoryWrapper, CancellationToken cancellationToken) => TypedResults.Ok(await repositoryWrapper.SetRepository().TableNoTracking .Where(b => b.Id == id) .Select(BlogCategoryMapper.ProjectToLDto) .FirstOrDefaultAsync(cancellationToken)); // POST:Create Entity public async Task Post([FromBody] BlogCategorySDto dto, IRepositoryWrapper repositoryWrapper, CancellationToken cancellationToken) { var ent = BlogCategory.Create(dto.Name,dto.Description,dto.IsMain); if (dto.ParentId != default) ent.SetParent(dto.ParentId); repositoryWrapper.SetRepository().Add(ent); await repositoryWrapper.SaveChangesAsync(cancellationToken); return TypedResults.Ok(); } // PUT:Update Entity public async Task Put([FromBody] BlogCategorySDto dto, IRepositoryWrapper repositoryWrapper, CancellationToken cancellationToken) { var ent = await repositoryWrapper.SetRepository().TableNoTracking .FirstOrDefaultAsync(b => b.Id == dto.Id, cancellationToken); if (ent == null) throw new AppException("Blog not found"); var newEnt = BlogCategory.Create(dto.Name, dto.Description,dto.IsMain); if (dto.ParentId != default) ent.SetParent(dto.ParentId); newEnt.Id = ent.Id; newEnt.CreatedAt = ent.CreatedAt; newEnt.CreatedBy = ent.CreatedBy; repositoryWrapper.SetRepository().Update(newEnt); await repositoryWrapper.SaveChangesAsync(cancellationToken); return TypedResults.Ok(); } // DELETE:Delete Entity public async Task Delete(Guid id, IRepositoryWrapper repositoryWrapper, CancellationToken cancellationToken) { var ent = await repositoryWrapper.SetRepository().TableNoTracking .FirstOrDefaultAsync(b => b.Id == id, cancellationToken); if (ent == null) throw new AppException("Blog not found"); repositoryWrapper.SetRepository().Delete(ent); await repositoryWrapper.SaveChangesAsync(cancellationToken); return TypedResults.Ok(); } }