phoenix/database/admins.go

96 lines
1.6 KiB
Go
Raw Permalink Normal View History

2023-07-22 15:24:01 +05:00
package database
2023-04-06 10:36:11 +05:00
import (
"golang.org/x/crypto/bcrypt"
)
type Admin struct {
ID int
Username string
Bcrypt string
2023-04-06 10:36:11 +05:00
}
func CountAdmins() (int64, error) {
2023-04-06 10:36:11 +05:00
var count int64
query := `SELECT COUNT(*) FROM admins`
if err := DB.QueryRow(query).Scan(&count); err != nil {
return 0, err
}
return count, nil
2023-04-06 10:36:11 +05:00
}
func CreateAdmin(username string, password string) (*Admin, error) {
2023-04-06 10:36:11 +05:00
hash, err := bcrypt.GenerateFromPassword([]byte(password), 10)
if err != nil {
return nil, err
2023-04-06 10:36:11 +05:00
}
query := `
INSERT INTO admins(username, bcrypt)
VALUES (?, ?)
RETURNING id
`
var admin Admin
admin.Username = username
admin.Bcrypt = string(hash)
2023-04-06 10:36:11 +05:00
err = DB.
QueryRow(query, admin.Username, admin.Bcrypt).
Scan(&admin.ID)
if err != nil {
return nil, err
2023-04-06 10:36:11 +05:00
}
return &admin, nil
2023-04-06 10:36:11 +05:00
}
func GetAdminIfPasswordMatches(username string, password string) (*Admin, error) {
query := `
SELECT id, username, bcrypt
FROM admins
WHERE username = ?
`
2023-04-06 10:36:11 +05:00
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 = ?
`
2023-04-06 10:36:11 +05:00
res, err := DB.Exec(query, id)
if err != nil {
return err
2023-04-06 10:36:11 +05:00
}
rowsAffected, err := res.RowsAffected()
2023-04-06 10:36:11 +05:00
if err != nil {
return err
}
if rowsAffected != 1 {
return ErrWrongNumberOfAffectedRows
2023-04-06 10:36:11 +05:00
}
return nil
2023-04-06 10:36:11 +05:00
}