using AutoMapper; using FastEndpoints; using MetaCourse.Api.Data; using MetaCourse.Api.DTOs.Courses; using Microsoft.EntityFrameworkCore; namespace MetaCourse.Api.Endpoints.Courses; public class GetCoursesRequest { public string? Search { get; set; } } public class GetCoursesEndpoint(AppDbContext db, AutoMapper.IMapper mapper) : Endpoint> { public override void Configure() { Get("api/courses"); AllowAnonymous(); Summary(s => { s.Summary = "Liste les cours publiƩs"; s.Description = "Retourne tous les cours avec le statut PubliƩ, avec recherche optionnelle."; }); } public override async Task HandleAsync(GetCoursesRequest req, CancellationToken ct) { var query = db.Courses .AsNoTracking() .Include(c => c.Creator) .Include(c => c.Topics) .Where(c => c.Status == Entities.CourseStatus.Published); if (!string.IsNullOrWhiteSpace(req.Search)) { var search = req.Search.ToLower(); query = query.Where(c => c.Title.ToLower().Contains(search) || c.Description.ToLower().Contains(search) || c.Creator.Name.ToLower().Contains(search)); } var courses = await query.OrderByDescending(c => c.CreatedAt).ToListAsync(ct); await SendOkAsync(mapper.Map>(courses), ct); } }