phoenix/database/admins.go
Ivan R. 5aa2cee5b1
chore: migrate to database/sql
Since I started simplifying, I decided to abandon ORM.

I won’t say that this makes much sense, everything works more or less as before.
Except that the size of the program has decreased slightly again, by about a megabyte.
2024-03-26 00:40:52 +05:00

96 lines
1.6 KiB
Go

package database
import (
"golang.org/x/crypto/bcrypt"
)
type Admin struct {
ID int
Username string
Bcrypt string
}
func CountAdmins() (int64, error) {
var count int64
query := `SELECT COUNT(*) FROM admins`
if err := DB.QueryRow(query).Scan(&count); err != nil {
return 0, err
}
return count, nil
}
func CreateAdmin(username string, password string) (*Admin, error) {
hash, err := bcrypt.GenerateFromPassword([]byte(password), 10)
if err != nil {
return nil, err
}
query := `
INSERT INTO admins(username, bcrypt)
VALUES (?, ?)
RETURNING id
`
var admin Admin
admin.Username = username
admin.Bcrypt = string(hash)
err = DB.
QueryRow(query, admin.Username, admin.Bcrypt).
Scan(&admin.ID)
if err != nil {
return nil, err
}
return &admin, nil
}
func GetAdminIfPasswordMatches(username string, password string) (*Admin, error) {
query := `
SELECT id, username, bcrypt
FROM admins
WHERE username = ?
`
var admin Admin
err := DB.
QueryRow(query, username).
Scan(&admin.ID, &admin.Username, &admin.Bcrypt)
if err != nil {
return nil, err
}
err = bcrypt.CompareHashAndPassword([]byte(admin.Bcrypt), []byte(password))
if err != nil {
return nil, err
}
return &admin, nil
}
func DeleteAdmin(id int) error {
query := `
DELETE FROM admins
WHERE id = ?
`
res, err := DB.Exec(query, id)
if err != nil {
return err
}
rowsAffected, err := res.RowsAffected()
if err != nil {
return err
}
if rowsAffected != 1 {
return ErrWrongNumberOfAffectedRows
}
return nil
}