Files
photodisk/internal/auth/user.go
Artem Mamonov acf9b43671 Initial commit
2025-02-06 02:36:10 +01:00

82 lines
1.6 KiB
Go

package auth
import (
"database/sql"
"github.com/google/uuid"
"log"
db "photodisk/internal/db/sqlite"
"time"
)
var (
ErrUserNotFound = Error{"user not found"}
ErrSessionNotFound = Error{"session not found"}
)
type User struct {
Id int `db:"id"`
Username string `db:"username"`
Password string `db:"password"`
}
type Session struct {
Id string `db:"id"`
UserId int `db:"user_id"`
ExpiresAt string `db:"expires_at"`
}
func GenerateToken() string {
// generate token using uuid
return uuid.New().String()
}
func CreateSession(userId int, expireAt time.Time) (string, error) {
token := GenerateToken()
_, err := db.GetDb().Exec("INSERT INTO sessions (id, user_id, expires_at) VALUES (?, ?, ?)", token, userId, expireAt)
if err != nil {
log.Println(err)
return "", err
}
return token, nil
}
func CheckSession(sessionId string) (User, error) {
user := User{}
q := `SELECT users.id, users.username
FROM users
JOIN sessions ON users.id = sessions.user_id
WHERE sessions.id = ? AND sessions.expires_at > datetime('now')`
err := db.GetDb().Get(&user, q, sessionId)
if err != nil {
if err != sql.ErrNoRows {
log.Println(err)
}
return User{}, ErrSessionNotFound
}
return user, nil
}
func Login(username, password string) (User, error) {
user := User{}
err := db.GetDb().Get(&user, "SELECT * FROM users WHERE username = ?", username)
if err != nil {
log.Println(err)
if err != sql.ErrNoRows {
}
return User{}, ErrUserNotFound
}
err = CheckPasswordHash(password, user.Password)
if err != nil {
log.Println(err)
return User{}, err
}
return user, nil
}