#nullable enable using System.ComponentModel.DataAnnotations; using Asp.Versioning; using Baya.Application.Features.Search.Queries.SearchNurses; using Baya.Application.Models.Common; using Baya.Application.Models.Search; using Baya.WebFramework.Attributes; using Baya.WebFramework.BaseController; using Mediator; using Microsoft.AspNetCore.Mvc; namespace Baya.Web.Api.Controllers.V1; /// /// Public nurse discovery. Pre-auth (families browse before signing in) and covered by the per-IP global /// rate limiter. Reads only searchable (verified + accepting + active) rows via the INurseSearch seam. /// [ApiVersion("1")] [ApiController] [Route("api/v{version:apiVersion}/[controller]")] [Display(Description = "Public nurse search: category + city/district geo, same-gender filter, price range, rating sort")] public sealed class SearchController(ISender sender) : BaseController { [HttpGet("[action]")] [ProducesOkApiResponseType>] public async Task Nurses( [FromQuery(Name = "service_category_id")] long serviceCategoryId, [FromQuery(Name = "city_id")] long cityId, [FromQuery(Name = "district_id")] long? districtId, [FromQuery(Name = "nurse_gender")] string? nurseGender, [FromQuery(Name = "min_price")] long? minPrice, [FromQuery(Name = "max_price")] long? maxPrice, [FromQuery(Name = "price_unit")] string? priceUnit, [FromQuery(Name = "page")] int page, [FromQuery(Name = "page_size")] int pageSize, CancellationToken cancellationToken) => OperationResult(await sender.Send( new SearchNursesQuery( serviceCategoryId, cityId, districtId, nurseGender, minPrice, maxPrice, priceUnit, page <= 0 ? 1 : page, pageSize <= 0 ? Application.Common.Pagination.DefaultPageSize : pageSize), cancellationToken)); }