Files
learn-file-storage-s3-golan…/internal/database/refresh_tokens.go
Daniel Hjartland 75be79c6cf initial commit
2025-01-02 16:32:57 +01:00

84 lines
1.8 KiB
Go

package database
import (
"database/sql"
"time"
"github.com/google/uuid"
)
type RefreshToken struct {
CreateRefreshTokenParams
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
RevokedAt *time.Time `json:"revoked_at"`
}
type CreateRefreshTokenParams struct {
Token string `json:"token"`
UserID uuid.UUID `json:"user_id"`
ExpiresAt time.Time `json:"expires_at"`
}
func (c Client) CreateRefreshToken(params CreateRefreshTokenParams) (RefreshToken, error) {
query := `
INSERT INTO refresh_tokens (
token,
created_at,
updated_at,
user_id,
expires_at
) VALUES (?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, ?, ?)
`
_, err := c.db.Exec(query, params.Token, params.UserID.String(), params.ExpiresAt)
if err != nil {
return RefreshToken{}, err
}
return c.GetRefreshToken(params.Token)
}
func (c Client) RevokeRefreshToken(token string) error {
query := `
UPDATE refresh_tokens
SET revoked_at = CURRENT_TIMESTAMP
WHERE token = ?
`
_, err := c.db.Exec(query, token)
return err
}
func (c Client) GetRefreshToken(token string) (RefreshToken, error) {
query := `
SELECT token, created_at, updated_at, user_id, expires_at, revoked_at
FROM refresh_tokens
WHERE token = ?
`
var rt RefreshToken
var userID string
err := c.db.QueryRow(query, token).
Scan(&rt.Token, &rt.CreatedAt, &rt.UpdatedAt, &userID, &rt.ExpiresAt, &rt.RevokedAt)
if err != nil {
if err == sql.ErrNoRows {
return RefreshToken{}, nil
}
return RefreshToken{}, err
}
rt.UserID, err = uuid.Parse(userID)
if err != nil {
return RefreshToken{}, err
}
return rt, nil
}
func (c Client) DeleteRefreshToken(token string) error {
query := `
DELETE FROM refresh_tokens
WHERE token = ?
`
_, err := c.db.Exec(query, token)
return err
}