namespace OpenNest.Data; /// /// Storage backend for saved nests. talks to the /// central nest server; File mode in the desktop app keeps using SaveFileDialog and /// does not go through this interface. /// public interface INestRepository { /// /// All stored nests, newest saved first. This is the full-enumeration contract for /// backup and verification; browsing uses . /// Task> ListAsync(CancellationToken cancellationToken = default); /// One bounded page of nests matching the query, filtered and ordered by the server. Task QueryAsync(NestQuery query, CancellationToken cancellationToken = default); Task GetMetadataAsync(Guid id, CancellationToken cancellationToken = default); /// Downloaded .nest archive bytes, or null when the id does not exist. Task GetFileAsync(Guid id, CancellationToken cancellationToken = default); /// Stores a new nest; returns the server-assigned record. Task UploadAsync( byte[] nestFile, NestRecord record, CancellationToken cancellationToken = default); /// Replaces the archive and metadata of an existing id, keeping the id. Task UpdateFileAsync( Guid id, byte[] nestFile, NestRecord record, CancellationToken cancellationToken = default); /// Replaces metadata only (status, made-by, comments...), leaving the archive. Task UpdateMetadataAsync( Guid id, NestRecord record, CancellationToken cancellationToken = default); Task DeleteAsync(Guid id, CancellationToken cancellationToken = default); /// Reads bounded immutable history; unsupported backends fail closed. Task GetRevisionsAsync(Guid id, int offset = 0, int limit = 100, CancellationToken cancellationToken = default) => throw new NotSupportedException("This repository does not support nest version history."); Task GetRevisionFileAsync(Guid id, int revisionNumber, CancellationToken cancellationToken = default) => throw new NotSupportedException("This repository does not support nest version history."); Task UpdateMetadataAsync(Guid id, NestRecord record, int expectedRevision, CancellationToken cancellationToken = default) => throw new NotSupportedException("This repository does not support guarded metadata edits."); Task GetDeletedMetadataAsync(Guid id, CancellationToken cancellationToken = default) => throw new NotSupportedException("This repository does not support deleted nests."); Task GetDeletedFileAsync(Guid id, CancellationToken cancellationToken = default) => throw new NotSupportedException("This repository does not support deleted nests."); Task QueryDeletedAsync(NestQuery query, CancellationToken cancellationToken = default) => throw new NotSupportedException("This repository does not support deleted nests."); Task GetDeletedRevisionsAsync(Guid id, int offset = 0, int limit = 100, CancellationToken cancellationToken = default) => throw new NotSupportedException("This repository does not support deleted nest history."); Task GetDeletedRevisionFileAsync(Guid id, int revisionNumber, CancellationToken cancellationToken = default) => throw new NotSupportedException("This repository does not support deleted nest history."); Task DeleteAsync(Guid id, int expectedRevision, CancellationToken cancellationToken = default) => throw new NotSupportedException("This repository does not support guarded deletion."); Task RestoreAsync(Guid id, int sourceRevision, int expectedRevision, CancellationToken cancellationToken = default) => throw new NotSupportedException("This repository does not support guarded restoration."); Task RecoverAsync(Guid id, int expectedRevision, CancellationToken cancellationToken = default) => throw new NotSupportedException("This repository does not support guarded recovery."); /// Atomically replaces the current archive only at the expected revision. Task UpdateFileAsync(Guid id, byte[] nestFile, NestRecord record, int expectedRevision, CancellationToken cancellationToken = default) => throw new NotSupportedException("This repository does not support guarded saves. Upgrade the nest server and reload."); }