Process membership updates in writers (#1414)

main
Neil Alexander 2020-09-08 17:48:07 +01:00 committed by GitHub
parent a0f2a4510f
commit 35564dd73c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 81 additions and 67 deletions

View File

@ -79,89 +79,103 @@ func (u *MembershipUpdater) IsLeave() bool {
// SetToInvite implements types.MembershipUpdater // SetToInvite implements types.MembershipUpdater
func (u *MembershipUpdater) SetToInvite(event gomatrixserverlib.Event) (bool, error) { func (u *MembershipUpdater) SetToInvite(event gomatrixserverlib.Event) (bool, error) {
senderUserNID, err := u.d.assignStateKeyNID(u.ctx, u.txn, event.Sender()) var inserted bool
if err != nil { err := u.d.Writer.Do(u.d.DB, u.txn, func(txn *sql.Tx) error {
return false, fmt.Errorf("u.d.AssignStateKeyNID: %w", err) senderUserNID, err := u.d.assignStateKeyNID(u.ctx, u.txn, event.Sender())
} if err != nil {
inserted, err := u.d.InvitesTable.InsertInviteEvent( return fmt.Errorf("u.d.AssignStateKeyNID: %w", err)
u.ctx, u.txn, event.EventID(), u.roomNID, u.targetUserNID, senderUserNID, event.JSON(),
)
if err != nil {
return false, fmt.Errorf("u.d.InvitesTable.InsertInviteEvent: %w", err)
}
if u.membership != tables.MembershipStateInvite {
if err = u.d.MembershipTable.UpdateMembership(
u.ctx, u.txn, u.roomNID, u.targetUserNID, senderUserNID, tables.MembershipStateInvite, 0,
); err != nil {
return false, fmt.Errorf("u.d.MembershipTable.UpdateMembership: %w", err)
} }
} inserted, err = u.d.InvitesTable.InsertInviteEvent(
return inserted, nil u.ctx, u.txn, event.EventID(), u.roomNID, u.targetUserNID, senderUserNID, event.JSON(),
)
if err != nil {
return fmt.Errorf("u.d.InvitesTable.InsertInviteEvent: %w", err)
}
if u.membership != tables.MembershipStateInvite {
if err = u.d.MembershipTable.UpdateMembership(
u.ctx, u.txn, u.roomNID, u.targetUserNID, senderUserNID, tables.MembershipStateInvite, 0,
); err != nil {
return fmt.Errorf("u.d.MembershipTable.UpdateMembership: %w", err)
}
}
return nil
})
return inserted, err
} }
// SetToJoin implements types.MembershipUpdater // SetToJoin implements types.MembershipUpdater
func (u *MembershipUpdater) SetToJoin(senderUserID string, eventID string, isUpdate bool) ([]string, error) { func (u *MembershipUpdater) SetToJoin(senderUserID string, eventID string, isUpdate bool) ([]string, error) {
var inviteEventIDs []string var inviteEventIDs []string
senderUserNID, err := u.d.assignStateKeyNID(u.ctx, u.txn, senderUserID) err := u.d.Writer.Do(u.d.DB, u.txn, func(txn *sql.Tx) error {
if err != nil { senderUserNID, err := u.d.assignStateKeyNID(u.ctx, u.txn, senderUserID)
return nil, fmt.Errorf("u.d.AssignStateKeyNID: %w", err)
}
// If this is a join event update, there is no invite to update
if !isUpdate {
inviteEventIDs, err = u.d.InvitesTable.UpdateInviteRetired(
u.ctx, u.txn, u.roomNID, u.targetUserNID,
)
if err != nil { if err != nil {
return nil, fmt.Errorf("u.d.InvitesTables.UpdateInviteRetired: %w", err) return fmt.Errorf("u.d.AssignStateKeyNID: %w", err)
} }
}
// Look up the NID of the new join event // If this is a join event update, there is no invite to update
nIDs, err := u.d.EventNIDs(u.ctx, []string{eventID}) if !isUpdate {
if err != nil { inviteEventIDs, err = u.d.InvitesTable.UpdateInviteRetired(
return nil, fmt.Errorf("u.d.EventNIDs: %w", err) u.ctx, u.txn, u.roomNID, u.targetUserNID,
} )
if err != nil {
if u.membership != tables.MembershipStateJoin || isUpdate { return fmt.Errorf("u.d.InvitesTables.UpdateInviteRetired: %w", err)
if err = u.d.MembershipTable.UpdateMembership( }
u.ctx, u.txn, u.roomNID, u.targetUserNID, senderUserNID,
tables.MembershipStateJoin, nIDs[eventID],
); err != nil {
return nil, fmt.Errorf("u.d.MembershipTable.UpdateMembership: %w", err)
} }
}
return inviteEventIDs, nil // Look up the NID of the new join event
nIDs, err := u.d.EventNIDs(u.ctx, []string{eventID})
if err != nil {
return fmt.Errorf("u.d.EventNIDs: %w", err)
}
if u.membership != tables.MembershipStateJoin || isUpdate {
if err = u.d.MembershipTable.UpdateMembership(
u.ctx, u.txn, u.roomNID, u.targetUserNID, senderUserNID,
tables.MembershipStateJoin, nIDs[eventID],
); err != nil {
return fmt.Errorf("u.d.MembershipTable.UpdateMembership: %w", err)
}
}
return nil
})
return inviteEventIDs, err
} }
// SetToLeave implements types.MembershipUpdater // SetToLeave implements types.MembershipUpdater
func (u *MembershipUpdater) SetToLeave(senderUserID string, eventID string) ([]string, error) { func (u *MembershipUpdater) SetToLeave(senderUserID string, eventID string) ([]string, error) {
senderUserNID, err := u.d.assignStateKeyNID(u.ctx, u.txn, senderUserID) var inviteEventIDs []string
if err != nil {
return nil, fmt.Errorf("u.d.AssignStateKeyNID: %w", err)
}
inviteEventIDs, err := u.d.InvitesTable.UpdateInviteRetired(
u.ctx, u.txn, u.roomNID, u.targetUserNID,
)
if err != nil {
return nil, fmt.Errorf("u.d.InvitesTable.updateInviteRetired: %w", err)
}
// Look up the NID of the new leave event err := u.d.Writer.Do(u.d.DB, u.txn, func(txn *sql.Tx) error {
nIDs, err := u.d.EventNIDs(u.ctx, []string{eventID}) senderUserNID, err := u.d.assignStateKeyNID(u.ctx, u.txn, senderUserID)
if err != nil { if err != nil {
return nil, fmt.Errorf("u.d.EventNIDs: %w", err) return fmt.Errorf("u.d.AssignStateKeyNID: %w", err)
}
if u.membership != tables.MembershipStateLeaveOrBan {
if err = u.d.MembershipTable.UpdateMembership(
u.ctx, u.txn, u.roomNID, u.targetUserNID, senderUserNID,
tables.MembershipStateLeaveOrBan, nIDs[eventID],
); err != nil {
return nil, fmt.Errorf("u.d.MembershipTable.UpdateMembership: %w", err)
} }
} inviteEventIDs, err = u.d.InvitesTable.UpdateInviteRetired(
return inviteEventIDs, nil u.ctx, u.txn, u.roomNID, u.targetUserNID,
)
if err != nil {
return fmt.Errorf("u.d.InvitesTable.updateInviteRetired: %w", err)
}
// Look up the NID of the new leave event
nIDs, err := u.d.EventNIDs(u.ctx, []string{eventID})
if err != nil {
return fmt.Errorf("u.d.EventNIDs: %w", err)
}
if u.membership != tables.MembershipStateLeaveOrBan {
if err = u.d.MembershipTable.UpdateMembership(
u.ctx, u.txn, u.roomNID, u.targetUserNID, senderUserNID,
tables.MembershipStateLeaveOrBan, nIDs[eventID],
); err != nil {
return fmt.Errorf("u.d.MembershipTable.UpdateMembership: %w", err)
}
}
return nil
})
return inviteEventIDs, err
} }