mirror of
https://gitlab.com/nkming2/nc-photos.git
synced 2025-02-02 06:46:22 +01:00
Support copying remote file
This commit is contained in:
parent
5b6467d299
commit
e300f043bb
2 changed files with 85 additions and 0 deletions
|
@ -335,5 +335,23 @@ class _Files {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A file or folder can be copied by sending a COPY request to the file or
|
||||||
|
/// folder and specifying the [destinationUrl] as full url
|
||||||
|
Future<Response> copy({
|
||||||
|
@required String path,
|
||||||
|
@required String destinationUrl,
|
||||||
|
bool overwrite,
|
||||||
|
}) async {
|
||||||
|
try {
|
||||||
|
return await _api.request("COPY", path, header: {
|
||||||
|
"Destination": destinationUrl,
|
||||||
|
if (overwrite != null) "Overwrite": overwrite ? "T" : "F",
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
_log.severe("[copy] Failed while delete", e);
|
||||||
|
rethrow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static final _log = Logger("api.api._Files");
|
static final _log = Logger("api.api._Files");
|
||||||
}
|
}
|
||||||
|
|
|
@ -374,6 +374,20 @@ class FileRepo {
|
||||||
Future<void> updateMetadata(Account account, File file, Metadata metadata) =>
|
Future<void> updateMetadata(Account account, File file, Metadata metadata) =>
|
||||||
this.dataSrc.updateMetadata(account, file, metadata);
|
this.dataSrc.updateMetadata(account, file, metadata);
|
||||||
|
|
||||||
|
/// See [FileDataSource.copy]
|
||||||
|
Future<void> copy(
|
||||||
|
Account account,
|
||||||
|
File f,
|
||||||
|
String destination, {
|
||||||
|
bool shouldOverwrite,
|
||||||
|
}) =>
|
||||||
|
this.dataSrc.copy(
|
||||||
|
account,
|
||||||
|
f,
|
||||||
|
destination,
|
||||||
|
shouldOverwrite: shouldOverwrite,
|
||||||
|
);
|
||||||
|
|
||||||
final FileDataSource dataSrc;
|
final FileDataSource dataSrc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -395,6 +409,17 @@ abstract class FileDataSource {
|
||||||
/// This will completely replace the metadata of the file [f]. Partial update
|
/// This will completely replace the metadata of the file [f]. Partial update
|
||||||
/// is not supported
|
/// is not supported
|
||||||
Future<void> updateMetadata(Account account, File f, Metadata metadata);
|
Future<void> updateMetadata(Account account, File f, Metadata metadata);
|
||||||
|
|
||||||
|
/// Copy [f] to [destination]
|
||||||
|
///
|
||||||
|
/// [destination] should be a relative WebDAV path like
|
||||||
|
/// remote.php/dav/files/admin/new/location
|
||||||
|
Future<void> copy(
|
||||||
|
Account account,
|
||||||
|
File f,
|
||||||
|
String destination, {
|
||||||
|
bool shouldOverwrite,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
class FileWebdavDataSource implements FileDataSource {
|
class FileWebdavDataSource implements FileDataSource {
|
||||||
|
@ -509,6 +534,27 @@ class FileWebdavDataSource implements FileDataSource {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
copy(
|
||||||
|
Account account,
|
||||||
|
File f,
|
||||||
|
String destination, {
|
||||||
|
bool shouldOverwrite,
|
||||||
|
}) async {
|
||||||
|
_log.info("[copy] ${f.path} to $destination");
|
||||||
|
final response = await Api(account).files().copy(
|
||||||
|
path: f.path,
|
||||||
|
destinationUrl: "${account.url}/$destination",
|
||||||
|
overwrite: shouldOverwrite,
|
||||||
|
);
|
||||||
|
if (!response.isGood) {
|
||||||
|
_log.severe("[copy] Failed requesting sever: $response");
|
||||||
|
throw ApiException(
|
||||||
|
response: response,
|
||||||
|
message: "Failed communicating with server: ${response.statusCode}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static final _log = Logger("entity.file.FileWebdavDataSource");
|
static final _log = Logger("entity.file.FileWebdavDataSource");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -574,6 +620,16 @@ class FileAppDbDataSource implements FileDataSource {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
copy(
|
||||||
|
Account account,
|
||||||
|
File f,
|
||||||
|
String destination, {
|
||||||
|
bool shouldOverwrite,
|
||||||
|
}) async {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
|
||||||
Future<List<File>> _doList(ObjectStore store, Account account, File f) async {
|
Future<List<File>> _doList(ObjectStore store, Account account, File f) async {
|
||||||
final index = store.index(AppDbFileEntry.indexName);
|
final index = store.index(AppDbFileEntry.indexName);
|
||||||
final path = AppDbFileEntry.toPath(account, f);
|
final path = AppDbFileEntry.toPath(account, f);
|
||||||
|
@ -676,6 +732,17 @@ class FileCachedDataSource implements FileDataSource {
|
||||||
.then((_) => _appDbSrc.updateMetadata(account, f, metadata));
|
.then((_) => _appDbSrc.updateMetadata(account, f, metadata));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
copy(
|
||||||
|
Account account,
|
||||||
|
File f,
|
||||||
|
String destination, {
|
||||||
|
bool shouldOverwrite,
|
||||||
|
}) async {
|
||||||
|
await _remoteSrc.copy(account, f, destination,
|
||||||
|
shouldOverwrite: shouldOverwrite);
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> _cacheResult(Account account, File f, List<File> result) {
|
Future<void> _cacheResult(Account account, File f, List<File> result) {
|
||||||
return AppDb.use((db) async {
|
return AppDb.use((db) async {
|
||||||
final transaction = db.transaction(AppDb.fileStoreName, idbModeReadWrite);
|
final transaction = db.transaction(AppDb.fileStoreName, idbModeReadWrite);
|
||||||
|
|
Loading…
Reference in a new issue