Skip to content

Commit 2c765af

Browse files
committed
refactor(nextcloud): separate webdav utils and models from the webdav/client library
Signed-off-by: Nikolas Rimikis <leptopoda@users.noreply.github.com>
1 parent 32c8fed commit 2c765af

File tree

6 files changed

+78
-65
lines changed

6 files changed

+78
-65
lines changed

packages/nextcloud/lib/src/webdav/client.dart

+3-58
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,14 @@ import 'dart:typed_data';
55
import 'package:dynamite_runtime/http_client.dart';
66
import 'package:http/http.dart' as http;
77
import 'package:meta/meta.dart';
8+
import 'package:nextcloud/src/webdav/models.dart';
89
import 'package:nextcloud/src/webdav/path_uri.dart';
910
import 'package:nextcloud/src/webdav/props.dart';
11+
import 'package:nextcloud/src/webdav/utils.dart';
1012
import 'package:nextcloud/src/webdav/webdav.dart';
1113
import 'package:nextcloud/utils.dart';
1214
import 'package:universal_io/io.dart' hide HttpClient;
1315

14-
/// Base path used on the server
15-
final webdavBase = PathUri.parse('/remote.php/webdav');
16-
1716
// ignore: do_not_use_environment
1817
const bool _kIsWeb = bool.fromEnvironment('dart.library.js_util');
1918

@@ -119,16 +118,6 @@ class WebDavClient {
119118

120119
Uri _constructUri([PathUri? path]) => constructUri(rootClient.baseURL, path);
121120

122-
@visibleForTesting
123-
// ignore: public_member_api_docs
124-
static Uri constructUri(Uri baseURL, [PathUri? path]) {
125-
final segments = baseURL.pathSegments.toList()..addAll(webdavBase.pathSegments);
126-
if (path != null) {
127-
segments.addAll(path.pathSegments);
128-
}
129-
return baseURL.replace(pathSegments: segments.where((s) => s.isNotEmpty));
130-
}
131-
132121
Future<WebDavMultistatus> _parseResponse(http.StreamedResponse response) async =>
133122
WebDavMultistatus.fromXmlElement(await response.stream.xml);
134123

@@ -150,12 +139,7 @@ class WebDavClient {
150139
_constructUri(),
151140
);
152141

153-
final davCapabilities = response.headers['dav'];
154-
final davSearchCapabilities = response.headers['dasl'];
155-
return WebDavOptions(
156-
davCapabilities?.split(',').map((e) => e.trim()).where((e) => e.isNotEmpty).toSet(),
157-
davSearchCapabilities?.split(',').map((e) => e.trim()).where((e) => e.isNotEmpty).toSet(),
158-
);
142+
return parseWebDavOptions(response.headers);
159143
}
160144

161145
/// Creates a collection at [path].
@@ -428,42 +412,3 @@ class WebDavClient {
428412
},
429413
);
430414
}
431-
432-
/// WebDAV capabilities
433-
class WebDavOptions {
434-
/// Creates a new WebDavStatus.
435-
WebDavOptions(
436-
Set<String>? capabilities,
437-
Set<String>? searchCapabilities,
438-
) : capabilities = capabilities ?? {},
439-
searchCapabilities = searchCapabilities ?? {};
440-
441-
/// DAV capabilities as advertised by the server in the 'dav' header.
442-
Set<String> capabilities;
443-
444-
/// DAV search and locating capabilities as advertised by the server in the 'dasl' header.
445-
Set<String> searchCapabilities;
446-
}
447-
448-
/// Depth used for [WebDavClient.propfind].
449-
///
450-
/// See http://www.webdav.org/specs/rfc2518.html#HEADER_Depth for more information.
451-
enum WebDavDepth {
452-
/// Returns props of the resource.
453-
zero('0'),
454-
455-
/// Returns props of the resource and its immediate children.
456-
///
457-
/// Only works on collections and returns the same as [WebDavDepth.zero] for other resources.
458-
one('1'),
459-
460-
/// Returns props of the resource and all its progeny.
461-
///
462-
/// Only works on collections and returns the same as [WebDavDepth.zero] for other resources.
463-
infinity('infinity');
464-
465-
const WebDavDepth(this.value);
466-
467-
// ignore: public_member_api_docs
468-
final String value;
469-
}

