shoc-backend/SeaHaven.Services/Implementation/WorkOrderAdvancedSearchService.cs
2026-09-16 21:27:05 -03:00

90 lines
3.3 KiB
C#

using System.Security.Claims;
using SeaHaven.DataServices.Helpers;
using SeaHaven.DataServices.Interfaces;
using SeaHaven.Services.DTOs;
using SeaHaven.Services.Helpers;
using SeaHaven.Services.Interfaces;
namespace SeaHaven.Services.Implementation
{
public class WorkOrderAdvancedSearchService : IWorkOrderAdvancedSearchService
{
private const int DefaultPageSize = 100;
private const int MaxPageSize = 200;
private readonly IWorkOrderAdvancedSearchDataService _searchDataService;
private readonly IWorkOrderAccountResolver _accountResolver;
public WorkOrderAdvancedSearchService(
IWorkOrderAdvancedSearchDataService searchDataService,
IWorkOrderAccountResolver accountResolver)
{
_searchDataService = searchDataService;
_accountResolver = accountResolver;
}
public async Task<PagedResult<WorkOrderBoardRowDto>> SearchAsync(
WorkOrderAdvancedSearchQueryDto query,
ClaimsPrincipal user,
string? currentUserId)
{
var accountId = _accountResolver.ResolveAccountFilter(user);
var page = query.Page < 0 ? 0 : query.Page;
var pageSize = query.PageSize < 1 ? DefaultPageSize : Math.Min(query.PageSize, MaxPageSize);
// Unscheduled-only mode ignores the scheduled-date range entirely;
// the inert wide range keeps the data contract satisfied.
var dateRange = query.UnscheduledOnly
? new WorkOrderSearchDateRange(DateOnly.MinValue, DateOnly.MaxValue)
: WorkOrderSearchDateRangeResolver.Resolve(
query.DatePreset,
query.DateFrom,
query.DateTo);
var sortBy = WorkOrderBoardSortFields.NormalizeOrThrow(query.SortBy);
var dataQuery = new WorkOrderAdvancedSearchQuery(
WorkOrderBoardSearchFilter.NormalizeSearch(query.Search),
dateRange.From,
dateRange.To,
query.UnscheduledOnly,
query.Sites,
query.Regions,
query.Types,
query.Overdue,
query.Dispatchers,
query.Statuses,
query.PmTypes,
query.VendorIds,
query.DocStatuses,
query.Severities,
query.Rescheduled,
query.CarriedOver,
query.AddOn,
query.AvetaOnly,
query.FlagColors,
query.InternalOnly,
query.HasUplift,
query.UpliftStatuses,
query.MyWorkOrders,
currentUserId,
page,
pageSize,
sortBy,
query.SortDir ?? "asc",
accountId);
var result = await _searchDataService.SearchAsync(dataQuery);
var utcNow = DateTime.UtcNow;
return new PagedResult<WorkOrderBoardRowDto>
{
Items = result.Rows.Select(r => WorkOrderBoardService.MapRawRow(r, utcNow)).ToList(),
TotalCount = result.TotalCount,
Page = page,
PageSize = pageSize,
PageBase = 0
};
}
}
}