mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-09-30 10:43:13 +00:00
Stamp WorkOrder.AccountId on all create paths and filter board/list/search/detail by server-derived account claims so scoped callers cannot cross accounts. Co-authored-by: Cursor <cursoragent@cursor.com>
40 lines
1.5 KiB
C#
40 lines
1.5 KiB
C#
using System.Security.Claims;
|
|
|
|
namespace SeaHaven.Services.Interfaces
|
|
{
|
|
/// <summary>
|
|
/// Server-derived work-order account scope (SH-221): claims for authenticated callers,
|
|
/// unique Accounts.Name ↔ Customer for org-wide / unauthenticated creates.
|
|
/// </summary>
|
|
public interface IWorkOrderAccountResolver
|
|
{
|
|
/// <summary>
|
|
/// Account filter for reads. Null = org-wide (skip ApplyAccountScope).
|
|
/// Throws Forbidden when scope is Missing.
|
|
/// </summary>
|
|
int? ResolveAccountFilter(ClaimsPrincipal user);
|
|
|
|
/// <summary>
|
|
/// Authenticated create: claim account_id, or org-wide Customer unique match.
|
|
/// Missing scope → Forbidden. Unresolvable org-wide Customer → AccountUnresolved.
|
|
/// </summary>
|
|
Task<int> ResolveForAuthenticatedCreateAsync(
|
|
ClaimsPrincipal user,
|
|
string? customer,
|
|
CancellationToken cancellationToken = default);
|
|
|
|
/// <summary>
|
|
/// Ingest/webhook/sync create: unique Customer → Accounts.Id or AccountUnresolved.
|
|
/// </summary>
|
|
Task<int> ResolveForUnauthenticatedCreateAsync(
|
|
string? customer,
|
|
CancellationToken cancellationToken = default);
|
|
|
|
/// <summary>
|
|
/// Best-effort Customer lookup (no throw). Null when blank, missing, or ambiguous.
|
|
/// </summary>
|
|
Task<int?> TryResolveFromCustomerAsync(
|
|
string? customer,
|
|
CancellationToken cancellationToken = default);
|
|
}
|
|
}
|