packages/nextcloud/lib/src/webdav/file.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import 'package:nextcloud/src/utils/date_time.dart';
22
import 'package:nextcloud/src/utils/http_date_parser.dart';
3-
import 'package:nextcloud/src/webdav/client.dart';
43
import 'package:nextcloud/src/webdav/path_uri.dart';
54
import 'package:nextcloud/src/webdav/props.dart';
5+
import 'package:nextcloud/src/webdav/utils.dart';
66
import 'package:nextcloud/src/webdav/webdav.dart';
77
import 'package:timezone/timezone.dart' as tz;
88

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/// WebDAV capabilities.
2+
class WebDavOptions {
3+
/// Creates a new WebDavStatus.
4+
WebDavOptions(
5+
Set<String>? capabilities,
6+
Set<String>? searchCapabilities,
7+
) : capabilities = capabilities ?? {},
8+
searchCapabilities = searchCapabilities ?? {};
9+
10+
/// DAV capabilities as advertised by the server in the 'dav' header.
11+
Set<String> capabilities;
12+
13+
/// DAV search and locating capabilities as advertised by the server in the 'dasl' header.
14+
Set<String> searchCapabilities;
15+
}
16+
17+
/// Depth used for `propfind` requests.
18+
///
19+
/// See http://www.webdav.org/specs/rfc2518.html#HEADER_Depth for more information.
20+
enum WebDavDepth {
21+
/// Returns props of the resource.
22+
zero('0'),
23+
24+
/// Returns props of the resource and its immediate children.
25+
///
26+
/// Only works on collections and returns the same as [WebDavDepth.zero] for other resources.
27+
one('1'),
28+
29+
/// Returns props of the resource and all its progeny.
30+
///
31+
/// Only works on collections and returns the same as [WebDavDepth.zero] for other resources.
32+
infinity('infinity');
33+
34+
const WebDavDepth(this.value);
35+
36+
// ignore: public_member_api_docs
37+
final String value;
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import 'package:meta/meta.dart';
2+
import 'package:nextcloud/src/webdav/models.dart';
3+
import 'package:nextcloud/src/webdav/path_uri.dart';
4+
5+
/// Base path used on the server
6+
final webdavBase = PathUri.parse('/remote.php/webdav');
7+
8+
/// Parses the response headers from a `options` request.
9+
WebDavOptions parseWebDavOptions(Map<String, String> headers) {
10+
final davCapabilities = headers['dav'];
11+
final davSearchCapabilities = headers['dasl'];
12+
13+
return WebDavOptions(
14+
davCapabilities?.split(',').map((e) => e.trim()).where((e) => e.isNotEmpty).toSet(),
15+
davSearchCapabilities?.split(',').map((e) => e.trim()).where((e) => e.isNotEmpty).toSet(),
16+
);
17+
}
18+
19+
/// Constructs the uri for a webdav request for a given server [baseURL] and file [path].
20+
@internal
21+
Uri constructUri(Uri baseURL, [PathUri? path]) {
22+
final segments = baseURL.pathSegments.toList()..addAll(webdavBase.pathSegments);
23+
if (path != null) {
24+
segments.addAll(path.pathSegments);
25+
}
26+
return baseURL.replace(pathSegments: segments.where((s) => s.isNotEmpty));
27+
}

packages/nextcloud/lib/webdav.dart

+2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import 'package:nextcloud/src/webdav/client.dart';
44

55
export 'src/webdav/client.dart' hide WebDavRequest;
66
export 'src/webdav/file.dart';
7+
export 'src/webdav/models.dart';
78
export 'src/webdav/path_uri.dart';
89
export 'src/webdav/props.dart';
10+
export 'src/webdav/utils.dart' hide constructUri;
911
export 'src/webdav/webdav.dart';
1012

1113
// ignore: public_member_api_docs

packages/nextcloud/test/webdav_test.dart

+7-6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:mocktail/mocktail.dart';
66
import 'package:nextcloud/nextcloud.dart';
77
import 'package:nextcloud/src/utils/date_time.dart';
88
import 'package:nextcloud/src/utils/http_date_parser.dart';
9+
import 'package:nextcloud/src/webdav/utils.dart';
910
import 'package:nextcloud_test/nextcloud_test.dart';
1011
import 'package:test/test.dart';
1112
import 'package:test_api/src/backend/invoker.dart';
@@ -29,27 +30,27 @@ void main() {
2930

3031
test(baseURL, () {
3132
expect(
32-
WebDavClient.constructUri(baseURL).toString(),
33+
constructUri(baseURL).toString(),
3334
'$sanitizedBaseURL$webdavBase',
3435
);
3536
expect(
36-
WebDavClient.constructUri(baseURL, PathUri.parse('/')).toString(),
37+
constructUri(baseURL, PathUri.parse('/')).toString(),
3738
'$sanitizedBaseURL$webdavBase',
3839
);
3940
expect(
40-
WebDavClient.constructUri(baseURL, PathUri.parse('test')).toString(),
41+
constructUri(baseURL, PathUri.parse('test')).toString(),
4142
'$sanitizedBaseURL$webdavBase/test',
4243
);
4344
expect(
44-
WebDavClient.constructUri(baseURL, PathUri.parse('test/')).toString(),
45+
constructUri(baseURL, PathUri.parse('test/')).toString(),
4546
'$sanitizedBaseURL$webdavBase/test',
4647
);
4748
expect(
48-
WebDavClient.constructUri(baseURL, PathUri.parse('/test')).toString(),
49+
constructUri(baseURL, PathUri.parse('/test')).toString(),
4950
'$sanitizedBaseURL$webdavBase/test',
5051
);
5152
expect(
52-
WebDavClient.constructUri(baseURL, PathUri.parse('/test/')).toString(),
53+
constructUri(baseURL, PathUri.parse('/test/')).toString(),
5354
'$sanitizedBaseURL$webdavBase/test',
5455
);
5556
});

0 commit comments

Comments
 (0)