Files
Explorer-Workbench/src/Explorer.Domain/Entities.cs

230 lines
8.4 KiB
C#

namespace Explorer.Domain;
public sealed class Source
{
public long Id { get; set; }
public required string StableKey { get; set; }
public SourceKind Kind { get; set; }
public required string DisplayName { get; set; }
public string? VolumeGuid { get; set; }
public long? VolumeSerial { get; set; }
public string? Filesystem { get; set; }
public string? Label { get; set; }
public long? CapacityBytes { get; set; }
public string? DeviceInstanceId { get; set; }
public string? LastRootPath { get; set; }
public SourceStatus Status { get; set; } = SourceStatus.Offline;
public DateTimeOffset? LastSeenUtc { get; set; }
public DateTimeOffset? LastIndexedUtc { get; set; }
public long? UsnJournalId { get; set; }
public long? UsnNext { get; set; }
public long ScanGeneration { get; set; }
public string? LastError { get; set; }
public bool IsIndexed => LastIndexedUtc is not null;
}
public sealed class VolumeFingerprint
{
public SourceKind Kind { get; init; }
public string? VolumeGuid { get; init; }
public long? VolumeSerial { get; init; }
public string? Filesystem { get; init; }
public string? Label { get; init; }
public long? CapacityBytes { get; init; }
public long? FreeBytes { get; init; }
public string? DeviceInstanceId { get; init; }
public required string RootPath { get; init; }
public string? DisplayName { get; init; }
}
public readonly record struct VolumeSpace(long? CapacityBytes, long? FreeBytes);
public sealed class IndexEntry
{
public long Id { get; set; }
public long SourceId { get; set; }
public long? ParentId { get; set; }
public required string Name { get; set; }
public required string NameNorm { get; set; }
public string? Extension { get; set; }
public bool IsDirectory { get; set; }
public long SizeBytes { get; set; }
public long AggregateSize { get; set; }
public int ChildFileCount { get; set; }
public int ChildDirCount { get; set; }
public DateTimeOffset? CreatedUtc { get; set; }
public DateTimeOffset? ModifiedUtc { get; set; }
public DateTimeOffset LastSeenUtc { get; set; }
public DateTimeOffset? LastIndexedUtc { get; set; }
public int Attributes { get; set; }
public long? FileId { get; set; }
public long? ParentFileId { get; set; }
public int ReparseTag { get; set; }
public EntryStatus Status { get; set; } = EntryStatus.Present;
public DateTimeOffset? DeletedUtc { get; set; }
public required string PathRel { get; set; }
public byte[]? ContentHash { get; set; }
public HashState HashState { get; set; }
public long ScanGeneration { get; set; }
public long? AllocatedSizeBytes { get; set; }
public CloudAvailability? CloudAvailability { get; set; }
}
public sealed class ExcludeRule
{
public long Id { get; set; }
public string Scope { get; set; } = "global";
public long? SourceId { get; set; }
public ExcludeKind Kind { get; set; }
public required string Pattern { get; set; }
public bool Enabled { get; set; } = true;
}
public sealed class ScanJob
{
public long Id { get; set; }
public long SourceId { get; set; }
public ScanKind Kind { get; set; }
public ScanJobStatus Status { get; set; }
public DateTimeOffset? StartedUtc { get; set; }
public DateTimeOffset? FinishedUtc { get; set; }
public long FilesSeen { get; set; }
public long DirsSeen { get; set; }
public long BytesSeen { get; set; }
public string? ResumePath { get; set; }
public int ErrorCount { get; set; }
public string? LastError { get; set; }
public string? FolderPathRel { get; set; }
}
public sealed class ScanError
{
public long Id { get; set; }
public long JobId { get; set; }
public string? Path { get; set; }
public string? Kind { get; set; }
public string? Message { get; set; }
public DateTimeOffset Utc { get; set; }
}
public sealed class TransferJob
{
public long Id { get; set; }
public TransferOp Op { get; set; }
public required string SourcePath { get; set; }
public string? DestinationPath { get; set; }
public TransferStatus Status { get; set; }
public long? BytesTotal { get; set; }
public long BytesDone { get; set; }
public long FilesDone { get; set; }
public long FilesTotal { get; set; }
public string? CurrentPath { get; set; }
public DateTimeOffset CreatedUtc { get; set; }
public DateTimeOffset? StartedUtc { get; set; }
public string? Error { get; set; }
public int RetryCount { get; set; }
public string? WaitReason { get; set; }
public int SortOrder { get; set; }
public bool Dismissed { get; set; }
public IReadOnlyList<string> AdditionalSources { get; set; } = [];
}
public sealed class FileSystemItem
{
public required string FullPath { get; init; }
public required string Name { get; init; }
public bool IsDirectory { get; init; }
public long SizeBytes { get; init; }
public DateTimeOffset? CreatedUtc { get; init; }
public DateTimeOffset? ModifiedUtc { get; init; }
public int Attributes { get; init; }
public long? FileId { get; init; }
public int ReparseTag { get; init; }
public long? AllocatedSizeBytes { get; init; }
public CloudPresence? Cloud { get; init; }
public LocationInfo Location { get; init; } = LocationInfo.None;
public SizeKnowledge SizeKnowledge { get; init; } = SizeKnowledge.Calculated;
public string? DisplayName { get; init; }
public long? FreeSpaceBytes { get; init; }
public long? CapacityBytes { get; init; }
public bool AvailableToImport { get; init; }
public ItemHydrationFlags Hydration { get; init; } = ItemHydrationFlags.All;
public bool IsReparsePoint => (Attributes & AttributeFlags.ReparsePoint) != 0;
public FileSystemItem Overlay(
long? sizeBytes = null,
DateTimeOffset? createdUtc = null,
DateTimeOffset? modifiedUtc = null,
int? attributes = null,
long? fileId = null,
int? reparseTag = null,
long? allocatedSizeBytes = null,
CloudPresence? cloud = null,
LocationInfo? location = null,
SizeKnowledge? sizeKnowledge = null,
string? displayName = null,
long? freeSpaceBytes = null,
long? capacityBytes = null,
bool? availableToImport = null,
ItemHydrationFlags? hydration = null)
=> new()
{
FullPath = FullPath,
Name = Name,
IsDirectory = IsDirectory,
SizeBytes = sizeBytes ?? SizeBytes,
CreatedUtc = createdUtc ?? CreatedUtc,
ModifiedUtc = modifiedUtc ?? ModifiedUtc,
Attributes = attributes ?? Attributes,
FileId = fileId ?? FileId,
ReparseTag = reparseTag ?? ReparseTag,
AllocatedSizeBytes = allocatedSizeBytes ?? AllocatedSizeBytes,
Cloud = cloud ?? Cloud,
Location = location ?? Location,
SizeKnowledge = sizeKnowledge ?? SizeKnowledge,
DisplayName = displayName ?? DisplayName,
FreeSpaceBytes = freeSpaceBytes ?? FreeSpaceBytes,
CapacityBytes = capacityBytes ?? CapacityBytes,
AvailableToImport = availableToImport ?? AvailableToImport,
Hydration = hydration ?? Hydration
};
}
public sealed record CloudPresence(
string? ProviderId,
CloudAvailability Availability,
long LogicalSizeBytes,
long? AllocatedSizeBytes,
bool MayHydrateOnRead,
string? StatusText = null);
public sealed record ScanProgress
{
public long JobId { get; init; }
public long SourceId { get; init; }
public required string CurrentPath { get; init; }
public long FilesSeen { get; init; }
public long DirsSeen { get; init; }
public long BytesSeen { get; init; }
public int ErrorCount { get; init; }
public ScanJobStatus Status { get; init; }
}
public sealed class FolderListing
{
public required string Path { get; init; }
public bool IsOffline { get; init; }
public IReadOnlyList<FileSystemItem> Items { get; init; } = [];
public string? Error { get; init; }
}
public sealed class FileRelation
{
public long Id { get; set; }
public long LeftEntryId { get; init; }
public long RightEntryId { get; init; }
public FileRelationKind Kind { get; init; }
public FileRelationOrigin Origin { get; init; } = FileRelationOrigin.User;
public DateTimeOffset CreatedUtc { get; init; }
}