package db import ( "context" "database/sql" "errors" "time" "postern/internal/model" ) func (db *DB) InsertUserAddress(ctx context.Context, username, address string) error { tx, err := db.write.BeginTx(ctx, nil) if err != nil { return err } defer txRollback(tx) // Get userID var userID int row := tx.QueryRowContext(ctx, `SELECT id FROM users WHERE name = ?`, username) if err = row.Scan(&userID); err != nil { if errors.Is(err, sql.ErrNoRows) { return errors.New("user not found") } return err } // Insert address _, err = tx.ExecContext(ctx, `INSERT INTO addresses (user_id, name, created_at) VALUES (?, ?, ?)`, userID, address, time.Now().Unix()) if err != nil { return err } return tx.Commit() } func (db *DB) GetUserForAddress(ctx context.Context, address string) (model.User, error) { res := db.read.QueryRowContext(ctx, `SELECT users.id, users.name, users.password_hash FROM users INNER JOIN addresses ON users.id = addresses.user_id WHERE addresses.name = ?`, address) var u model.User var pw []byte err := res.Scan(&u.ID, &u.Name, &pw) u.SetPassword(pw) return u, err } func (db *DB) GetGatekeepDecision(ctx context.Context, userID int, fromAddress string) (string, error) { res := db.read.QueryRowContext(ctx, `SELECT destination FROM gatekeepers WHERE from_address = ? and user_id = ?`, fromAddress, userID) var mailbox string err := res.Scan(&mailbox) if err != nil { return "", err } return mailbox, nil }