diff --git a/internal/db/refresh_tokens.sql.go b/internal/db/refresh_tokens.sql.go new file mode 100644 index 0000000..52c6a29 --- /dev/null +++ b/internal/db/refresh_tokens.sql.go @@ -0,0 +1,75 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.30.0 +// source: refresh_tokens.sql + +package db + +import ( + "context" + + "github.com/jackc/pgx/v5/pgtype" +) + +const createRefreshToken = `-- name: CreateRefreshToken :one +INSERT INTO refresh_tokens (user_id, token_hash, expires_at) +VALUES ($1, $2, $3) +RETURNING id, user_id, token_hash, created_at, expires_at +` + +type CreateRefreshTokenParams struct { + UserID int64 `json:"user_id"` + TokenHash string `json:"token_hash"` + ExpiresAt pgtype.Timestamptz `json:"expires_at"` +} + +func (q *Queries) CreateRefreshToken(ctx context.Context, arg CreateRefreshTokenParams) (RefreshToken, error) { + row := q.db.QueryRow(ctx, createRefreshToken, arg.UserID, arg.TokenHash, arg.ExpiresAt) + var i RefreshToken + err := row.Scan( + &i.ID, + &i.UserID, + &i.TokenHash, + &i.CreatedAt, + &i.ExpiresAt, + ) + return i, err +} + +const deleteAllUserRefreshTokens = `-- name: DeleteAllUserRefreshTokens :exec +DELETE FROM refresh_tokens +WHERE user_id = $1 +` + +func (q *Queries) DeleteAllUserRefreshTokens(ctx context.Context, userID int64) error { + _, err := q.db.Exec(ctx, deleteAllUserRefreshTokens, userID) + return err +} + +const deleteRefreshToken = `-- name: DeleteRefreshToken :exec +DELETE FROM refresh_tokens +WHERE token_hash = $1 +` + +func (q *Queries) DeleteRefreshToken(ctx context.Context, tokenHash string) error { + _, err := q.db.Exec(ctx, deleteRefreshToken, tokenHash) + return err +} + +const getRefreshToken = `-- name: GetRefreshToken :one +SELECT id, user_id, token_hash, created_at, expires_at FROM refresh_tokens +WHERE token_hash = $1 LIMIT 1 +` + +func (q *Queries) GetRefreshToken(ctx context.Context, tokenHash string) (RefreshToken, error) { + row := q.db.QueryRow(ctx, getRefreshToken, tokenHash) + var i RefreshToken + err := row.Scan( + &i.ID, + &i.UserID, + &i.TokenHash, + &i.CreatedAt, + &i.ExpiresAt, + ) + return i, err +} diff --git a/internal/db/queries.sql.go b/internal/db/users.sql.go similarity index 99% rename from internal/db/queries.sql.go rename to internal/db/users.sql.go index 6650c84..ee98a05 100644 --- a/internal/db/queries.sql.go +++ b/internal/db/users.sql.go @@ -1,7 +1,7 @@ // Code generated by sqlc. DO NOT EDIT. // versions: // sqlc v1.30.0 -// source: queries.sql +// source: users.sql package db diff --git a/sql/db.go b/sql/db.go new file mode 100644 index 0000000..9d485b5 --- /dev/null +++ b/sql/db.go @@ -0,0 +1,32 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.30.0 + +package db + +import ( + "context" + + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgconn" +) + +type DBTX interface { + Exec(context.Context, string, ...interface{}) (pgconn.CommandTag, error) + Query(context.Context, string, ...interface{}) (pgx.Rows, error) + QueryRow(context.Context, string, ...interface{}) pgx.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx pgx.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/sql/queries/refresh_tokens.sql b/sql/queries/refresh_tokens.sql new file mode 100644 index 0000000..bcfb40f --- /dev/null +++ b/sql/queries/refresh_tokens.sql @@ -0,0 +1,16 @@ +-- name: CreateRefreshToken :one +INSERT INTO refresh_tokens (user_id, token_hash, expires_at) +VALUES ($1, $2, $3) +RETURNING *; + +-- name: GetRefreshToken :one +SELECT * FROM refresh_tokens +WHERE token_hash = $1 LIMIT 1; + +-- name: DeleteRefreshToken :exec +DELETE FROM refresh_tokens +WHERE token_hash = $1; + +-- name: DeleteAllUserRefreshTokens :exec +DELETE FROM refresh_tokens +WHERE user_id = $1; diff --git a/sql/queries.sql b/sql/queries/users.sql similarity index 100% rename from sql/queries.sql rename to sql/queries/users.sql diff --git a/sql/schema.sql b/sql/schema.sql index e4b3ac2..d17b0a4 100644 --- a/sql/schema.sql +++ b/sql/schema.sql @@ -5,3 +5,13 @@ CREATE TABLE users ( created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); +CREATE TABLE refresh_tokens ( + id BIGSERIAL PRIMARY KEY, + user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE, + token_hash TEXT NOT NULL UNIQUE, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + expires_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX idx_refresh_tokens_token_hash ON refresh_tokens(token_hash); +CREATE INDEX idx_refresh_tokens_user_id ON refresh_tokens(user_id); diff --git a/sqlc.yml b/sqlc.yml index 1104632..2b99f2d 100644 --- a/sqlc.yml +++ b/sqlc.yml @@ -1,7 +1,7 @@ version: "2" sql: - engine: "postgresql" - queries: "sql/queries.sql" + queries: "sql/queries/" schema: "sql/schema.sql" gen: go: