private List<MailboxMessage> findRelatedMailboxMessages(MessageId messageId, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); return messageIdMapper.find(ImmutableList.of(messageId), MessageMapper.FetchType.Full) .stream() .filter(hasRightsOn(mailboxSession, Right.Read)) .collect(Guavate.toImmutableList()); }
@Override public void setFlags(Flags newState, MessageManager.FlagsUpdateMode replace, MessageId messageId, List<MailboxId> mailboxIds, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); assertRightsOnMailboxes(mailboxIds, mailboxSession, Right.Write); Map<MailboxId, UpdatedFlags> updatedFlags = messageIdMapper.setFlags(messageId, mailboxIds, newState, replace); for (Map.Entry<MailboxId, UpdatedFlags> entry : updatedFlags.entrySet()) { dispatchFlagsChange(mailboxSession, entry.getKey(), entry.getValue()); } }
@Override public Result run() { try { MailboxSession session = mailboxManager.createSystemSession("MessageIdReIndexerImpl"); return mailboxSessionMapperFactory.getMessageIdMapper(session) .find(ImmutableList.of(messageId), MessageMapper.FetchType.Full) .stream() .map(mailboxMessage -> reIndex(mailboxMessage, session)) .reduce(Task::combine) .orElse(Result.COMPLETED); } catch (Exception e) { LOGGER.warn("Failed to re-index {}", messageId, e); return Result.PARTIAL; } }
@Override public Set<MessageId> accessibleMessages(Collection<MessageId> messageIds, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); List<MailboxMessage> messageList = messageIdMapper.find(messageIds, MessageMapper.FetchType.Metadata); ImmutableSet<MailboxId> allowedMailboxIds = getAllowedMailboxIds(mailboxSession, messageList, Right.Read); return messageList.stream() .filter(message -> allowedMailboxIds.contains(message.getMailboxId())) .map(MailboxMessage::getMessageId) .collect(Guavate.toImmutableSet()); }
@Override public List<MessageResult> getMessages(List<MessageId> messageIds, MessageResult.FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); List<MailboxMessage> messageList = messageIdMapper.find(messageIds, MessageMapper.FetchType.Full); ImmutableSet<MailboxId> allowedMailboxIds = getAllowedMailboxIds(mailboxSession, messageList, Right.Read); return messageList.stream() .filter(inMailboxes(allowedMailboxIds)) .map(Throwing.function(messageResultConverter(fetchGroup)).sneakyThrow()) .collect(Guavate.toImmutableList()); }
@Override public DeleteResult delete(MessageId messageId, List<MailboxId> mailboxIds, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); assertRightsOnMailboxes(mailboxIds, mailboxSession, Right.DeleteMessages); List<MailboxMessage> messageList = messageIdMapper .find(ImmutableList.of(messageId), MessageMapper.FetchType.Metadata) .stream() .filter(inMailboxes(mailboxIds)) .collect(Guavate.toImmutableList()); if (!messageList.isEmpty()) { delete(messageIdMapper, messageList, mailboxSession); return DeleteResult.destroyed(messageId); } return DeleteResult.notFound(messageId); }
@Override public DeleteResult delete(List<MessageId> messageIds, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); List<MailboxMessage> messageList = messageIdMapper.find(messageIds, MessageMapper.FetchType.Metadata); ImmutableSet<MailboxId> allowedMailboxIds = getAllowedMailboxIds(mailboxSession, messageList, Right.DeleteMessages); ImmutableSet<MessageId> accessibleMessages = messageList.stream() .filter(message -> allowedMailboxIds.contains(message.getMailboxId())) .map(MailboxMessage::getMessageId) .distinct() .collect(Guavate.toImmutableSet()); Sets.SetView<MessageId> nonAccessibleMessages = Sets.difference(ImmutableSet.copyOf(messageIds), accessibleMessages); delete(messageIdMapper, messageList, mailboxSession); return DeleteResult.builder() .addDestroyed(accessibleMessages) .addNotFound(nonAccessibleMessages) .build(); }
public void setInMailboxesNoCheck(MessageId messageId, MailboxId targetMailboxId, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); List<MailboxMessage> currentMailboxMessages = messageIdMapper.find(ImmutableList.of(messageId), MessageMapper.FetchType.Full); MessageMoves messageMoves = MessageMoves.builder() .previousMailboxIds(toMailboxIds(currentMailboxMessages)) .targetMailboxIds(targetMailboxId) .build(); if (messageMoves.isChange()) { applyMessageMoveNoMailboxChecks(mailboxSession, currentMailboxMessages, messageMoves); } }
private void removeMessageFromMailboxes(MailboxMessage message, Set<MailboxId> mailboxesToRemove, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession); SimpleMessageMetaData eventPayload = new SimpleMessageMetaData(message); for (MailboxId mailboxId: mailboxesToRemove) { messageIdMapper.delete(message.getMessageId(), mailboxesToRemove); dispatcher.expunged(mailboxSession, eventPayload, mailboxMapper.findMailboxById(mailboxId)); } }
private void addMessageToMailboxes(MailboxMessage mailboxMessage, Set<MailboxId> mailboxIds, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession); for (MailboxId mailboxId : mailboxIds) { boolean shouldPreserveFlags = mailboxManager.myRights(mailboxId, mailboxSession).contains(Right.Write); SimpleMailboxMessage copy = SimpleMailboxMessage.from(mailboxMessage) .mailboxId(mailboxId) .flags( FlagsFactory .builder() .flags(mailboxMessage.createFlags()) .filteringFlags( FlagsFilter.builder() .systemFlagFilter(f -> shouldPreserveFlags) .userFlagFilter(f -> shouldPreserveFlags) .build()) .build()) .build(); save(mailboxSession, messageIdMapper, copy); dispatcher.added(mailboxSession, mailboxMapper.findMailboxById(mailboxId), copy); } }