vttranlina commented on code in PR #2648: URL: https://github.com/apache/james-project/pull/2648#discussion_r1967297363
########## mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/RLSSupportPostgresMailboxMapper.java: ########## @@ -56,30 +57,36 @@ public Flux<Mailbox> findNonPersonalMailboxes(Username userName, MailboxACL.Righ @Override public Mono<ACLDiff> updateACL(Mailbox mailbox, MailboxACL.ACLCommand mailboxACLCommand) { - MailboxACL oldACL = mailbox.getACL(); - MailboxACL newACL = Throwing.supplier(() -> oldACL.apply(mailboxACLCommand)).get(); - ACLDiff aclDiff = ACLDiff.computeDiff(oldACL, newACL); - PositiveUserACLDiff userACLDiff = new PositiveUserACLDiff(aclDiff); - return upsertACL(mailbox, newACL, aclDiff, userACLDiff); + return postgresMailboxDAO.getACL(mailbox.getMailboxId()) + .flatMap(pairMailboxACLAndVersion -> { + try { + MailboxACL newACL = pairMailboxACLAndVersion.getLeft().apply(mailboxACLCommand); + return postgresMailboxDAO.upsertACL(mailbox.getMailboxId(), newACL, pairMailboxACLAndVersion.getRight()) + .thenReturn(ACLDiff.computeDiff(pairMailboxACLAndVersion.getLeft(), newACL)); + } catch (UnsupportedRightException e) { + throw new RuntimeException(e); + } + }).retryWhen(Retry.backoff(3, Duration.ofMillis(100)) + .filter(throwable -> throwable instanceof PostgresACLUpsertException)) + .flatMap(aclDiff -> updateMembersOfMailbox(mailbox, new PositiveUserACLDiff(aclDiff)) + .thenReturn(aclDiff)); } @Override public Mono<ACLDiff> setACL(Mailbox mailbox, MailboxACL mailboxACL) { - MailboxACL oldACL = mailbox.getACL(); - ACLDiff aclDiff = ACLDiff.computeDiff(oldACL, mailboxACL); - PositiveUserACLDiff userACLDiff = new PositiveUserACLDiff(aclDiff); - return upsertACL(mailbox, mailboxACL, aclDiff, userACLDiff); + return postgresMailboxDAO.getACL(mailbox.getMailboxId()) + .flatMap(pairMailboxACLAndVersion -> + postgresMailboxDAO.upsertACL(mailbox.getMailboxId(), mailboxACL, pairMailboxACLAndVersion.getRight()) + .thenReturn(ACLDiff.computeDiff(pairMailboxACLAndVersion.getLeft(), mailboxACL))).retryWhen(Retry.backoff(3, Duration.ofMillis(100)) + .filter(throwable -> throwable instanceof PostgresACLUpsertException)) + .flatMap(aclDiff -> updateMembersOfMailbox(mailbox, new PositiveUserACLDiff(aclDiff)) + .thenReturn(aclDiff)); } - private Mono<ACLDiff> upsertACL(Mailbox mailbox, MailboxACL newACL, ACLDiff aclDiff, PositiveUserACLDiff userACLDiff) { - return postgresMailboxDAO.upsertACL(mailbox.getMailboxId(), newACL) - .then(postgresMailboxMemberDAO.delete(PostgresMailboxId.class.cast(mailbox.getMailboxId()), - userACLDiff.removedEntries().map(entry -> Username.of(entry.getKey().getName())).toList())) + private Mono<Void> updateMembersOfMailbox(Mailbox mailbox, PositiveUserACLDiff userACLDiff) { + return postgresMailboxMemberDAO.delete(PostgresMailboxId.class.cast(mailbox.getMailboxId()), + userACLDiff.removedEntries().map(entry -> Username.of(entry.getKey().getName())).toList()) Review Comment: we can check case if `userACLDiff.removedEntries()` empty, then return Mono empty, don't need the trip query to database Similar with `userACLDiff.addedEntries()` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org