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 }