mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-09-30 20:03:11 +00:00
GET /board/search accepts ids=1,2,3 (positive ints, deduplicated, at most 200). When present the result is exactly those work orders inside the caller's tenant and base scope; date, status, dispatcher, facet and text filters are ignored so none of them can hide a listed work order. Malformed or oversized lists are a 400.
97 lines
3.6 KiB
C#
97 lines
3.6 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 ids = WorkOrderIdSet.ParseOrThrow(query.Ids);
|
|
|
|
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),
|
|
ids);
|
|
|
|
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
|
|
};
|
|
}
|
|
}
|
|
}
|