Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions lib/http/converter/account_converter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import 'package:jmap_dart_client/http/converter/account_name_converter.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/account/account.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';

import 'capabilities_converter.dart';

class AccountConverter {
const AccountConverter();

MapEntry<AccountId, Account> convert(String key, dynamic value, CapabilitiesConverter converter) {
final accountId = AccountId(Id(key));
final account = accountFromJson(value, converter);
return MapEntry(accountId, account);
}

Account accountFromJson(Map<String, dynamic> json, CapabilitiesConverter converter) {
return Account(
const AccountNameConverter().fromJson(json['name'] as String),
json['isPersonal'] as bool,
json['isReadOnly'] as bool,
(json['accountCapabilities'] as Map<String, dynamic>)
.map((key, value) => converter.convert(key, value))
);
}

}
12 changes: 12 additions & 0 deletions lib/http/converter/account_name_converter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:jmap_dart_client/jmap/core/account/account.dart';
import 'package:json_annotation/json_annotation.dart';

class AccountNameConverter implements JsonConverter<AccountName, String> {
const AccountNameConverter();

@override
AccountName fromJson(String json) => AccountName(json);

@override
String toJson(AccountName object) => object.value;
}
54 changes: 54 additions & 0 deletions lib/http/converter/capabilities_converter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import 'package:built_collection/built_collection.dart';
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
import 'package:jmap_dart_client/jmap/core/capability/capability_properties.dart';
import 'package:jmap_dart_client/jmap/core/capability/core_capability.dart';
import 'package:jmap_dart_client/jmap/core/capability/default_capability.dart';
import 'package:jmap_dart_client/jmap/core/capability/mail_capability.dart';
import 'package:jmap_dart_client/jmap/core/capability/mdn_capability.dart';
import 'package:jmap_dart_client/jmap/core/capability/submission_capability.dart';
import 'package:jmap_dart_client/jmap/core/capability/vacation_capability.dart';
import 'package:jmap_dart_client/jmap/core/capability/websocket_capability.dart';

