This commit is contained in:
Yovan
2026-10-03 20:28:25 +07:00
parent 14283c2b61
commit 650b24619f
23 changed files with 2373 additions and 30 deletions
+18 -2
View File
@@ -2,6 +2,7 @@ package store
import (
"context"
"errors"
"sync"
"time"
@@ -9,6 +10,9 @@ import (
"github.com/jackc/pgx/v5"
)
// ErrSessionNotFound dikembalikan saat token sesi tidak ditemukan (atau sudah dihapus).
var ErrSessionNotFound = errors.New("session not found")
type SessionStore struct {
conn *pgx.Conn
mu *sync.Mutex
@@ -45,16 +49,28 @@ func (s *SessionStore) Get(ctx context.Context, token string) (*models.Session,
query := `SELECT token, user_id, created_at FROM sessions WHERE token = $1`
err := s.conn.QueryRow(ctx, query, token).Scan(&sess.Token, &sess.UserID, &sess.CreatedAt)
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return nil, ErrSessionNotFound
}
return nil, err
}
return &sess, nil
}
// Delete menghapus token sesi. Jika token tidak ditemukan (sudah dihapus atau
// tidak pernah ada), ia mengembalikan ErrSessionNotFound tanpa panic — memanggil
// Delete dua kali dengan token yang sama aman dan tidak menghapus token lain.
func (s *SessionStore) Delete(ctx context.Context, token string) error {
s.mu.Lock()
defer s.mu.Unlock()
query := `DELETE FROM sessions WHERE token = $1`
_, err := s.conn.Exec(ctx, query, token)
return err
tag, err := s.conn.Exec(ctx, query, token)
if err != nil {
return err
}
if tag.RowsAffected() == 0 {
return ErrSessionNotFound
}
return nil
}