diff options
| author | Alexander Hunt <me@liz.coffee> | 2026-06-21 12:43:31 -0700 |
|---|---|---|
| committer | Alexander Hunt <me@liz.coffee> | 2026-06-21 12:43:31 -0700 |
| commit | cfc0d34a584254a9ed76620951c810771aff6f3b (patch) | |
| tree | 7fba034f7347ce0003e7a3a56adcaf862c834907 /database/users.go | |
| parent | fb653292612eddca5b088ed88466c546d1597107 (diff) | |
| download | penguins.lan-cfc0d34a584254a9ed76620951c810771aff6f3b.tar.gz penguins.lan-cfc0d34a584254a9ed76620951c810771aff6f3b.zip | |
STUFF
Diffstat (limited to 'database/users.go')
| -rw-r--r-- | database/users.go | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/database/users.go b/database/users.go index 169cce1..164a631 100644 --- a/database/users.go +++ b/database/users.go @@ -99,3 +99,44 @@ func AssociateMAC(db *sql.DB, mac, userID string) error { mac, userID, now, now) return err } + +// MACBelongsToUser reports whether a MAC is currently bound to the given user. +func MACBelongsToUser(db *sql.DB, mac, userID string) (bool, error) { + var owner string + err := db.QueryRow("SELECT user_id FROM macs WHERE mac = ?", mac).Scan(&owner) + if errors.Is(err, sql.ErrNoRows) { + return false, nil + } + if err != nil { + return false, err + } + return owner == userID, nil +} + +// SetUserPrimaryMAC sets the user's primary device (the MAC its +// <username>.<zone> name points at). +func SetUserPrimaryMAC(db *sql.DB, userID, mac string) error { + _, err := db.Exec("UPDATE users SET primary_mac = ? WHERE id = ?", mac, userID) + return err +} + +// SetPrimaryMACIfUnset atomically makes mac the primary device only when the +// user has none yet. The conditional WHERE makes "first device wins" race-free: +// concurrent associations can't both win, and there's no read-then-write gap. +func SetPrimaryMACIfUnset(db *sql.DB, userID, mac string) error { + _, err := db.Exec("UPDATE users SET primary_mac = ? WHERE id = ? AND primary_mac IS NULL", mac, userID) + return err +} + +// GetUserPrimaryMAC returns the user's primary MAC, or "" if unset. +func GetUserPrimaryMAC(db *sql.DB, userID string) (string, error) { + var mac sql.NullString + err := db.QueryRow("SELECT primary_mac FROM users WHERE id = ?", userID).Scan(&mac) + if errors.Is(err, sql.ErrNoRows) { + return "", ErrNotFound + } + if err != nil { + return "", err + } + return mac.String, nil +} |