class CapabilitiesConverter {
static final defaultConverter = CapabilitiesConverter();

BuiltMap<CapabilityIdentifier, CapabilityProperties Function(Map<String, dynamic>)>? mapCapabilitiesConverter;
final _mapCapabilityConverterBuilder = MapBuilder<CapabilityIdentifier, CapabilityProperties Function(Map<String, dynamic>)>();

CapabilitiesConverter() {
_mapCapabilityConverterBuilder.addAll(
{
CapabilityIdentifier.jmapMail: MailCapability.deserialize,
CapabilityIdentifier.jmapCore: CoreCapability.deserialize,
CapabilityIdentifier.jmapSubmission: SubmissionCapability.deserialize,
CapabilityIdentifier.jmapVacationResponse: VacationCapability.deserialize,
CapabilityIdentifier.jmapWebSocket: WebSocketCapability.deserialize,
CapabilityIdentifier.jmapMdn: MdnCapability.deserialize
});
}

void addConverters(Map<CapabilityIdentifier, CapabilityProperties Function(Map<String, dynamic>)> converters) {
_mapCapabilityConverterBuilder.addAll(converters);
}

void build() {
mapCapabilitiesConverter = _mapCapabilityConverterBuilder.build();
}

BuiltMap<CapabilityIdentifier, Function>? getConverters() {
return mapCapabilitiesConverter;
}

MapEntry<CapabilityIdentifier, CapabilityProperties> convert(String key, dynamic value) {
if (mapCapabilitiesConverter == null) {
build();
}

final identifier = CapabilityIdentifier(Uri.parse(key));
if (mapCapabilitiesConverter!.containsKey(identifier)) {
return MapEntry(identifier, mapCapabilitiesConverter![identifier]!.call(value));
} else {
return MapEntry(identifier, DefaultCapability(value));
}
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import 'package:jmap_dart_client/jmap/core/capability/capability.dart';
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
import 'package:json_annotation/json_annotation.dart';

class CapabilityIdentifierConverter implements JsonConverter<CapabilityIdentifier, String> {
const CapabilityIdentifierConverter();

@override
CapabilityIdentifier fromJson(String json) => CapabilityIdentifier(json);
CapabilityIdentifier fromJson(String json) => CapabilityIdentifier(Uri.parse(json));

@override
String toJson(CapabilityIdentifier object) => object.value;
String toJson(CapabilityIdentifier object) => object.value.toString();
}
16 changes: 16 additions & 0 deletions lib/http/converter/unsigned_int_converter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:json_annotation/json_annotation.dart';

class UnsignedIntConverter implements JsonConverter<UnsignedInt, int> {
const UnsignedIntConverter();

@override
UnsignedInt fromJson(int json) {
return UnsignedInt(json);
}

@override
int toJson(UnsignedInt object) {
return object.value.toInt();
}
}
12 changes: 12 additions & 0 deletions lib/http/converter/url_jmap_converter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:jmap_dart_client/jmap/core/url_jmap.dart';
import 'package:json_annotation/json_annotation.dart';

class UrlJmapConverter implements JsonConverter<UrlJmap, String> {
const UrlJmapConverter();

@override
UrlJmap fromJson(String json) => UrlJmap(json);

@override
String toJson(UrlJmap object) => object.value;
}
12 changes: 12 additions & 0 deletions lib/http/converter/user_name_converter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:json_annotation/json_annotation.dart';

class UserNameConverter implements JsonConverter<UserName, String> {
const UserNameConverter();

@override
UserName fromJson(String json) => UserName(json);

@override
String toJson(UserName object) => object.value;
}
20 changes: 20 additions & 0 deletions lib/http/http_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,24 @@ class HttpClient {
.then((value) => value.data)
.catchError((error) => throw error);
}

Future<dynamic> get(
String path, {
Map<String, dynamic>? queryParameters,
Options? options,
CancelToken? cancelToken,
ProgressCallback? onReceiveProgress,
}) async {
final newOptions = options?.appendHeaders({HttpHeaders.acceptHeader : jmapHeader})
?? Options(headers: {HttpHeaders.acceptHeader : jmapHeader}) ;

return await _dio.get(
path,
queryParameters: queryParameters,
options: newOptions,
cancelToken: cancelToken,
onReceiveProgress: onReceiveProgress)
.then((value) => value.data)
.catchError((error) => throw error);
}
}
31 changes: 31 additions & 0 deletions lib/jmap/core/account/account.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
import 'package:jmap_dart_client/jmap/core/capability/capability_properties.dart';

class Account with EquatableMixin {

final AccountName name;
final bool isPersonal;
final bool isReadOnly;
final Map<CapabilityIdentifier, CapabilityProperties> accountCapabilities;

Account(
this.name,
this.isPersonal,
this.isReadOnly,
this.accountCapabilities,
);

@override
List<Object> get props => [name, isPersonal, isReadOnly, accountCapabilities];
}

class AccountName with EquatableMixin {

final String value;

AccountName(this.value);

@override
List<Object> get props => [value];
}
25 changes: 0 additions & 25 deletions lib/jmap/core/capability/capability.dart

This file was deleted.

17 changes: 17 additions & 0 deletions lib/jmap/core/capability/capability_identifier.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'package:equatable/equatable.dart';

class CapabilityIdentifier with EquatableMixin {
static final jmapCore = CapabilityIdentifier(Uri.parse('urn:ietf:params:jmap:core'));
static final jmapMail = CapabilityIdentifier(Uri.parse('urn:ietf:params:jmap:mail'));
static final jmapSubmission = CapabilityIdentifier(Uri.parse('urn:ietf:params:jmap:submission'));
static final jmapVacationResponse = CapabilityIdentifier(Uri.parse('urn:ietf:params:jmap:vacationresponse'));
static final jmapWebSocket = CapabilityIdentifier(Uri.parse('urn:ietf:params:jmap:websocket'));
static final jmapMdn = CapabilityIdentifier(Uri.parse('urn:ietf:params:jmap:mdn'));

final Uri value;

CapabilityIdentifier(this.value);

@override
List<Object> get props => [value];
}
5 changes: 5 additions & 0 deletions lib/jmap/core/capability/capability_properties.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import 'package:equatable/equatable.dart';

abstract class CapabilityProperties with EquatableMixin {

}
48 changes: 48 additions & 0 deletions lib/jmap/core/capability/core_capability.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/http/converter/unsigned_int_converter.dart';
import 'package:jmap_dart_client/jmap/core/capability/capability_properties.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:json_annotation/json_annotation.dart';

part 'core_capability.g.dart';

@UnsignedIntConverter()
@JsonSerializable()
class CoreCapability extends CapabilityProperties with EquatableMixin {
final UnsignedInt maxSizeUpload;
final UnsignedInt maxConcurrentUpload;
final UnsignedInt maxSizeRequest;
final UnsignedInt maxConcurrentRequests;
final UnsignedInt maxCallsInRequest;
final UnsignedInt maxObjectsInGet;
final UnsignedInt maxObjectsInSet;
final Set<String> collationAlgorithms;

CoreCapability(
this.maxSizeUpload,
this.maxConcurrentUpload,
this.maxSizeRequest,
this.maxConcurrentRequests,
this.maxCallsInRequest,
this.maxObjectsInGet,
this.maxObjectsInSet,
this.collationAlgorithms);

factory CoreCapability.fromJson(Map<String, dynamic> json) => _$CoreCapabilityFromJson(json);

Map<String, dynamic> toJson() => _$CoreCapabilityToJson(this);

static CoreCapability deserialize(Map<String, dynamic> json) => CoreCapability.fromJson(json);

@override
List<Object?> get props => [
maxSizeUpload,
maxConcurrentUpload,
maxSizeRequest,
maxConcurrentRequests,
maxCallsInRequest,
maxObjectsInGet,
maxObjectsInSet,
collationAlgorithms
];
}
41 changes: 41 additions & 0 deletions lib/jmap/core/capability/core_capability.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions lib/jmap/core/capability/default_capability.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/jmap/core/capability/capability_properties.dart';

class DefaultCapability extends CapabilityProperties with EquatableMixin {
final Map<String, dynamic> properties;

DefaultCapability(this.properties);

@override
List<Object?> get props => [properties];
}
Loading