using WebDrop.FileProtocol;
using WebDrop.Sync;
namespace WebDrop.FileApi;
/// 配置节 "FileApi"。环境变量形式:FileApi__DataDir、FileApi__Secret ……
public sealed class FileApiOptions
{
public string DataDir { get; set; } = "files-data";
/// 和主后端共用的密钥(主后端的 WebDrop:Files:Secret),至少 32 个字符
public string Secret { get; set; } = "";
/// 前端所在的源;浏览器直接把文件传给这里,必须列出,否则不发 CORS 头
public string[] CorsOrigins { get; set; } = [];
/// 创建频道时可以分配的文件空间档位(字节);不配置用内置的 1/5/10/50/100 GiB。默认值不放在数组里:配置绑定会把数组按下标合并进默认值
public long[] QuotaChoices { get; set; } = [];
/// 创建频道时不选择的默认文件空间,必须是档位之一
public long DefaultQuota { get; set; } = 10L << 30;
public FileDomainOptions Domain => new(EffectiveChoices, DefaultQuota);
public long[] EffectiveChoices => QuotaChoices.Length == 0 ? FileDomainOptions.Fallback.QuotaChoices : QuotaChoices.Where(n => n > 0).Distinct().Order().ToArray();
/// 上传了字节、却一直没有被确认(没有登记到主后端)的条目,过多少小时删掉。默认 24
public int PendingRetentionHours { get; set; } = 24;
/// 磁盘上最多存这么多字节,0 表示不限。满了拒绝新的帧(507),已有的不受影响
public long MaxStoreBytes { get; set; }
/// 一帧的最大字节数:26 字节头部 + 最大负载(1 MiB + 16 字节标签)
public int MaxFrameBytes { get; set; } = 26 + (1 << 20) + 16;
/// 每天把新增的文件帧同步到外部存储(S3 协议)。已删除的内容在备份里再留 RetainDays 天
public DailyBackupOptions Backup { get; set; } = new() { Time = "04:30" };
}