shoc-backend/SeaHaven.Services/Interfaces/IServicePorts.cs
Arthur Bassi 2ec85d1193 fix(work-orders): harden media upload contract for review blockers
Enforce MIME/extension/magic-byte validation, auth and workOrderVersion concurrency, audit on category changes, and validate-before-store with blob compensate.
2026-08-04 11:08:18 -03:00

50 lines
1.7 KiB
C#

using Microsoft.AspNetCore.Http;
namespace SeaHaven.Services.Interfaces
{
public interface IWorkOrderJobRunStateAccessor
{
WorkOrderJobRunState State { get; }
}
public sealed class WorkOrderJobRunState
{
public DateTime? LastWeekRolledRunUtc { get; set; }
public DateTime? LastPastDueCacheRunUtc { get; set; }
public string? LastWeekRolledError { get; set; }
public string? LastPastDueCacheError { get; set; }
}
public interface IFileStoragePort
{
Task<string> SaveFileAsync(IFormFile file);
/// <summary>
/// Best-effort delete of a previously saved file URL. Returns false when the file
/// cannot be resolved or removed; never throws for missing paths.
/// </summary>
bool TryDelete(string fileUrl);
}
/// <summary>
/// Narrow vendor completion-document storage port. Implemented in the API layer so the
/// service layer can persist/read uploaded vendor documents without owning filesystem paths.
/// Path resolution is shared with the scan worker to avoid duplicate rules.
/// </summary>
public interface IVendorDocumentStoragePort
{
Task SaveAsync(int vendorId, int dispatchId, string storedFileName, Stream content, CancellationToken cancellationToken);
Stream OpenRead(int vendorId, int dispatchId, string storedFileName);
void Delete(int vendorId, int dispatchId, string storedFileName);
}
public interface IDispatchEmailPort
{
Task<bool> SendDispatchEmailAsync(string emailTo, string subject, string htmlBody, string? replyTo);
}
public interface IVendorTokenPort
{
Task<string> GetOrCreateActiveTokenAsync(int vendorId);
}
}