82 lines
1.6 KiB
Go
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
|
|
}
|