feat: assign IM user account numbers
This commit is contained in:
@@ -88,6 +88,9 @@ func ensureUserIdentitySchema(db *sqlx.DB) error {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err = ensureUserAccountNoSchema(ctx, conn); err != nil {
|
||||
return err
|
||||
}
|
||||
if profilesExist {
|
||||
if exists, err := identityColumnExists(ctx, conn, "im_user_profiles", "email"); err != nil {
|
||||
return err
|
||||
@@ -568,6 +571,39 @@ func identityCandidates(ctx context.Context, conn *sqlx.Conn, scoped bool, metho
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func ensureUserAccountNoSchema(ctx context.Context, conn *sqlx.Conn) error {
|
||||
if exists, err := identityColumnExists(ctx, conn, "im_users", "account_no"); err != nil {
|
||||
return err
|
||||
} else if !exists {
|
||||
if _, err = conn.ExecContext(ctx, "ALTER TABLE im_users ADD COLUMN account_no INT UNSIGNED NOT NULL DEFAULT 0 AFTER id"); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
var start int64 = 999
|
||||
if err := conn.QueryRowContext(ctx, "SELECT GREATEST(COALESCE(MAX(account_no), 999), 999) FROM im_users WHERE account_no>0").Scan(&start); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := conn.ExecContext(ctx, `
|
||||
UPDATE im_users AS u
|
||||
JOIN (
|
||||
SELECT ordered.id, (@im_user_account_no := @im_user_account_no + 1) AS next_no
|
||||
FROM (SELECT id FROM im_users WHERE account_no=0 ORDER BY createdat, id) AS ordered
|
||||
CROSS JOIN (SELECT @im_user_account_no := ?) AS vars
|
||||
) AS seq ON seq.id=u.id
|
||||
SET u.account_no=seq.next_no
|
||||
WHERE u.account_no=0`, start); err != nil {
|
||||
return err
|
||||
}
|
||||
if exists, err := identityIndexExists(ctx, conn, "im_users", "uk_im_users_account_no"); err != nil {
|
||||
return err
|
||||
} else if !exists {
|
||||
if _, err = conn.ExecContext(ctx, "CREATE UNIQUE INDEX uk_im_users_account_no ON im_users(account_no)"); err != nil {
|
||||
return fmt.Errorf("create unique user account number index: %w", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func identityTableExists(ctx context.Context, conn *sqlx.Conn, table string) (bool, error) {
|
||||
var exists int
|
||||
err := conn.QueryRowContext(ctx, `SELECT EXISTS(SELECT 1 FROM information_schema.tables
|
||||
|
||||
Reference in New Issue
Block a user