using System; using System.Threading; using System.Threading.Tasks; using LaDOSE.Entity; namespace LaDOSE.Business.Interface { public interface ISheetsExportService { /// What the export panel needs to render. Never includes a secret. SheetsConfig GetConfig(); /// /// Resolves the target spreadsheet from configuration, validates the tables, sanitises /// and de-duplicates the tab titles, then hands off to the configured /// . Throws for anything /// the caller can act on. /// Task ExportAsync(SheetExportRequest request, CancellationToken ct = default); } /// /// A failure with a message meant for the person who pressed the button, plus the status /// the API should answer with. The API has no exception middleware, so anything that escapes /// reaches the browser as an HTML developer page the client can only report as a bare status /// — hence every foreseeable failure is raised as one of these instead. /// public class SheetsExportException : Exception { public SheetsExportException(int statusCode, string message) : base(message) { StatusCode = statusCode; } public SheetsExportException(int statusCode, string message, Exception inner) : base(message, inner) { StatusCode = statusCode; } public int StatusCode { get; } } }