parent
929657fd34
commit
3bb5e735c6
19 changed files with 173 additions and 123 deletions
|
@ -7,19 +7,30 @@ import (
|
|||
"fmt"
|
||||
"time"
|
||||
|
||||
"git.adyxax.org/adyxax/tfstated/pkg/helpers"
|
||||
"git.adyxax.org/adyxax/tfstated/pkg/model"
|
||||
"git.adyxax.org/adyxax/tfstated/pkg/scrypto"
|
||||
"go.n16f.net/uuid"
|
||||
)
|
||||
|
||||
func (db *DB) CreateSession(account *model.Account) (string, error) {
|
||||
func (db *DB) CreateSession(account *model.Account, settingsData []byte) (string, error) {
|
||||
sessionBytes := scrypto.RandomBytes(32)
|
||||
sessionId := base64.RawURLEncoding.EncodeToString(sessionBytes[:])
|
||||
sessionHash := helpers.HashSessionId(sessionBytes, db.sessionsSalt.Bytes())
|
||||
var accountId *uuid.UUID = nil
|
||||
var settings = []byte("{}")
|
||||
if account != nil {
|
||||
accountId = &account.Id
|
||||
settings = account.Settings
|
||||
} else if settingsData != nil {
|
||||
settings = settingsData
|
||||
}
|
||||
if _, err := db.Exec(
|
||||
`INSERT INTO sessions(id, account_id, data)
|
||||
`INSERT INTO sessions(id, account_id, settings)
|
||||
VALUES (?, ?, ?);`,
|
||||
sessionId,
|
||||
account.Id,
|
||||
"",
|
||||
sessionHash,
|
||||
accountId,
|
||||
settings,
|
||||
); err != nil {
|
||||
return "", fmt.Errorf("failed insert new session in database: %w", err)
|
||||
}
|
||||
|
@ -27,7 +38,8 @@ func (db *DB) CreateSession(account *model.Account) (string, error) {
|
|||
}
|
||||
|
||||
func (db *DB) DeleteExpiredSessions() error {
|
||||
_, err := db.Exec(`DELETE FROM sessions WHERE created < ?`, time.Now().Unix())
|
||||
expires := time.Now().Add(-12 * time.Hour)
|
||||
_, err := db.Exec(`DELETE FROM sessions WHERE created < ?`, expires.Unix())
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to delete expired session: %w", err)
|
||||
}
|
||||
|
@ -43,25 +55,30 @@ func (db *DB) DeleteSession(session *model.Session) error {
|
|||
}
|
||||
|
||||
func (db *DB) LoadSessionById(id string) (*model.Session, error) {
|
||||
sessionBytes, err := base64.RawURLEncoding.DecodeString(id)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to decode base64 session id: %w", err)
|
||||
}
|
||||
sessionHash := helpers.HashSessionId(sessionBytes, db.sessionsSalt.Bytes())
|
||||
session := model.Session{
|
||||
Id: id,
|
||||
Id: sessionHash,
|
||||
}
|
||||
var (
|
||||
created int64
|
||||
updated int64
|
||||
)
|
||||
err := db.QueryRow(
|
||||
err = db.QueryRow(
|
||||
`SELECT account_id,
|
||||
created,
|
||||
updated,
|
||||
data
|
||||
settings
|
||||
FROM sessions
|
||||
WHERE id = ?;`,
|
||||
id,
|
||||
sessionHash,
|
||||
).Scan(&session.AccountId,
|
||||
&created,
|
||||
&updated,
|
||||
&session.Data,
|
||||
&session.Settings,
|
||||
)
|
||||
if err != nil {
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
|
@ -74,11 +91,13 @@ func (db *DB) LoadSessionById(id string) (*model.Session, error) {
|
|||
return &session, nil
|
||||
}
|
||||
|
||||
func (db *DB) TouchSession(sessionId string) error {
|
||||
now := time.Now().UTC()
|
||||
_, err := db.Exec(`UPDATE sessions SET updated = ? WHERE id = ?`, now.Unix(), sessionId)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to touch updated for session %s: %w", sessionId, err)
|
||||
func (db *DB) MigrateSession(session *model.Session, account *model.Account) (string, error) {
|
||||
if err := db.DeleteSession(session); err != nil {
|
||||
return "", fmt.Errorf("failed to delete session: %w", err)
|
||||
}
|
||||
return nil
|
||||
sessionId, err := db.CreateSession(account, session.Settings)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to create session: %w", err)
|
||||
}
|
||||
return sessionId, nil
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue