import 'share_model.dart'; /// 文件模型 class FileModel { final int type; // 0:文件, 1:文件夹 final String id; final String name; final DateTime createdAt; final DateTime updatedAt; final int size; final String path; final Map? metadata; final String? permission; final String? primaryEntity; final String? capability; final bool? owned; FileModel({ required this.type, required this.id, required this.name, required this.createdAt, required this.updatedAt, required this.size, required this.path, this.metadata, this.permission, this.primaryEntity, this.capability, this.owned, }); factory FileModel.fromJson(Map json) { return FileModel( type: json['type'] as int, id: json['id'] as String, name: json['name'] as String, createdAt: DateTime.parse(json['created_at'] as String), updatedAt: DateTime.parse(json['updated_at'] as String), size: (json['size'] as num?)?.toInt() ?? 0, path: json['path'] as String, metadata: json['metadata'] as Map?, permission: json['permission'] as String?, primaryEntity: json['primary_entity'] as String?, capability: json['capability'] as String?, owned: json['owned'] as bool?, ); } Map toJson() { return { 'type': type, 'id': id, 'name': name, 'created_at': createdAt.toIso8601String(), 'updated_at': updatedAt.toIso8601String(), 'size': size, 'path': path, 'metadata': metadata, 'permission': permission, 'primary_entity': primaryEntity, 'capability': capability, 'owned': owned, }; } bool get isFile => type == 0; bool get isFolder => type == 1; FileModel copyWith({ int? type, String? id, String? name, DateTime? createdAt, DateTime? updatedAt, int? size, String? path, Map? metadata, String? permission, String? primaryEntity, String? capability, bool? owned, }) { return FileModel( type: type ?? this.type, id: id ?? this.id, name: name ?? this.name, createdAt: createdAt ?? this.createdAt, updatedAt: updatedAt ?? this.updatedAt, size: size ?? this.size, path: path ?? this.path, metadata: metadata ?? this.metadata, permission: permission ?? this.permission, primaryEntity: primaryEntity ?? this.primaryEntity, capability: capability ?? this.capability, owned: owned ?? this.owned, ); } /// 获取相对于 cloudreve://my 的路径 /// 例如: cloudreve://my/Games -> /Games /// cloudreve://my/sub/folder -> /sub/folder String get relativePath { if (!path.startsWith('cloudreve://my')) { // 如果不是 cloudreve://my 开头,返回空 return '/'; } final prefix = 'cloudreve://my'; final relative = path.substring(prefix.length); return relative.isEmpty ? '/' : relative; } } /// 文件夹摘要模型 class FolderSummaryModel { final int size; final int files; final int folders; final bool completed; final DateTime calculatedAt; FolderSummaryModel({ required this.size, required this.files, required this.folders, required this.completed, required this.calculatedAt, }); factory FolderSummaryModel.fromJson(Map json) { return FolderSummaryModel( size: (json['size'] as num?)?.toInt() ?? 0, files: (json['files'] as num?)?.toInt() ?? 0, folders: (json['folders'] as num?)?.toInt() ?? 0, completed: json['completed'] as bool, calculatedAt: DateTime.parse(json['calculated_at'] as String), ); } Map toJson() { return { 'size': size, 'files': files, 'folders': folders, 'completed': completed, 'calculated_at': calculatedAt.toIso8601String(), }; } } /// 扩展信息模型 class ExtendedInfoModel { final StoragePolicyModel? storagePolicy; final int? storageUsed; final List? shares; final List? entities; final List? directLinks; ExtendedInfoModel({ this.storagePolicy, this.storageUsed, this.shares, this.entities, this.directLinks, }); factory ExtendedInfoModel.fromJson(Map json) { return ExtendedInfoModel( storagePolicy: json['storage_policy'] is Map ? StoragePolicyModel.fromJson(json['storage_policy'] as Map) : null, storageUsed: (json['storage_used'] as num?)?.toInt(), shares: json['shares'] != null ? (json['shares'] as List) .map((e) => ShareModel.fromJson(e as Map)) .toList() : null, entities: json['entities'] != null ? (json['entities'] as List) .map((e) => EntityModel.fromJson(e as Map)) .toList() : null, directLinks: json['direct_links'] != null ? (json['direct_links'] as List) .map((e) => DirectLinkModel.fromJson(e as Map)) .toList() : null, ); } Map toJson() { return { 'storage_policy': storagePolicy?.toJson(), 'storage_used': storageUsed, 'shares': shares?.map((e) => e.toJson()).toList(), 'entities': entities?.map((e) => e.toJson()).toList(), 'direct_links': directLinks?.map((e) => e.toJson()).toList(), }; } } /// 存储策略模型 class StoragePolicyModel { final String id; final String name; final String type; final int? maxSize; StoragePolicyModel({ required this.id, required this.name, required this.type, this.maxSize, }); factory StoragePolicyModel.fromJson(Map json) { return StoragePolicyModel( id: json['id'] as String, name: json['name'] as String, type: json['type'] as String, maxSize: (json['max_size'] as num?)?.toInt(), ); } Map toJson() { return { 'id': id, 'name': name, 'type': type, 'max_size': maxSize, }; } } /// 实体创建者模型 class EntityCreatedByModel { final String id; final String nickname; final String? avatar; final DateTime createdAt; EntityCreatedByModel({ required this.id, required this.nickname, this.avatar, required this.createdAt, }); factory EntityCreatedByModel.fromJson(Map json) { return EntityCreatedByModel( id: json['id'] as String, nickname: json['nickname'] as String, avatar: json['avatar'] as String?, createdAt: DateTime.parse(json['created_at'] as String), ); } Map toJson() { return { 'id': id, 'nickname': nickname, 'avatar': avatar, 'created_at': createdAt.toIso8601String(), }; } } /// 实体模型(文件版本/Blob) class EntityModel { final String id; final int type; final DateTime createdAt; final int size; final String? encryptedWith; final StoragePolicyModel? storagePolicy; final EntityCreatedByModel? createdBy; EntityModel({ required this.id, required this.type, required this.createdAt, required this.size, this.encryptedWith, this.storagePolicy, this.createdBy, }); factory EntityModel.fromJson(Map json) { return EntityModel( id: json['id'] as String, type: json['type'] as int, createdAt: DateTime.parse(json['created_at'] as String), size: (json['size'] as num?)?.toInt() ?? 0, encryptedWith: json['encrypted_with'] as String?, storagePolicy: json['storage_policy'] is Map ? StoragePolicyModel.fromJson(json['storage_policy'] as Map) : null, createdBy: json['created_by'] is Map ? EntityCreatedByModel.fromJson(json['created_by'] as Map) : null, ); } Map toJson() { return { 'id': id, 'type': type, 'created_at': createdAt.toIso8601String(), 'size': size, 'encrypted_with': encryptedWith, 'storage_policy': storagePolicy?.toJson(), 'created_by': createdBy?.toJson(), }; } } /// 直链模型 class DirectLinkModel { final String id; final DateTime createdAt; final String url; final int downloaded; DirectLinkModel({ required this.id, required this.createdAt, required this.url, required this.downloaded, }); factory DirectLinkModel.fromJson(Map json) { return DirectLinkModel( id: json['id'] as String, createdAt: DateTime.parse(json['created_at'] as String), url: json['url'] as String, downloaded: (json['downloaded'] as num?)?.toInt() ?? 0, ); } Map toJson() { return { 'id': id, 'created_at': createdAt.toIso8601String(), 'url': url, 'downloaded': downloaded, }; } } /// 文件详情模型(/file/info 接口返回) class FileInfoModel { final FileModel file; final FolderSummaryModel? folderSummary; final ExtendedInfoModel? extendedInfo; FileInfoModel({ required this.file, this.folderSummary, this.extendedInfo, }); factory FileInfoModel.fromJson(Map json) { return FileInfoModel( file: FileModel.fromJson(json), folderSummary: json['folder_summary'] is Map ? FolderSummaryModel.fromJson(json['folder_summary'] as Map) : null, extendedInfo: json['extended_info'] is Map ? ExtendedInfoModel.fromJson(json['extended_info'] as Map) : null, ); } }