Initial commit
This commit is contained in:
81
internal/auth/user.go
Normal file
81
internal/auth/user.go
Normal file
@@ -0,0 +1,81 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user