From 49aaff968f5d097323da228b2b12c03de90a2de4 Mon Sep 17 00:00:00 2001 From: decentral1se <1991377+decentral1se@users.noreply.github.com> Date: Mon, 28 Mar 2022 12:48:00 +0200 Subject: [PATCH] fix: accept invites as an existing member is ok PR #302 Closes https://github.com/ssb-ngi-pointer/go-ssb-room/issues/299. Co-authored-by: decentral1se --- roomdb/sqlite/invites.go | 7 ++++++- roomdb/sqlite/invites_test.go | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/roomdb/sqlite/invites.go b/roomdb/sqlite/invites.go index 560c836..91f380d 100644 --- a/roomdb/sqlite/invites.go +++ b/roomdb/sqlite/invites.go @@ -130,8 +130,13 @@ func (i Invites) Consume(ctx context.Context, token string, newMember refs.FeedR } _, err = i.members.add(ctx, tx, newMember, roomdb.RoleMember) + var alreadyAdded roomdb.ErrAlreadyAdded if err != nil { - return err + if errors.As(err, &alreadyAdded) && alreadyAdded.Ref.Equal(&newMember) { + // it is fine to use an invite twice + } else { + return err + } } // invalidate the invite for consumption diff --git a/roomdb/sqlite/invites_test.go b/roomdb/sqlite/invites_test.go index 1f5a127..8b9b797 100644 --- a/roomdb/sqlite/invites_test.go +++ b/roomdb/sqlite/invites_test.go @@ -132,4 +132,21 @@ func TestInvites(t *testing.T) { r.Error(err, "failed to consume the invite") }) + t.Run("invite member again", func(t *testing.T) { + r := require.New(t) + + tok, err := db.Invites.Create(ctx, mid) + r.NoError(err, "failed to create invite token") + + lst, err := db.Invites.List(ctx) + r.NoError(err, "failed to get list of tokens") + r.Len(lst, 1, "expected 1 invite") + + _, err = db.Invites.Consume(ctx, tok, newMember) + r.NoError(err, "failed to consume the invite") + + lst, err = db.Invites.List(ctx) + r.NoError(err, "failed to get list of tokens post consume") + r.Len(lst, 0, "expected no active invites") + }) }