Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
13 changes: 13 additions & 0 deletions lib/http/converter/identities/identity_id_converter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/identities/identity.dart';
import 'package:json_annotation/json_annotation.dart';

class IdentityIdConverter implements JsonConverter<IdentityId, String> {
const IdentityIdConverter();

@override
IdentityId fromJson(String json) => IdentityId(Id(json));

@override
String toJson(IdentityId object) => object.id.value;
}
17 changes: 17 additions & 0 deletions lib/http/converter/mdn/mdn_converter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'package:jmap_dart_client/http/converter/id_converter.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/mdn/mdn.dart';

class MdnConverter {
MapEntry<Id, Mdn> parseEntry(String key, dynamic value) {
if(value is Map<String, dynamic>) {
return MapEntry(Id(key), Mdn.fromJson(value));
} else {
return MapEntry(Id(key), value);
}
}

MapEntry<String, dynamic> toJson(Id id, Mdn mdn) {
return MapEntry(IdConverter().toJson(id), mdn.toJson());
}
}
12 changes: 12 additions & 0 deletions lib/http/converter/set_error_converter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:jmap_dart_client/jmap/core/error/set_error.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';

class SetErrorConverter {
MapEntry<Id, SetError> parseEntry(String key, dynamic value) {
if (value is Map<String, dynamic>) {
return MapEntry(Id(key), SetError.fromJson(value));
} else {
return MapEntry(Id(key), value);
}
}
}
80 changes: 80 additions & 0 deletions lib/jmap/mdn/disposition.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';

part 'disposition.g.dart';

@JsonSerializable()
class Disposition with EquatableMixin {
final ActionMode actionMode;
final SendingMode sendingMode;
final DispositionType type;

Disposition({
required this.actionMode,
required this.sendingMode,
required this.type,
});

@override
List<Object?> get props => [actionMode, sendingMode, type];

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

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

enum ActionMode {
manual('manual-action'),
automatic('automatic-action');

final String value;

const ActionMode(this.value);

String toJson() => value;

static ActionMode fromJson(String json) {
final parts = json.split('-');
if (parts.isNotEmpty && values.contains(parts[0])) {
return values.byName(parts[0]);
}
throw Exception('wrong parsed actionMode: $json');
}
}

enum SendingMode {
manually('mdn-sent-manually'),
automatically('mdn-sent-automatically');

final String value;

const SendingMode(this.value);

String toJson() => value;

static SendingMode fromJson(String json) {
final parts = json.split('-');
if (parts.length >= 2 && values.contains(parts[2])) {
return values.byName(parts[2]);
}
throw Exception('wrong parsed SendingMode: $json');
}
}

enum DispositionType {
deleted,
dispatched,
displayed,
processed;

String toJson() => name;

static DispositionType fromJson(String json) {
try {
return values.byName(json);
} catch (e) {
throw Exception('wrong parsed type');
}
}
}
37 changes: 37 additions & 0 deletions lib/jmap/mdn/disposition.g.dart

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

72 changes: 72 additions & 0 deletions lib/jmap/mdn/mdn.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/http/converter/id_nullable_converter.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/mdn/disposition.dart';
import 'package:json_annotation/json_annotation.dart';

part 'mdn.g.dart';

@IdNullableConverter()
@JsonSerializable()
class Mdn with EquatableMixin {

final Id? forEmailId;

final String? subject;

final String? textBody;

final bool includeOriginalMessage;

final String? reportingUA;

final Disposition disposition;

final String? mdnGateway;

final String? originalRecipient;

final String? finalRecipient;

final String? originalMessageId;

final List<String>? error;

final Map<String,String>? extensionFields;

Mdn({
required this.disposition,
this.forEmailId,
this.subject,
this.textBody,
this.includeOriginalMessage = false,
this.reportingUA,
this.mdnGateway,
this.originalRecipient,
this.finalRecipient,
this.originalMessageId,
this.error,
this.extensionFields,
});


@override
List<Object?> get props => [
forEmailId,
subject,
textBody,
includeOriginalMessage,
reportingUA,
disposition,
mdnGateway,
originalRecipient,
finalRecipient,
originalMessageId,
error,
extensionFields,
];

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

Map<String, dynamic> toJson() => _$MdnToJson(this);
}
42 changes: 42 additions & 0 deletions lib/jmap/mdn/mdn.g.dart

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

69 changes: 69 additions & 0 deletions lib/jmap/mdn/send/send_message_method.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import 'package:jmap_dart_client/http/converter/account_id_converter.dart';
import 'package:jmap_dart_client/http/converter/identities/identity_id_converter.dart';
import 'package:jmap_dart_client/http/converter/mdn/mdn_converter.dart';
import 'package:jmap_dart_client/http/converter/set/set_method_properties_converter.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/core/method/method.dart';
import 'package:jmap_dart_client/jmap/core/patch_object.dart';
import 'package:jmap_dart_client/jmap/core/request/request_invocation.dart';
import 'package:jmap_dart_client/jmap/identities/identity.dart';
import 'package:jmap_dart_client/jmap/mdn/mdn.dart';

class SendMessageMethod extends MethodRequiringAccountId {
final IdentityId identityId;

final Map<Id, Mdn> send;

final Map<Id, PatchObject>? onSuccessUpdateEmail;

SendMessageMethod(
AccountId accountId, {
required this.identityId,
required this.send,
this.onSuccessUpdateEmail,
}) : super(accountId);

@override
MethodName get methodName => MethodName('MDN/send');

@override
Set<CapabilityIdentifier> get requiredCapabilities => {
CapabilityIdentifier.jmapMdn,
CapabilityIdentifier.jmapMail,
CapabilityIdentifier.jmapCore,
};

@override
Map<String, dynamic> toJson() {
final val = <String, dynamic>{
'accountId': const AccountIdConverter().toJson(accountId),
'identityId': const IdentityIdConverter().toJson(identityId),
};

void writeNotNull(String key, dynamic value) {
if (value != null) {
val[key] = value;
}
}

writeNotNull(
'send', send.map((key, value) => MdnConverter().toJson(key, value)));
writeNotNull(
'onSuccessUpdateEmail',
onSuccessUpdateEmail?.map((key, value) =>
SetMethodPropertiesConverter().fromMapIdToJson(key, value)));
return val;
}

@override
List<Object?> get props => [
methodName,
accountId,
identityId,
send,
onSuccessUpdateEmail,
requiredCapabilities
];
}
Loading