diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index 8f5102890..79ab742d3 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -377,7 +377,7 @@ class EmailAPI with HandleSetErrorMixin { final coreCapability = moveRequest.session.getCapabilityProperties( accountId, CapabilityIdentifier.jmapCore); - final maxMethodCount = coreCapability.maxCallsInRequest.value.toInt(); + final maxMethodCount = coreCapability.maxCallsInRequest?.value.toInt() ?? 0; var start = 0; var end = 0; diff --git a/lib/features/mailbox/data/network/mailbox_api.dart b/lib/features/mailbox/data/network/mailbox_api.dart index 345b93825..d2ad0d757 100644 --- a/lib/features/mailbox/data/network/mailbox_api.dart +++ b/lib/features/mailbox/data/network/mailbox_api.dart @@ -185,7 +185,7 @@ class MailboxAPI with HandleSetErrorMixin { final coreCapability = session.getCapabilityProperties( accountId, CapabilityIdentifier.jmapCore); - final maxMethodCount = coreCapability.maxCallsInRequest.value.toInt(); + final maxMethodCount = coreCapability.maxCallsInRequest?.value.toInt() ?? 0; final Map finalDeletedMailboxErrors = {}; var start = 0; diff --git a/lib/features/quotas/presentation/quotas_controller.dart b/lib/features/quotas/presentation/quotas_controller.dart index 71d87ab56..10c8f0acf 100644 --- a/lib/features/quotas/presentation/quotas_controller.dart +++ b/lib/features/quotas/presentation/quotas_controller.dart @@ -64,9 +64,14 @@ class QuotasController extends BaseController { void _handleGetQuotasSuccess(GetQuotasSuccess success) { try { final quotas = success.quotas.firstWhere((e) => e.resourceType == ResourceType.octets); - usedCapacity.value = DoubleConvert.bytesToGigaBytes(quotas.used.value); - warningLimitCapacity.value = DoubleConvert.bytesToGigaBytes(quotas.limit.value * warningProgressConstant); - limitCapacity.value = DoubleConvert.bytesToGigaBytes(quotas.limit.value); + if (quotas.used != null) { + usedCapacity.value = DoubleConvert.bytesToGigaBytes(quotas.used!.value); + } + if (quotas.limit != null) { + warningLimitCapacity.value = DoubleConvert.bytesToGigaBytes(quotas.limit!.value * warningProgressConstant); + limitCapacity.value = DoubleConvert.bytesToGigaBytes(quotas.limit!.value); + } + if(usedCapacity.value >= limitCapacity.value) { quotasState.value = QuotasState.runOutOfStorage; } else if (usedCapacity.value >= warningLimitCapacity.value) { diff --git a/test/main/error/capability_validator_test.dart b/test/main/error/capability_validator_test.dart index 7d088ac3d..34b43dab5 100644 --- a/test/main/error/capability_validator_test.dart +++ b/test/main/error/capability_validator_test.dart @@ -24,17 +24,20 @@ void main() { test('when session missing one capability exception should throw', () { final session = Session( { - CapabilityIdentifier.jmapSubmission: - SubmissionCapability(UnsignedInt(0), {}), + CapabilityIdentifier.jmapSubmission: SubmissionCapability( + maxDelayedSend: UnsignedInt(0), + submissionExtensions: {} + ), CapabilityIdentifier.jmapMail: MailCapability( - UnsignedInt(10000000), - null, - UnsignedInt(200), - UnsignedInt(20000000), - {"receivedAt", "sentAt", "size", "from", "to", "subject"}, - true), - CapabilityIdentifier.jmapWebSocket: - WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')), + maxMailboxesPerEmail: UnsignedInt(10000000), + maxSizeAttachmentsPerEmail: UnsignedInt(20000000), + emailQuerySortOptions: {"receivedAt", "sentAt", "size", "from", "to", "subject"}, + mayCreateTopLevelMailbox: true + ), + CapabilityIdentifier.jmapWebSocket: WebSocketCapability( + supportsPush: true, + url: Uri.parse('ws://domain.com/jmap/ws') + ), CapabilityIdentifier( Uri.parse('urn:apache:james:params:jmap:mail:quota')): DefaultCapability({}), @@ -45,20 +48,21 @@ void main() { CapabilityIdentifier.jmapMdn: MdnCapability() }, { - AccountId(Id( - '29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')): - Account(AccountName('bob@domain.tld'), true, false, { - CapabilityIdentifier.jmapSubmission: - SubmissionCapability(UnsignedInt(0), {}), + AccountId(Id('29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')): Account(AccountName('bob@domain.tld'), true, false, { + CapabilityIdentifier.jmapSubmission: SubmissionCapability( + maxDelayedSend: UnsignedInt(0), + submissionExtensions: {} + ), CapabilityIdentifier.jmapWebSocket: WebSocketCapability( - true, Uri.parse('ws://domain.com/jmap/ws')), + supportsPush: true, + url: Uri.parse('ws://domain.com/jmap/ws') + ), CapabilityIdentifier.jmapMail: MailCapability( - UnsignedInt(10000000), - null, - UnsignedInt(200), - UnsignedInt(20000000), - {"receivedAt", "sentAt", "size", "from", "to", "subject"}, - true), + maxMailboxesPerEmail: UnsignedInt(10000000), + maxSizeAttachmentsPerEmail: UnsignedInt(20000000), + emailQuerySortOptions: {"receivedAt", "sentAt", "size", "from", "to", "subject"}, + mayCreateTopLevelMailbox: true + ), CapabilityIdentifier( Uri.parse('urn:apache:james:params:jmap:mail:quota')): DefaultCapability({}), @@ -110,17 +114,20 @@ void main() { test('when account capabilities is empty exception should throw', () { final session = Session( { - CapabilityIdentifier.jmapSubmission: - SubmissionCapability(UnsignedInt(0), {}), + CapabilityIdentifier.jmapSubmission: SubmissionCapability( + maxDelayedSend: UnsignedInt(0), + submissionExtensions: {} + ), CapabilityIdentifier.jmapMail: MailCapability( - UnsignedInt(10000000), - null, - UnsignedInt(200), - UnsignedInt(20000000), - {"receivedAt", "sentAt", "size", "from", "to", "subject"}, - true), - CapabilityIdentifier.jmapWebSocket: - WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')), + maxMailboxesPerEmail: UnsignedInt(10000000), + maxSizeAttachmentsPerEmail: UnsignedInt(20000000), + emailQuerySortOptions: {"receivedAt", "sentAt", "size", "from", "to", "subject"}, + mayCreateTopLevelMailbox: true + ), + CapabilityIdentifier.jmapWebSocket: WebSocketCapability( + supportsPush: true, + url: Uri.parse('ws://domain.com/jmap/ws') + ), CapabilityIdentifier( Uri.parse('urn:apache:james:params:jmap:mail:quota')): DefaultCapability({}), @@ -177,17 +184,20 @@ void main() { final invalidId = Id("29883977c13473ae7cb7678ef767cbffabfc8a44a6e463d971d23a65c1dc4af6"); final session = Session( { - CapabilityIdentifier.jmapSubmission: - SubmissionCapability(UnsignedInt(0), {}), + CapabilityIdentifier.jmapSubmission: SubmissionCapability( + maxDelayedSend: UnsignedInt(0), + submissionExtensions: {} + ), CapabilityIdentifier.jmapMail: MailCapability( - UnsignedInt(10000000), - null, - UnsignedInt(200), - UnsignedInt(20000000), - {"receivedAt", "sentAt", "size", "from", "to", "subject"}, - true), - CapabilityIdentifier.jmapWebSocket: - WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')), + maxMailboxesPerEmail: UnsignedInt(10000000), + maxSizeAttachmentsPerEmail: UnsignedInt(20000000), + emailQuerySortOptions: {"receivedAt", "sentAt", "size", "from", "to", "subject"}, + mayCreateTopLevelMailbox: true + ), + CapabilityIdentifier.jmapWebSocket: WebSocketCapability( + supportsPush: true, + url: Uri.parse('ws://domain.com/jmap/ws') + ), CapabilityIdentifier( Uri.parse('urn:apache:james:params:jmap:mail:quota')): DefaultCapability({}), @@ -201,17 +211,20 @@ void main() { AccountId(Id( '29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')): Account(AccountName('bob@domain.tld'), true, false, { - CapabilityIdentifier.jmapSubmission: - SubmissionCapability(UnsignedInt(0), {}), + CapabilityIdentifier.jmapSubmission: SubmissionCapability( + maxDelayedSend: UnsignedInt(0), + submissionExtensions: {} + ), CapabilityIdentifier.jmapWebSocket: WebSocketCapability( - true, Uri.parse('ws://domain.com/jmap/ws')), + supportsPush: true, + url: Uri.parse('ws://domain.com/jmap/ws') + ), CapabilityIdentifier.jmapMail: MailCapability( - UnsignedInt(10000000), - null, - UnsignedInt(200), - UnsignedInt(20000000), - {"receivedAt", "sentAt", "size", "from", "to", "subject"}, - true), + maxMailboxesPerEmail: UnsignedInt(10000000), + maxSizeAttachmentsPerEmail: UnsignedInt(20000000), + emailQuerySortOptions: {"receivedAt", "sentAt", "size", "from", "to", "subject"}, + mayCreateTopLevelMailbox: true + ), CapabilityIdentifier( Uri.parse('urn:apache:james:params:jmap:mail:quota')): DefaultCapability({}), @@ -263,17 +276,20 @@ void main() { test('when accounts empty should throw exception', () { final session = Session( { - CapabilityIdentifier.jmapSubmission: - SubmissionCapability(UnsignedInt(0), {}), + CapabilityIdentifier.jmapSubmission: SubmissionCapability( + maxDelayedSend: UnsignedInt(0), + submissionExtensions: {} + ), CapabilityIdentifier.jmapMail: MailCapability( - UnsignedInt(10000000), - null, - UnsignedInt(200), - UnsignedInt(20000000), - {"receivedAt", "sentAt", "size", "from", "to", "subject"}, - true), - CapabilityIdentifier.jmapWebSocket: - WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')), + maxMailboxesPerEmail: UnsignedInt(10000000), + maxSizeAttachmentsPerEmail: UnsignedInt(20000000), + emailQuerySortOptions: {"receivedAt", "sentAt", "size", "from", "to", "subject"}, + mayCreateTopLevelMailbox: true + ), + CapabilityIdentifier.jmapWebSocket: WebSocketCapability( + supportsPush: true, + url: Uri.parse('ws://domain.com/jmap/ws') + ), CapabilityIdentifier( Uri.parse('urn:apache:james:params:jmap:mail:quota')): DefaultCapability({}), @@ -325,27 +341,30 @@ void main() { test('when session have all required capabilities exception should not throw', () { final session = Session( { - CapabilityIdentifier.jmapSubmission: - SubmissionCapability(UnsignedInt(0), {}), + CapabilityIdentifier.jmapSubmission: SubmissionCapability( + maxDelayedSend: UnsignedInt(0), + submissionExtensions: {} + ), CapabilityIdentifier.jmapCore: CoreCapability( - UnsignedInt(20971520), - UnsignedInt(4), - UnsignedInt(10000000), - UnsignedInt(4), - UnsignedInt(16), - UnsignedInt(500), - UnsignedInt(500), - {CollationIdentifier("i;unicode-casemap")} + maxSizeUpload: UnsignedInt(20971520), + maxConcurrentUpload: UnsignedInt(4), + maxSizeRequest: UnsignedInt(10000000), + maxConcurrentRequests: UnsignedInt(4), + maxCallsInRequest: UnsignedInt(16), + maxObjectsInGet: UnsignedInt(500), + maxObjectsInSet: UnsignedInt(500), + collationAlgorithms: {CollationIdentifier("i;unicode-casemap")} ), CapabilityIdentifier.jmapMail: MailCapability( - UnsignedInt(10000000), - null, - UnsignedInt(200), - UnsignedInt(20000000), - {"receivedAt", "sentAt", "size", "from", "to", "subject"}, - true), - CapabilityIdentifier.jmapWebSocket: - WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')), + maxMailboxesPerEmail: UnsignedInt(10000000), + maxSizeAttachmentsPerEmail: UnsignedInt(20000000), + emailQuerySortOptions: {"receivedAt", "sentAt", "size", "from", "to", "subject"}, + mayCreateTopLevelMailbox: true + ), + CapabilityIdentifier.jmapWebSocket: WebSocketCapability( + supportsPush: true, + url: Uri.parse('ws://domain.com/jmap/ws') + ), CapabilityIdentifier( Uri.parse('urn:apache:james:params:jmap:mail:quota')): DefaultCapability({}), @@ -359,26 +378,26 @@ void main() { AccountId(Id( '29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')): Account(AccountName('bob@domain.tld'), true, false, { - CapabilityIdentifier.jmapSubmission: - SubmissionCapability(UnsignedInt(0), {}), - CapabilityIdentifier.jmapWebSocket: WebSocketCapability( - true, Uri.parse('ws://domain.com/jmap/ws')), + CapabilityIdentifier.jmapSubmission: SubmissionCapability( + maxDelayedSend: UnsignedInt(0), + submissionExtensions: {} + ), CapabilityIdentifier.jmapCore: CoreCapability( - UnsignedInt(20971520), - UnsignedInt(4), - UnsignedInt(10000000), - UnsignedInt(4), - UnsignedInt(16), - UnsignedInt(500), - UnsignedInt(500), - {CollationIdentifier("i;unicode-casemap")}), + maxSizeUpload: UnsignedInt(20971520), + maxConcurrentUpload: UnsignedInt(4), + maxSizeRequest: UnsignedInt(10000000), + maxConcurrentRequests: UnsignedInt(4), + maxCallsInRequest: UnsignedInt(16), + maxObjectsInGet: UnsignedInt(500), + maxObjectsInSet: UnsignedInt(500), + collationAlgorithms: {CollationIdentifier("i;unicode-casemap")} + ), CapabilityIdentifier.jmapMail: MailCapability( - UnsignedInt(10000000), - null, - UnsignedInt(200), - UnsignedInt(20000000), - {"receivedAt", "sentAt", "size", "from", "to", "subject"}, - true), + maxMailboxesPerEmail: UnsignedInt(10000000), + maxSizeAttachmentsPerEmail: UnsignedInt(20000000), + emailQuerySortOptions: {"receivedAt", "sentAt", "size", "from", "to", "subject"}, + mayCreateTopLevelMailbox: true + ), CapabilityIdentifier( Uri.parse('urn:apache:james:params:jmap:mail:quota')): DefaultCapability({}),