63 lines
1.7 KiB
Go
63 lines
1.7 KiB
Go
package postgres
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
"github.com/ajaxray/geek-life/model"
|
|
)
|
|
|
|
// SessionRepository implements the session repository interface for PostgreSQL
|
|
type SessionRepository struct {
|
|
db *sqlx.DB
|
|
}
|
|
|
|
// NewSessionRepository creates a new session repository
|
|
func NewSessionRepository(db *sqlx.DB) *SessionRepository {
|
|
return &SessionRepository{db: db}
|
|
}
|
|
|
|
// GetByToken retrieves a session by token
|
|
func (r *SessionRepository) GetByToken(token string) (*model.UserSession, error) {
|
|
var session model.UserSession
|
|
query := `SELECT id, user_id, token, expires_at, created_at
|
|
FROM user_sessions WHERE token = $1 AND expires_at > NOW()`
|
|
err := r.db.Get(&session, query, token)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &session, nil
|
|
}
|
|
|
|
// Create creates a new session
|
|
func (r *SessionRepository) Create(userID int64, token string, expiresAt int64) (*model.UserSession, error) {
|
|
session := &model.UserSession{
|
|
UserID: userID,
|
|
Token: token,
|
|
ExpiresAt: time.Unix(expiresAt, 0),
|
|
CreatedAt: time.Now(),
|
|
}
|
|
|
|
query := `INSERT INTO user_sessions (user_id, token, expires_at, created_at)
|
|
VALUES ($1, $2, $3, $4) RETURNING id`
|
|
err := r.db.QueryRow(query, session.UserID, session.Token, session.ExpiresAt, session.CreatedAt).Scan(&session.ID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return session, nil
|
|
}
|
|
|
|
// Delete deletes a session
|
|
func (r *SessionRepository) Delete(session *model.UserSession) error {
|
|
query := `DELETE FROM user_sessions WHERE id = $1`
|
|
_, err := r.db.Exec(query, session.ID)
|
|
return err
|
|
}
|
|
|
|
// DeleteExpired deletes all expired sessions
|
|
func (r *SessionRepository) DeleteExpired() error {
|
|
query := `DELETE FROM user_sessions WHERE expires_at <= NOW()`
|
|
_, err := r.db.Exec(query)
|
|
return err
|
|
} |