lishwist/core/session.go

65 lines
1.3 KiB
Go

package lishwist
import (
"crypto/rand"
"encoding/base64"
"fmt"
"lishwist/core/internal/db"
"time"
)
type Session struct {
Id string
Token string
User *User
ExpiresAt time.Time
CreatedAt time.Time
}
type SessionManager struct {
sessionDuration time.Duration
sessionTokenLength uint
}
func NewSessionManager(sessionDuration time.Duration, sessionTokenLength uint) SessionManager {
return SessionManager{
sessionDuration,
sessionTokenLength,
}
}
func generateSecureToken(size uint) (string, error) {
bytes := make([]byte, size)
if _, err := rand.Read(bytes); err != nil {
return "", err
}
return base64.URLEncoding.EncodeToString(bytes), nil
}
func (sm *SessionManager) createSession(user *User) (*Session, error) {
stmt := "INSERT INTO session (user_id) VALUES (?);"
result, err := db.Connection.Exec(stmt, user.Id)
if err != nil {
return nil, err
}
id, err := result.LastInsertId()
if err != nil {
return nil, err
}
token, err := generateSecureToken(sm.sessionTokenLength)
if err != nil {
return nil, fmt.Errorf("Failed to generate secure token: %w", err)
}
session := Session{
Id: fmt.Sprintf("%s", id),
Token: token,
User: user,
ExpiresAt: time.Now().Add(sm.sessionDuration),
CreatedAt: time.Now(),
}
return &session, nil
}