diff --git a/src/mail-app/workerUtils/index/BulkMailLoader.ts b/src/mail-app/workerUtils/index/BulkMailLoader.ts index ccef01f6d6..6487575f95 100644 --- a/src/mail-app/workerUtils/index/BulkMailLoader.ts +++ b/src/mail-app/workerUtils/index/BulkMailLoader.ts @@ -22,7 +22,6 @@ import { listIdPart, } from "../../../common/api/common/utils/EntityUtils.js" import { CacheMode, EntityRestClientLoadOptions, OwnerEncSessionKeyProvider } from "../../../common/api/worker/rest/EntityRestClient.js" -import { isDraft } from "../../mail/model/MailChecks.js" import { File as TutanotaFile, FileTypeRef, @@ -71,7 +70,7 @@ export class BulkMailLoader { async loadMailDetails(mails: readonly Mail[], options: EntityRestClientLoadOptions = {}): Promise { const result: Array = [] // mailDetails stored as blob - let mailDetailsBlobMails = mails.filter((m) => !isDraft(m)) + let mailDetailsBlobMails = mails.filter((m) => !m.mailDetailsDraft) const listIdToMailDetailsBlobIds: Map> = groupByAndMap( mailDetailsBlobMails, (m) => listIdPart(assertNotNull(m.mailDetails)), @@ -94,7 +93,7 @@ export class BulkMailLoader { ) } // mailDetails stored in db (draft) - let mailDetailsDraftMails = mails.filter((m) => isDraft(m)) + let mailDetailsDraftMails = mails.filter((m) => m.mailDetailsDraft) const listIdToMailDetailsDraftIds: Map> = groupByAndMap( mailDetailsDraftMails, (m) => listIdPart(assertNotNull(m.mailDetailsDraft)), diff --git a/src/mail-app/workerUtils/offline/MailOfflineCleaner.ts b/src/mail-app/workerUtils/offline/MailOfflineCleaner.ts index 4f9915402a..86fabe1ff8 100644 --- a/src/mail-app/workerUtils/offline/MailOfflineCleaner.ts +++ b/src/mail-app/workerUtils/offline/MailOfflineCleaner.ts @@ -18,7 +18,6 @@ import { MailTypeRef, } from "../../../common/api/entities/tutanota/TypeRefs.js" import { OfflineStorage, OfflineStorageCleaner } from "../../../common/api/worker/offline/OfflineStorage.js" -import { isDraft } from "../../mail/model/MailChecks.js" import { UserTypeRef } from "../../../common/api/entities/sys/TypeRefs" import { AccountType, OFFLINE_STORAGE_DEFAULT_TIME_RANGE_DAYS } from "../../../common/api/common/TutanotaConstants" @@ -117,12 +116,13 @@ export class MailOfflineCleaner implements OfflineStorageCleaner { attachmentsToDelete.push(id) } - if (isDraft(mail)) { - const mailDetailsId = assertNotNull(mail.mailDetailsDraft) + if (mail.mailDetailsDraft) { + const mailDetailsId = mail.mailDetailsDraft mailDetailsDraftToDelete.push(mailDetailsId) - } else { + } + if (mail.mailDetails) { // mailDetailsBlob - const mailDetailsId = assertNotNull(mail.mailDetails) + const mailDetailsId = mail.mailDetails mailDetailsBlobToDelete.push(mailDetailsId) } } diff --git a/test/tests/api/worker/crypto/CryptoFacadeTest.ts b/test/tests/api/worker/crypto/CryptoFacadeTest.ts index 7a420e930b..b35f69b45b 100644 --- a/test/tests/api/worker/crypto/CryptoFacadeTest.ts +++ b/test/tests/api/worker/crypto/CryptoFacadeTest.ts @@ -1885,6 +1885,7 @@ o.spec("CryptoFacadeTest", function () { processingState: ProcessingState.INBOX_RULE_APPLIED, clientSpamClassifierResult: null, processNeeded: false, + sendAt: null, }) // casting here is fine, since we just want to mimic server response data diff --git a/test/tests/api/worker/search/MailIndexerTest.ts b/test/tests/api/worker/search/MailIndexerTest.ts index 842ca181d0..22a291e7f4 100644 --- a/test/tests/api/worker/search/MailIndexerTest.ts +++ b/test/tests/api/worker/search/MailIndexerTest.ts @@ -877,6 +877,7 @@ function createMailInstances({ _ownerEncSessionKey: new Uint8Array(), mailDetails: mailDetailsBlobId, attachments: attachmentIds, + //state: MailState.RECEIVED, }) let mailDetailsBlob = createTestEntity(MailDetailsBlobTypeRef, { _id: mailDetailsBlobId, diff --git a/test/tests/mail/SendMailModelTest.ts b/test/tests/mail/SendMailModelTest.ts index 835fa9f10a..3f43264f2a 100644 --- a/test/tests/mail/SendMailModelTest.ts +++ b/test/tests/mail/SendMailModelTest.ts @@ -428,7 +428,7 @@ o.spec("SendMailModel", function () { const e = await assertThrows(UserError, () => model.send(method, getConfirmation)) o(e?.message).equals(lang.get("noRecipients_msg")) verify(getConfirmation(), { times: 0 }) - verify(mailFacade.sendDraft(anything(), anything(), anything()), { times: 0 }) + verify(mailFacade.sendDraft(anything(), anything(), anything(), anything()), { times: 0 }) verify(mailFacade.createDraft(anything()), { times: 0 }) verify(mailFacade.updateDraft(anything()), { times: 0 }) }) @@ -444,7 +444,7 @@ o.spec("SendMailModel", function () { const r = await model.send(method, getConfirmation) o(r).equals(false) verify(getConfirmation(), { times: 0 }) - verify(mailFacade.sendDraft(anything(), anything(), anything()), { times: 0 }) + verify(mailFacade.sendDraft(anything(), anything(), anything(), anything()), { times: 0 }) verify(mailFacade.createDraft(anything()), { times: 0 }) verify(mailFacade.updateDraft(anything()), { times: 0 }) }) @@ -463,7 +463,7 @@ o.spec("SendMailModel", function () { const e = await assertThrows(UserError, () => model.send(method, getConfirmation)) o(e?.message).equals(lang.get("noPreSharedPassword_msg")) - verify(mailFacade.sendDraft(anything(), anything(), anything()), { times: 0 }) + verify(mailFacade.sendDraft(anything(), anything(), anything(), anything()), { times: 0 }) verify(mailFacade.createDraft(anything()), { times: 0 }) verify(mailFacade.updateDraft(anything()), { times: 0 }) }) @@ -482,7 +482,7 @@ o.spec("SendMailModel", function () { when(getConfirmation(anything())).thenResolve(false) const r = await model.send(method, getConfirmation) o(r).equals(false) - verify(mailFacade.sendDraft(anything(), anything(), anything()), { times: 0 }) + verify(mailFacade.sendDraft(anything(), anything(), anything(), anything()), { times: 0 }) verify(mailFacade.createDraft(anything()), { times: 0 }) verify(mailFacade.updateDraft(anything()), { times: 0 }) }) @@ -503,7 +503,7 @@ o.spec("SendMailModel", function () { const r = await model.send(method, getConfirmation) o(r).equals(true) - verify(mailFacade.sendDraft(anything(), anything(), anything()), { times: 1 }) + verify(mailFacade.sendDraft(anything(), anything(), anything(), anything()), { times: 1 }) verify(mailFacade.createDraft(anything()), { times: 1 }) verify(mailFacade.updateDraft(anything()), { times: 0 }) @@ -538,7 +538,7 @@ o.spec("SendMailModel", function () { verify(getConfirmation(anything), { times: 0 }) - verify(mailFacade.sendDraft(anything(), anything(), anything()), { times: 1 }) + verify(mailFacade.sendDraft(anything(), anything(), anything(), anything()), { times: 1 }) verify(mailFacade.createDraft(anything()), { times: 1 }) verify(mailFacade.updateDraft(anything()), { times: 0 }) diff --git a/test/tests/mail/view/MailViewerViewModelTest.ts b/test/tests/mail/view/MailViewerViewModelTest.ts index ecdf47d3bd..d95cc2b7c7 100644 --- a/test/tests/mail/view/MailViewerViewModelTest.ts +++ b/test/tests/mail/view/MailViewerViewModelTest.ts @@ -402,9 +402,10 @@ o.spec("MailViewerViewModel", function () { o(viewModel.didErrorsOccur()).deepEquals(true) }) - o("changind sent mail from mail details draft to mail details blob", async function () { + o("changing sent mail from mail details draft to mail details blob", async function () { const viewModel = makeViewModelWithHeaders("") mail.mailDetailsDraft = ["draftListId", "draftId"] + mail.state = MailState.DRAFT const mailDetailsBlob = mail.mailDetails mail.mailDetails = null @@ -416,6 +417,7 @@ o.spec("MailViewerViewModel", function () { o(viewModel.didErrorsOccur()).deepEquals(true) mail.mailDetailsDraft = null + mail.state = MailState.RECEIVED mail.mailDetails = mailDetailsBlob await viewModel.loadAll(Promise.resolve()) diff --git a/tuta-sdk/rust/sdk/src/entities/entity_facade.rs b/tuta-sdk/rust/sdk/src/entities/entity_facade.rs index cd4042ba71..fd7a6aaaab 100644 --- a/tuta-sdk/rust/sdk/src/entities/entity_facade.rs +++ b/tuta-sdk/rust/sdk/src/entities/entity_facade.rs @@ -1823,7 +1823,8 @@ mod tests { ), "1769"=> JsonElement::String( "0".to_string() - ) + ), + "1783"=> JsonElement::Null } } diff --git a/tuta-sdk/rust/sdk/test_data/email_response.json b/tuta-sdk/rust/sdk/test_data/email_response.json index 27d76c63bb..4527d808f9 100644 --- a/tuta-sdk/rust/sdk/test_data/email_response.json +++ b/tuta-sdk/rust/sdk/test_data/email_response.json @@ -44,5 +44,6 @@ "1677": null, "1728": "1", "1729": [], - "1769": "0" + "1769": "0", + "1783": null } diff --git a/tuta-sdk/rust/sdk/test_data/email_response_attachments.json b/tuta-sdk/rust/sdk/test_data/email_response_attachments.json index f4bedd1a4b..c26c79ea8f 100644 --- a/tuta-sdk/rust/sdk/test_data/email_response_attachments.json +++ b/tuta-sdk/rust/sdk/test_data/email_response_attachments.json @@ -44,5 +44,6 @@ "1677": null, "1728": "1", "1729": [], - "1769": "0" + "1769": "0", + "1783": null } diff --git a/tuta-sdk/rust/sdk/test_data/email_response_empty_encrypted_boolean_defaults_to_false.json b/tuta-sdk/rust/sdk/test_data/email_response_empty_encrypted_boolean_defaults_to_false.json index 27d76c63bb..4527d808f9 100644 --- a/tuta-sdk/rust/sdk/test_data/email_response_empty_encrypted_boolean_defaults_to_false.json +++ b/tuta-sdk/rust/sdk/test_data/email_response_empty_encrypted_boolean_defaults_to_false.json @@ -44,5 +44,6 @@ "1677": null, "1728": "1", "1729": [], - "1769": "0" + "1769": "0", + "1783": null } diff --git a/tuta-sdk/rust/sdk/tests/download_mail_test/mail.json b/tuta-sdk/rust/sdk/tests/download_mail_test/mail.json index 058d1c0c07..52d1c6b393 100644 --- a/tuta-sdk/rust/sdk/tests/download_mail_test/mail.json +++ b/tuta-sdk/rust/sdk/tests/download_mail_test/mail.json @@ -44,5 +44,6 @@ "1677": null, "1728": "1", "1729": [], - "1769": "1" + "1769": "1", + "1783": null }