From c47253fc5f508bb1d5af195f12f7fbbe987a369c Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 13 Jul 2023 12:54:17 -0300 Subject: [PATCH 1/3] Mark our own reblogs as read automatically --- .../main/java/org/briarproject/briar/blog/BlogManagerImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java index 77786f026..0280a727b 100644 --- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java @@ -281,6 +281,7 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager, meta.put(KEY_ORIGINAL_PARENT_MSG_ID, parentOriginalId); meta.put(KEY_PARENT_MSG_ID, parentCurrentId); meta.put(KEY_AUTHOR, clientHelper.toList(author)); + meta.put(KEY_READ, true); // Send comment clientHelper.addLocalMessage(txn, message, meta, true, false); From 8f735d176ebf4d56caa310cedb2371ac5cdcf977 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 13 Jul 2023 13:01:30 -0300 Subject: [PATCH 2/3] Add transactional versions of BlogManager methods --- .../briar/api/blog/BlogManager.java | 17 ++++++++ .../briar/blog/BlogManagerImpl.java | 41 ++++++++++++------- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java index b7cc96f41..2af8eae6e 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java @@ -74,6 +74,13 @@ public interface BlogManager { @Nullable String comment, BlogPostHeader parentHeader) throws DbException; + /** + * Adds a comment to an existing blog post or reblogs it. + */ + void addLocalComment(Transaction txn, LocalAuthor author, + GroupId groupId, @Nullable String comment, + BlogPostHeader parentHeader) throws DbException; + /** * Returns the blog with the given ID. */ @@ -99,6 +106,11 @@ public interface BlogManager { */ Collection getBlogs() throws DbException; + /** + * Returns all blogs to which the user subscribes. + */ + Collection getBlogs(Transaction txn) throws DbException; + /** * Returns the group IDs of all blogs to which the user subscribes. */ @@ -136,6 +148,11 @@ public interface BlogManager { */ void setReadFlag(MessageId m, boolean read) throws DbException; + /** + * Marks a blog post as read or unread. + */ + void setReadFlag(Transaction txn, MessageId m, boolean read) throws DbException; + /** * Registers a hook to be called whenever a blog is removed. */ diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java index 0280a727b..e230d21c8 100644 --- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java @@ -257,12 +257,19 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager, public void addLocalComment(LocalAuthor author, GroupId groupId, @Nullable String comment, BlogPostHeader parentHeader) throws DbException { + db.transaction(false, txn -> { + addLocalComment(txn, author, groupId, comment, parentHeader); + }); + } + @Override + public void addLocalComment(Transaction txn, LocalAuthor author, + GroupId groupId, @Nullable String comment, + BlogPostHeader parentHeader) throws DbException { MessageType type = parentHeader.getType(); if (type != POST && type != COMMENT) throw new IllegalArgumentException("Comment on unknown type!"); - Transaction txn = db.startTransaction(false); try { // Wrap post that we are commenting on MessageId parentOriginalId = @@ -291,13 +298,10 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager, message.getId(), meta); BlogPostAddedEvent event = new BlogPostAddedEvent(groupId, h, true); txn.attach(event); - db.commitTransaction(txn); } catch (FormatException e) { throw new DbException(e); } catch (GeneralSecurityException e) { throw new IllegalArgumentException("Invalid key of author", e); - } finally { - db.endTransaction(txn); } } @@ -430,18 +434,17 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager, @Override public Collection getBlogs() throws DbException { + return db.transactionWithResult(true, this::getBlogs); + } + + @Override + public Collection getBlogs(Transaction txn) throws DbException { try { List blogs = new ArrayList<>(); - Collection groups; - Transaction txn = db.startTransaction(true); - try { - groups = db.getGroups(txn, CLIENT_ID, MAJOR_VERSION); - for (Group g : groups) { - blogs.add(blogFactory.parseBlog(g)); - } - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); + Collection groups = + db.getGroups(txn, CLIENT_ID, MAJOR_VERSION); + for (Group g : groups) { + blogs.add(blogFactory.parseBlog(g)); } return blogs; } catch (FormatException e) { @@ -556,10 +559,18 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager, @Override public void setReadFlag(MessageId m, boolean read) throws DbException { + db.transaction(true, txn -> { + setReadFlag(txn, m, read); + }); + } + + @Override + public void setReadFlag(Transaction txn, MessageId m, boolean read) + throws DbException { try { BdfDictionary meta = new BdfDictionary(); meta.put(KEY_READ, read); - clientHelper.mergeMessageMetadata(m, meta); + clientHelper.mergeMessageMetadata(txn, m, meta); } catch (FormatException e) { throw new RuntimeException(e); } From f61b09d5a990b6e2ff0005bb5966cb4bf16d3818 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 13 Jul 2023 14:50:05 -0300 Subject: [PATCH 3/3] Fix BlogManager tests after last commits --- .../briar/blog/BlogManagerImplTest.java | 41 ++++++++----------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java index c7be26e3d..b83df71b0 100644 --- a/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java @@ -20,6 +20,7 @@ import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.test.BrambleMockTestCase; +import org.briarproject.bramble.test.DbExpectations; import org.briarproject.briar.api.blog.Blog; import org.briarproject.briar.api.blog.BlogCommentHeader; import org.briarproject.briar.api.blog.BlogFactory; @@ -396,12 +397,12 @@ public class BlogManagerImplTest extends BrambleMockTestCase { new BdfEntry(KEY_ORIGINAL_MSG_ID, commentId), new BdfEntry(KEY_ORIGINAL_PARENT_MSG_ID, messageId), new BdfEntry(KEY_PARENT_MSG_ID, messageId), - new BdfEntry(KEY_AUTHOR, authorList1) + new BdfEntry(KEY_AUTHOR, authorList1), + new BdfEntry(KEY_READ, true) ); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transaction(with(false), withDbRunnable(txn)); // Create the comment oneOf(blogPostFactory).createBlogComment(blog1.getId(), localAuthor1, comment, messageId, messageId); @@ -422,8 +423,6 @@ public class BlogManagerImplTest extends BrambleMockTestCase { will(returnValue(localAuthor1)); oneOf(authorManager).getAuthorInfo(txn, localAuthor1.getId()); will(returnValue(ourselvesInfo)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); BlogPostHeader postHeader = new BlogPostHeader(POST, blog1.getId(), @@ -492,12 +491,12 @@ public class BlogManagerImplTest extends BrambleMockTestCase { new BdfEntry(KEY_ORIGINAL_MSG_ID, commentId), new BdfEntry(KEY_ORIGINAL_PARENT_MSG_ID, messageId), new BdfEntry(KEY_PARENT_MSG_ID, wrappedPostId), - new BdfEntry(KEY_AUTHOR, authorList2) + new BdfEntry(KEY_AUTHOR, authorList2), + new BdfEntry(KEY_READ, true) ); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transaction(with(false), withDbRunnable(txn)); // Wrap the original post for blog 2 oneOf(clientHelper).getMessageAsList(txn, messageId); will(returnValue(originalPostBody)); @@ -533,8 +532,6 @@ public class BlogManagerImplTest extends BrambleMockTestCase { will(returnValue(localAuthor1)); oneOf(authorManager).getAuthorInfo(txn, localAuthor1.getId()); will(returnValue(verifiedInfo)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); BlogPostHeader originalPostHeader = new BlogPostHeader(POST, @@ -603,12 +600,12 @@ public class BlogManagerImplTest extends BrambleMockTestCase { new BdfEntry(KEY_ORIGINAL_MSG_ID, commentId), new BdfEntry(KEY_ORIGINAL_PARENT_MSG_ID, rssMessageId), new BdfEntry(KEY_PARENT_MSG_ID, wrappedPostId), - new BdfEntry(KEY_AUTHOR, authorList1) + new BdfEntry(KEY_AUTHOR, authorList1), + new BdfEntry(KEY_READ, true) ); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transaction(with(false), withDbRunnable(txn)); // Wrap the original post for blog 1 oneOf(clientHelper).getMessageAsList(txn, rssMessageId); will(returnValue(originalPostBody)); @@ -642,8 +639,6 @@ public class BlogManagerImplTest extends BrambleMockTestCase { will(returnValue(wrappedPostMeta)); oneOf(clientHelper).parseAndValidateAuthor(rssAuthorList); will(returnValue(rssLocalAuthor)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); BlogPostHeader originalPostHeader = new BlogPostHeader(POST, @@ -728,12 +723,12 @@ public class BlogManagerImplTest extends BrambleMockTestCase { new BdfEntry(KEY_ORIGINAL_MSG_ID, localCommentId), new BdfEntry(KEY_ORIGINAL_PARENT_MSG_ID, originalCommentId), new BdfEntry(KEY_PARENT_MSG_ID, wrappedCommentId), - new BdfEntry(KEY_AUTHOR, authorList2) + new BdfEntry(KEY_AUTHOR, authorList2), + new BdfEntry(KEY_READ, true) ); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transaction(with(false), withDbRunnable(txn)); // Rewrap the wrapped post for blog 2 oneOf(clientHelper).getMessageAsList(txn, wrappedPostId); will(returnValue(wrappedPostBody)); @@ -790,8 +785,6 @@ public class BlogManagerImplTest extends BrambleMockTestCase { will(returnValue(rewrappedPostMeta)); oneOf(clientHelper).parseAndValidateAuthor(rssAuthorList); will(returnValue(rssLocalAuthor)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); BlogPostHeader wrappedPostHeader = new BlogPostHeader(WRAPPED_POST,