Initial commit

This commit is contained in:
Artem Mamonov
2025-02-06 02:36:10 +01:00
commit acf9b43671
24 changed files with 1946 additions and 0 deletions

33
internal/auth/auth.go Normal file
View File

@@ -0,0 +1,33 @@
package auth
import "golang.org/x/crypto/bcrypt"
var (
ErrEmptyPassword = Error{"password is empty"}
ErrPasswordIncorrect = Error{"password is incorrect"}
)
type Error struct {
Err string
}
func (e Error) Error() string {
return e.Err
}
func HashPassword(password string) (string, error) {
if password == "" {
return "", ErrEmptyPassword
}
bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
return string(bytes), err
}
func CheckPasswordHash(password, hash string) error {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
if err != nil {
return ErrPasswordIncorrect
}
return nil
}

81
internal/auth/user.go Normal file
View 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
}