Files
geek-life/repository/postgres/session.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
}