aboutsummaryrefslogtreecommitdiff
path: root/userapi
diff options
context:
space:
mode:
authorKegsay <kegan@matrix.org>2020-06-30 13:34:59 +0100
committerGitHub <noreply@github.com>2020-06-30 13:34:59 +0100
commit6f49758b90d655d9c2bb9170da2ea1d0a2bdd664 (patch)
treef434cc48f27c3915fffdb39c5b907fd021d4ff61 /userapi
parentca5bbffd8d987b220c8f8eb888a2fc9b9cef104c (diff)
Remove membership table from account DB (#1172)
* Remove membership table from account DB And make code which needs that data use the currentstate server * Unbreak tests; use a membership enum for space
Diffstat (limited to 'userapi')
-rw-r--r--userapi/storage/accounts/interface.go5
-rw-r--r--userapi/storage/accounts/postgres/membership_table.go159
-rw-r--r--userapi/storage/accounts/postgres/storage.go113
-rw-r--r--userapi/storage/accounts/sqlite3/membership_table.go159
-rw-r--r--userapi/storage/accounts/sqlite3/storage.go113
5 files changed, 2 insertions, 547 deletions
diff --git a/userapi/storage/accounts/interface.go b/userapi/storage/accounts/interface.go
index 9ed33e1b..6f6caf11 100644
--- a/userapi/storage/accounts/interface.go
+++ b/userapi/storage/accounts/interface.go
@@ -22,7 +22,6 @@ import (
"github.com/matrix-org/dendrite/clientapi/auth/authtypes"
"github.com/matrix-org/dendrite/internal"
"github.com/matrix-org/dendrite/userapi/api"
- "github.com/matrix-org/gomatrixserverlib"
)
type Database interface {
@@ -36,10 +35,6 @@ type Database interface {
// account already exists, it will return nil, ErrUserExists.
CreateAccount(ctx context.Context, localpart, plaintextPassword, appserviceID string) (*api.Account, error)
CreateGuestAccount(ctx context.Context) (*api.Account, error)
- UpdateMemberships(ctx context.Context, eventsToAdd []gomatrixserverlib.Event, idsToRemove []string) error
- GetMembershipInRoomByLocalpart(ctx context.Context, localpart, roomID string) (authtypes.Membership, error)
- GetRoomIDsByLocalPart(ctx context.Context, localpart string) ([]string, error)
- GetMembershipsByLocalpart(ctx context.Context, localpart string) (memberships []authtypes.Membership, err error)
SaveAccountData(ctx context.Context, localpart, roomID, dataType string, content json.RawMessage) error
GetAccountData(ctx context.Context, localpart string) (global map[string]json.RawMessage, rooms map[string]map[string]json.RawMessage, err error)
// GetAccountDataByType returns account data matching a given
diff --git a/userapi/storage/accounts/postgres/membership_table.go b/userapi/storage/accounts/postgres/membership_table.go
deleted file mode 100644
index 623530ac..00000000
--- a/userapi/storage/accounts/postgres/membership_table.go
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright 2017 Vector Creations Ltd
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package postgres
-
-import (
- "context"
- "database/sql"
-
- "github.com/lib/pq"
- "github.com/matrix-org/dendrite/clientapi/auth/authtypes"
- "github.com/matrix-org/dendrite/internal"
-)
-
-const membershipSchema = `
--- Stores data about users memberships to rooms.
-CREATE TABLE IF NOT EXISTS account_memberships (
- -- The Matrix user ID localpart for the member
- localpart TEXT NOT NULL,
- -- The room this user is a member of
- room_id TEXT NOT NULL,
- -- The ID of the join membership event
- event_id TEXT NOT NULL,
-
- -- A user can only be member of a room once
- PRIMARY KEY (localpart, room_id)
-);
-
--- Use index to process deletion by ID more efficiently
-CREATE UNIQUE INDEX IF NOT EXISTS account_membership_event_id ON account_memberships(event_id);
-`
-
-const insertMembershipSQL = `
- INSERT INTO account_memberships(localpart, room_id, event_id) VALUES ($1, $2, $3)
- ON CONFLICT (localpart, room_id) DO UPDATE SET event_id = EXCLUDED.event_id
-`
-
-const selectMembershipsByLocalpartSQL = "" +
- "SELECT room_id, event_id FROM account_memberships WHERE localpart = $1"
-
-const selectMembershipInRoomByLocalpartSQL = "" +
- "SELECT event_id FROM account_memberships WHERE localpart = $1 AND room_id = $2"
-
-const selectRoomIDsByLocalPartSQL = "" +
- "SELECT room_id FROM account_memberships WHERE localpart = $1"
-
-const deleteMembershipsByEventIDsSQL = "" +
- "DELETE FROM account_memberships WHERE event_id = ANY($1)"
-
-type membershipStatements struct {
- deleteMembershipsByEventIDsStmt *sql.Stmt
- insertMembershipStmt *sql.Stmt
- selectMembershipInRoomByLocalpartStmt *sql.Stmt
- selectMembershipsByLocalpartStmt *sql.Stmt
- selectRoomIDsByLocalPartStmt *sql.Stmt
-}
-
-func (s *membershipStatements) prepare(db *sql.DB) (err error) {
- _, err = db.Exec(membershipSchema)
- if err != nil {
- return
- }
- if s.deleteMembershipsByEventIDsStmt, err = db.Prepare(deleteMembershipsByEventIDsSQL); err != nil {
- return
- }
- if s.insertMembershipStmt, err = db.Prepare(insertMembershipSQL); err != nil {
- return
- }
- if s.selectMembershipInRoomByLocalpartStmt, err = db.Prepare(selectMembershipInRoomByLocalpartSQL); err != nil {
- return
- }
- if s.selectMembershipsByLocalpartStmt, err = db.Prepare(selectMembershipsByLocalpartSQL); err != nil {
- return
- }
- if s.selectRoomIDsByLocalPartStmt, err = db.Prepare(selectRoomIDsByLocalPartSQL); err != nil {
- return
- }
- return
-}
-
-func (s *membershipStatements) insertMembership(
- ctx context.Context, txn *sql.Tx, localpart, roomID, eventID string,
-) (err error) {
- stmt := txn.Stmt(s.insertMembershipStmt)
- _, err = stmt.ExecContext(ctx, localpart, roomID, eventID)
- return
-}
-
-func (s *membershipStatements) deleteMembershipsByEventIDs(
- ctx context.Context, txn *sql.Tx, eventIDs []string,
-) (err error) {
- stmt := txn.Stmt(s.deleteMembershipsByEventIDsStmt)
- _, err = stmt.ExecContext(ctx, pq.StringArray(eventIDs))
- return
-}
-
-func (s *membershipStatements) selectMembershipInRoomByLocalpart(
- ctx context.Context, localpart, roomID string,
-) (authtypes.Membership, error) {
- membership := authtypes.Membership{Localpart: localpart, RoomID: roomID}
- stmt := s.selectMembershipInRoomByLocalpartStmt
- err := stmt.QueryRowContext(ctx, localpart, roomID).Scan(&membership.EventID)
-
- return membership, err
-}
-
-func (s *membershipStatements) selectMembershipsByLocalpart(
- ctx context.Context, localpart string,
-) (memberships []authtypes.Membership, err error) {
- stmt := s.selectMembershipsByLocalpartStmt
- rows, err := stmt.QueryContext(ctx, localpart)
- if err != nil {
- return
- }
-
- memberships = []authtypes.Membership{}
-
- defer internal.CloseAndLogIfError(ctx, rows, "selectMembershipsByLocalpart: rows.close() failed")
- for rows.Next() {
- var m authtypes.Membership
- m.Localpart = localpart
- if err = rows.Scan(&m.RoomID, &m.EventID); err != nil {
- return
- }
- memberships = append(memberships, m)
- }
- return memberships, rows.Err()
-}
-
-func (s *membershipStatements) selectRoomIDsByLocalPart(
- ctx context.Context, localPart string,
-) ([]string, error) {
- stmt := s.selectRoomIDsByLocalPartStmt
- rows, err := stmt.QueryContext(ctx, localPart)
- if err != nil {
- return nil, err
- }
- roomIDs := []string{}
- defer rows.Close() // nolint: errcheck
- for rows.Next() {
- var roomID string
- if err = rows.Scan(&roomID); err != nil {
- return nil, err
- }
- roomIDs = append(roomIDs, roomID)
- }
- return roomIDs, rows.Err()
-}
diff --git a/userapi/storage/accounts/postgres/storage.go b/userapi/storage/accounts/postgres/storage.go
index f0b11bfd..c76b92f1 100644
--- a/userapi/storage/accounts/postgres/storage.go
+++ b/userapi/storage/accounts/postgres/storage.go
@@ -37,7 +37,6 @@ type Database struct {
sqlutil.PartitionOffsetStatements
accounts accountsStatements
profiles profilesStatements
- memberships membershipStatements
accountDatas accountDataStatements
threepids threepidStatements
serverName gomatrixserverlib.ServerName
@@ -62,10 +61,6 @@ func NewDatabase(dataSourceName string, dbProperties sqlutil.DbProperties, serve
if err = p.prepare(db); err != nil {
return nil, err
}
- m := membershipStatements{}
- if err = m.prepare(db); err != nil {
- return nil, err
- }
ac := accountDataStatements{}
if err = ac.prepare(db); err != nil {
return nil, err
@@ -74,7 +69,7 @@ func NewDatabase(dataSourceName string, dbProperties sqlutil.DbProperties, serve
if err = t.prepare(db); err != nil {
return nil, err
}
- return &Database{db, partitions, a, p, m, ac, t, serverName}, nil
+ return &Database{db, partitions, a, p, ac, t, serverName}, nil
}
// GetAccountByPassword returns the account associated with the given localpart and password.
@@ -179,112 +174,6 @@ func (d *Database) createAccount(
return d.accounts.insertAccount(ctx, txn, localpart, hash, appserviceID)
}
-// SaveMembership saves the user matching a given localpart as a member of a given
-// room. It also stores the ID of the membership event.
-// If a membership already exists between the user and the room, or if the
-// insert fails, returns the SQL error
-func (d *Database) saveMembership(
- ctx context.Context, txn *sql.Tx, localpart, roomID, eventID string,
-) error {
- return d.memberships.insertMembership(ctx, txn, localpart, roomID, eventID)
-}
-
-// removeMembershipsByEventIDs removes the memberships corresponding to the
-// `join` membership events IDs in the eventIDs slice.
-// If the removal fails, or if there is no membership to remove, returns an error
-func (d *Database) removeMembershipsByEventIDs(
- ctx context.Context, txn *sql.Tx, eventIDs []string,
-) error {
- return d.memberships.deleteMembershipsByEventIDs(ctx, txn, eventIDs)
-}
-
-// UpdateMemberships adds the "join" membership events included in a given state
-// events array, and removes those which ID is included in a given array of events
-// IDs. All of the process is run in a transaction, which commits only once/if every
-// insertion and deletion has been successfully processed.
-// Returns a SQL error if there was an issue with any part of the process
-func (d *Database) UpdateMemberships(
- ctx context.Context, eventsToAdd []gomatrixserverlib.Event, idsToRemove []string,
-) error {
- return sqlutil.WithTransaction(d.db, func(txn *sql.Tx) error {
- if err := d.removeMembershipsByEventIDs(ctx, txn, idsToRemove); err != nil {
- return err
- }
-
- for _, event := range eventsToAdd {
- if err := d.newMembership(ctx, txn, event); err != nil {
- return err
- }
- }
-
- return nil
- })
-}
-
-// GetMembershipInRoomByLocalpart returns the membership for an user
-// matching the given localpart if he is a member of the room matching roomID,
-// if not sql.ErrNoRows is returned.
-// If there was an issue during the retrieval, returns the SQL error
-func (d *Database) GetMembershipInRoomByLocalpart(
- ctx context.Context, localpart, roomID string,
-) (authtypes.Membership, error) {
- return d.memberships.selectMembershipInRoomByLocalpart(ctx, localpart, roomID)
-}
-
-// GetRoomIDsByLocalPart returns an array containing the room ids of all
-// the rooms a user matching a given localpart is a member of
-// If no membership match the given localpart, returns an empty array
-// If there was an issue during the retrieval, returns the SQL error
-func (d *Database) GetRoomIDsByLocalPart(
- ctx context.Context, localpart string,
-) ([]string, error) {
- return d.memberships.selectRoomIDsByLocalPart(ctx, localpart)
-}
-
-// GetMembershipsByLocalpart returns an array containing the memberships for all
-// the rooms a user matching a given localpart is a member of
-// If no membership match the given localpart, returns an empty array
-// If there was an issue during the retrieval, returns the SQL error
-func (d *Database) GetMembershipsByLocalpart(
- ctx context.Context, localpart string,
-) (memberships []authtypes.Membership, err error) {
- return d.memberships.selectMembershipsByLocalpart(ctx, localpart)
-}
-
-// newMembership saves a new membership in the database.
-// If the event isn't a valid m.room.member event with type `join`, does nothing.
-// If an error occurred, returns the SQL error
-func (d *Database) newMembership(
- ctx context.Context, txn *sql.Tx, ev gomatrixserverlib.Event,
-) error {
- if ev.Type() == "m.room.member" && ev.StateKey() != nil {
- localpart, serverName, err := gomatrixserverlib.SplitID('@', *ev.StateKey())
- if err != nil {
- return err
- }
-
- // We only want state events from local users
- if string(serverName) != string(d.serverName) {
- return nil
- }
-
- eventID := ev.EventID()
- roomID := ev.RoomID()
- membership, err := ev.Membership()
- if err != nil {
- return err
- }
-
- // Only "join" membership events can be considered as new memberships
- if membership == gomatrixserverlib.Join {
- if err := d.saveMembership(ctx, txn, localpart, roomID, eventID); err != nil {
- return err
- }
- }
- }
- return nil
-}
-
// SaveAccountData saves new account data for a given user and a given room.
// If the account data is not specific to a room, the room ID should be an empty string
// If an account data already exists for a given set (user, room, data type), it will
diff --git a/userapi/storage/accounts/sqlite3/membership_table.go b/userapi/storage/accounts/sqlite3/membership_table.go
deleted file mode 100644
index 67958f27..00000000
--- a/userapi/storage/accounts/sqlite3/membership_table.go
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright 2017 Vector Creations Ltd
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package sqlite3
-
-import (
- "context"
- "database/sql"
- "strings"
-
- "github.com/matrix-org/dendrite/clientapi/auth/authtypes"
- "github.com/matrix-org/dendrite/internal"
- "github.com/matrix-org/dendrite/internal/sqlutil"
-)
-
-const membershipSchema = `
--- Stores data about users memberships to rooms.
-CREATE TABLE IF NOT EXISTS account_memberships (
- -- The Matrix user ID localpart for the member
- localpart TEXT NOT NULL,
- -- The room this user is a member of
- room_id TEXT NOT NULL,
- -- The ID of the join membership event
- event_id TEXT NOT NULL,
-
- -- A user can only be member of a room once
- PRIMARY KEY (localpart, room_id),
-
- UNIQUE (event_id)
-);
-`
-
-const insertMembershipSQL = `
- INSERT INTO account_memberships(localpart, room_id, event_id) VALUES ($1, $2, $3)
- ON CONFLICT (localpart, room_id) DO UPDATE SET event_id = EXCLUDED.event_id
-`
-
-const selectMembershipsByLocalpartSQL = "" +
- "SELECT room_id, event_id FROM account_memberships WHERE localpart = $1"
-
-const selectMembershipInRoomByLocalpartSQL = "" +
- "SELECT event_id FROM account_memberships WHERE localpart = $1 AND room_id = $2"
-
-const selectRoomIDsByLocalPartSQL = "" +
- "SELECT room_id FROM account_memberships WHERE localpart = $1"
-
-const deleteMembershipsByEventIDsSQL = "" +
- "DELETE FROM account_memberships WHERE event_id IN ($1)"
-
-type membershipStatements struct {
- insertMembershipStmt *sql.Stmt
- selectMembershipInRoomByLocalpartStmt *sql.Stmt
- selectMembershipsByLocalpartStmt *sql.Stmt
- selectRoomIDsByLocalPartStmt *sql.Stmt
-}
-
-func (s *membershipStatements) prepare(db *sql.DB) (err error) {
- _, err = db.Exec(membershipSchema)
- if err != nil {
- return
- }
- if s.insertMembershipStmt, err = db.Prepare(insertMembershipSQL); err != nil {
- return
- }
- if s.selectMembershipInRoomByLocalpartStmt, err = db.Prepare(selectMembershipInRoomByLocalpartSQL); err != nil {
- return
- }
- if s.selectMembershipsByLocalpartStmt, err = db.Prepare(selectMembershipsByLocalpartSQL); err != nil {
- return
- }
- if s.selectRoomIDsByLocalPartStmt, err = db.Prepare(selectRoomIDsByLocalPartSQL); err != nil {
- return
- }
- return
-}
-
-func (s *membershipStatements) insertMembership(
- ctx context.Context, txn *sql.Tx, localpart, roomID, eventID string,
-) (err error) {
- stmt := txn.Stmt(s.insertMembershipStmt)
- _, err = stmt.ExecContext(ctx, localpart, roomID, eventID)
- return
-}
-
-func (s *membershipStatements) deleteMembershipsByEventIDs(
- ctx context.Context, txn *sql.Tx, eventIDs []string,
-) (err error) {
- sqlStr := strings.Replace(deleteMembershipsByEventIDsSQL, "($1)", sqlutil.QueryVariadic(len(eventIDs)), 1)
- iEventIDs := make([]interface{}, len(eventIDs))
- for i, e := range eventIDs {
- iEventIDs[i] = e
- }
- _, err = txn.ExecContext(ctx, sqlStr, iEventIDs...)
- return
-}
-
-func (s *membershipStatements) selectMembershipInRoomByLocalpart(
- ctx context.Context, localpart, roomID string,
-) (authtypes.Membership, error) {
- membership := authtypes.Membership{Localpart: localpart, RoomID: roomID}
- stmt := s.selectMembershipInRoomByLocalpartStmt
- err := stmt.QueryRowContext(ctx, localpart, roomID).Scan(&membership.EventID)
-
- return membership, err
-}
-
-func (s *membershipStatements) selectMembershipsByLocalpart(
- ctx context.Context, localpart string,
-) (memberships []authtypes.Membership, err error) {
- stmt := s.selectMembershipsByLocalpartStmt
- rows, err := stmt.QueryContext(ctx, localpart)
- if err != nil {
- return
- }
-
- memberships = []authtypes.Membership{}
-
- defer internal.CloseAndLogIfError(ctx, rows, "selectMembershipsByLocalpart: rows.close() failed")
- for rows.Next() {
- var m authtypes.Membership
- m.Localpart = localpart
- if err := rows.Scan(&m.RoomID, &m.EventID); err != nil {
- return nil, err
- }
- memberships = append(memberships, m)
- }
-
- return
-}
-func (s *membershipStatements) selectRoomIDsByLocalPart(
- ctx context.Context, localPart string,
-) ([]string, error) {
- stmt := s.selectRoomIDsByLocalPartStmt
- rows, err := stmt.QueryContext(ctx, localPart)
- if err != nil {
- return nil, err
- }
- roomIDs := []string{}
- defer rows.Close() // nolint: errcheck
- for rows.Next() {
- var roomID string
- if err = rows.Scan(&roomID); err != nil {
- return nil, err
- }
- roomIDs = append(roomIDs, roomID)
- }
- return roomIDs, rows.Err()
-}
diff --git a/userapi/storage/accounts/sqlite3/storage.go b/userapi/storage/accounts/sqlite3/storage.go
index e965df4f..72b27c8b 100644
--- a/userapi/storage/accounts/sqlite3/storage.go
+++ b/userapi/storage/accounts/sqlite3/storage.go
@@ -36,7 +36,6 @@ type Database struct {
sqlutil.PartitionOffsetStatements
accounts accountsStatements
profiles profilesStatements
- memberships membershipStatements
accountDatas accountDataStatements
threepids threepidStatements
serverName gomatrixserverlib.ServerName
@@ -67,10 +66,6 @@ func NewDatabase(dataSourceName string, serverName gomatrixserverlib.ServerName)
if err = p.prepare(db); err != nil {
return nil, err
}
- m := membershipStatements{}
- if err = m.prepare(db); err != nil {
- return nil, err
- }
ac := accountDataStatements{}
if err = ac.prepare(db); err != nil {
return nil, err
@@ -79,7 +74,7 @@ func NewDatabase(dataSourceName string, serverName gomatrixserverlib.ServerName)
if err = t.prepare(db); err != nil {
return nil, err
}
- return &Database{db, partitions, a, p, m, ac, t, serverName, sync.Mutex{}}, nil
+ return &Database{db, partitions, a, p, ac, t, serverName, sync.Mutex{}}, nil
}
// GetAccountByPassword returns the account associated with the given localpart and password.
@@ -193,112 +188,6 @@ func (d *Database) createAccount(
return d.accounts.insertAccount(ctx, txn, localpart, hash, appserviceID)
}
-// SaveMembership saves the user matching a given localpart as a member of a given
-// room. It also stores the ID of the membership event.
-// If a membership already exists between the user and the room, or if the
-// insert fails, returns the SQL error
-func (d *Database) saveMembership(
- ctx context.Context, txn *sql.Tx, localpart, roomID, eventID string,
-) error {
- return d.memberships.insertMembership(ctx, txn, localpart, roomID, eventID)
-}
-
-// removeMembershipsByEventIDs removes the memberships corresponding to the
-// `join` membership events IDs in the eventIDs slice.
-// If the removal fails, or if there is no membership to remove, returns an error
-func (d *Database) removeMembershipsByEventIDs(
- ctx context.Context, txn *sql.Tx, eventIDs []string,
-) error {
- return d.memberships.deleteMembershipsByEventIDs(ctx, txn, eventIDs)
-}
-
-// UpdateMemberships adds the "join" membership events included in a given state
-// events array, and removes those which ID is included in a given array of events
-// IDs. All of the process is run in a transaction, which commits only once/if every
-// insertion and deletion has been successfully processed.
-// Returns a SQL error if there was an issue with any part of the process
-func (d *Database) UpdateMemberships(
- ctx context.Context, eventsToAdd []gomatrixserverlib.Event, idsToRemove []string,
-) error {
- return sqlutil.WithTransaction(d.db, func(txn *sql.Tx) error {
- if err := d.removeMembershipsByEventIDs(ctx, txn, idsToRemove); err != nil {
- return err
- }
-
- for _, event := range eventsToAdd {
- if err := d.newMembership(ctx, txn, event); err != nil {
- return err
- }
- }
-
- return nil
- })
-}
-
-// GetMembershipInRoomByLocalpart returns the membership for an user
-// matching the given localpart if he is a member of the room matching roomID,
-// if not sql.ErrNoRows is returned.
-// If there was an issue during the retrieval, returns the SQL error
-func (d *Database) GetMembershipInRoomByLocalpart(
- ctx context.Context, localpart, roomID string,
-) (authtypes.Membership, error) {
- return d.memberships.selectMembershipInRoomByLocalpart(ctx, localpart, roomID)
-}
-
-// GetMembershipsByLocalpart returns an array containing the memberships for all
-// the rooms a user matching a given localpart is a member of
-// If no membership match the given localpart, returns an empty array
-// If there was an issue during the retrieval, returns the SQL error
-func (d *Database) GetMembershipsByLocalpart(
- ctx context.Context, localpart string,
-) (memberships []authtypes.Membership, err error) {
- return d.memberships.selectMembershipsByLocalpart(ctx, localpart)
-}
-
-// GetRoomIDsByLocalPart returns an array containing the room ids of all
-// the rooms a user matching a given localpart is a member of
-// If no membership match the given localpart, returns an empty array
-// If there was an issue during the retrieval, returns the SQL error
-func (d *Database) GetRoomIDsByLocalPart(
- ctx context.Context, localpart string,
-) ([]string, error) {
- return d.memberships.selectRoomIDsByLocalPart(ctx, localpart)
-}
-
-// newMembership saves a new membership in the database.
-// If the event isn't a valid m.room.member event with type `join`, does nothing.
-// If an error occurred, returns the SQL error
-func (d *Database) newMembership(
- ctx context.Context, txn *sql.Tx, ev gomatrixserverlib.Event,
-) error {
- if ev.Type() == "m.room.member" && ev.StateKey() != nil {
- localpart, serverName, err := gomatrixserverlib.SplitID('@', *ev.StateKey())
- if err != nil {
- return err
- }
-
- // We only want state events from local users
- if string(serverName) != string(d.serverName) {
- return nil
- }
-
- eventID := ev.EventID()
- roomID := ev.RoomID()
- membership, err := ev.Membership()
- if err != nil {
- return err
- }
-
- // Only "join" membership events can be considered as new memberships
- if membership == gomatrixserverlib.Join {
- if err := d.saveMembership(ctx, txn, localpart, roomID, eventID); err != nil {
- return err
- }
- }
- }
- return nil
-}
-
// SaveAccountData saves new account data for a given user and a given room.
// If the account data is not specific to a room, the room ID should be an empty string
// If an account data already exists for a given set (user, room, data type), it will