store: move the access_hash and username to separate per-user table

Signed-off-by: Sumner Evans <sumner.evans@automattic.com>
This commit is contained in:
Sumner Evans
2024-08-08 12:12:17 -06:00
parent aeb8fba288
commit 838f291220
7 changed files with 129 additions and 22 deletions
+65
View File
@@ -58,6 +58,32 @@ const (
VALUES ($1, $2, $3)
ON CONFLICT (user_id, channel_id) DO UPDATE SET access_hash=excluded.access_hash
`
// User Access Hash Queries
getUserAccessHashQuery = "SELECT access_hash FROM telegram_user_metadata WHERE receiver_id=$1 AND user_id=$2"
setUserAccessHashQuery = `
INSERT INTO telegram_user_metadata (receiver_id, user_id, access_hash)
VALUES ($1, $2, $3)
ON CONFLICT (receiver_id, user_id) DO UPDATE SET access_hash=excluded.access_hash
`
// User Username Queries
getUserUsernameQuery = "SELECT username FROM telegram_user_metadata WHERE receiver_id=$1 AND user_id=$2"
setUserUsernameQuery = `
INSERT INTO telegram_user_metadata (receiver_id, user_id, username)
VALUES ($1, $2, $3)
ON CONFLICT (receiver_id, user_id) DO UPDATE SET username=excluded.username
`
// User Metadata Queries
getUserMetadataQuery = "SELECT username, access_hash FROM telegram_user_metadata WHERE receiver_id=$1 AND user_id=$2"
setUserMetadataQuery = `
INSERT INTO telegram_user_metadata (receiver_id, user_id, username, access_hash)
VALUES ($1, $2, $3, $4)
ON CONFLICT (receiver_id, user_id) DO UPDATE SET
username=excluded.username,
access_hash=excluded.access_hash
`
)
var _ session.Storage = (*ScopedStore)(nil)
@@ -170,6 +196,45 @@ func (s *ScopedStore) SetChannelAccessHash(ctx context.Context, userID int64, ch
return
}
func (s *ScopedStore) GetUserAccessHash(ctx context.Context, userID int64) (accessHash int64, found bool, err error) {
err = s.db.QueryRow(ctx, getUserAccessHashQuery, s.telegramUserID, userID).Scan(&accessHash)
if errors.Is(err, sql.ErrNoRows) {
return 0, false, nil
}
return accessHash, err == nil, err
}
func (s *ScopedStore) SetUserAccessHash(ctx context.Context, userID, accessHash int64) (err error) {
_, err = s.db.Exec(ctx, setUserAccessHashQuery, s.telegramUserID, userID, accessHash)
return
}
func (s *ScopedStore) GetUserUsername(ctx context.Context, userID int64) (username string, found bool, err error) {
err = s.db.QueryRow(ctx, getUserUsernameQuery, s.telegramUserID, userID).Scan(&username)
if errors.Is(err, sql.ErrNoRows) {
return "", false, nil
}
return username, err == nil, err
}
func (s *ScopedStore) SetUserUsername(ctx context.Context, userID int64, username string) (err error) {
_, err = s.db.Exec(ctx, setUserUsernameQuery, s.telegramUserID, userID, username)
return
}
func (s *ScopedStore) GetUserMetadata(ctx context.Context, userID int64) (username string, accessHash int64, found bool, err error) {
err = s.db.QueryRow(ctx, getUserMetadataQuery, s.telegramUserID, userID).Scan(&username, &accessHash)
if errors.Is(err, sql.ErrNoRows) {
return "", 0, false, nil
}
return username, accessHash, err == nil, err
}
func (s *ScopedStore) SetUserMetadata(ctx context.Context, userID int64, username string, accessHash int64) (err error) {
_, err = s.db.Exec(ctx, setUserMetadataQuery, s.telegramUserID, userID, username, accessHash)
return
}
// Helper Functions
func (s *ScopedStore) assertUserIDMatches(userID int64) {
@@ -31,6 +31,16 @@ CREATE TABLE telegram_channel_access_hashes (
PRIMARY KEY (user_id, channel_id)
);
CREATE TABLE telegram_user_metadata (
receiver_id INTEGER,
user_id INTEGER,
access_hash INTEGER NOT NULL,
username TEXT,
PRIMARY KEY (receiver_id, user_id)
);
CREATE TABLE telegram_file (
id TEXT PRIMARY KEY,
mxc TEXT NOT NULL,
@@ -0,0 +1,15 @@
-- v3: Move the user access hash to a table so it can be per-user
CREATE TABLE telegram_user_metadata (
receiver_id INTEGER,
user_id INTEGER,
access_hash INTEGER NOT NULL,
username TEXT,
PRIMARY KEY (receiver_id, user_id)
);
INSERT INTO telegram_user_metadata (receiver_id, user_id, access_hash, username)
SELECT ul.id, g.id, g.metadata->>'access_hash', g.metadata->>'username'
FROM user_login ul, ghost g;