mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-09-30 04:53:11 +00:00
The strict date range made undated open work orders disappear for every client that predates the includeDateless flag. The frontend on main sends the all-weeks window (2000-01-01..2099-12-31) for "no range", the 1970-01-01..2099-12-31 window for the pinned Unassigned queue, and no date input at all for the WO# duplicate lookup. None of those send the flag, so deploying this backend before the frontend would have dropped undated WOs from all three flows. includeDateless is now optional. An explicit value still wins. When it is omitted, a request with no date input or with an all-weeks Custom window keeps its open undated rows, as before SH-391. Any other range stays strict. The backend and frontend can therefore deploy in either order.
95 lines
3.5 KiB
C#
95 lines
3.5 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,
|
|
WorkOrderSearchDateRangeResolver.ResolveIncludeDateless(
|
|
query.IncludeDateless,
|
|
query.DatePreset,
|
|
query.DateFrom,
|
|
query.DateTo));
|
|
|
|
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
|
|
};
|
|
}
|
|
}
|
|
}
|