549 lines
15 KiB
Go
549 lines
15 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
|
// versions:
|
|
// sqlc v1.30.0
|
|
// source: auth.sql
|
|
|
|
package database
|
|
|
|
import (
|
|
"context"
|
|
"net/netip"
|
|
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
const CleanupExpiredSessions = `-- name: CleanupExpiredSessions :exec
|
|
DELETE FROM user_sessions
|
|
WHERE expires_at < CURRENT_TIMESTAMP
|
|
OR last_activity_at < CURRENT_TIMESTAMP - INTERVAL '7 days'
|
|
`
|
|
|
|
func (q *Queries) CleanupExpiredSessions(ctx context.Context) error {
|
|
_, err := q.db.Exec(ctx, CleanupExpiredSessions)
|
|
return err
|
|
}
|
|
|
|
const CleanupExpiredTokens = `-- name: CleanupExpiredTokens :exec
|
|
DELETE FROM refresh_tokens
|
|
WHERE expires_at < CURRENT_TIMESTAMP
|
|
OR (revoked = TRUE AND revoked_at < CURRENT_TIMESTAMP - INTERVAL '30 days')
|
|
`
|
|
|
|
func (q *Queries) CleanupExpiredTokens(ctx context.Context) error {
|
|
_, err := q.db.Exec(ctx, CleanupExpiredTokens)
|
|
return err
|
|
}
|
|
|
|
const CreateRefreshToken = `-- name: CreateRefreshToken :one
|
|
|
|
INSERT INTO refresh_tokens (
|
|
user_id,
|
|
token,
|
|
expires_at,
|
|
user_agent,
|
|
ip_address
|
|
) VALUES (
|
|
$1,
|
|
$2,
|
|
$3,
|
|
$4,
|
|
$5
|
|
) RETURNING id, user_id, token, expires_at, user_agent, ip_address, revoked, revoked_at, created_at
|
|
`
|
|
|
|
type CreateRefreshTokenParams struct {
|
|
UserID int64 `json:"user_id"`
|
|
Token string `json:"token"`
|
|
ExpiresAt pgtype.Timestamptz `json:"expires_at"`
|
|
UserAgent pgtype.Text `json:"user_agent"`
|
|
IpAddress *netip.Addr `json:"ip_address"`
|
|
}
|
|
|
|
// ============================================================================
|
|
// Refresh Tokens
|
|
// ============================================================================
|
|
func (q *Queries) CreateRefreshToken(ctx context.Context, arg CreateRefreshTokenParams) (RefreshToken, error) {
|
|
row := q.db.QueryRow(ctx, CreateRefreshToken,
|
|
arg.UserID,
|
|
arg.Token,
|
|
arg.ExpiresAt,
|
|
arg.UserAgent,
|
|
arg.IpAddress,
|
|
)
|
|
var i RefreshToken
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.UserID,
|
|
&i.Token,
|
|
&i.ExpiresAt,
|
|
&i.UserAgent,
|
|
&i.IpAddress,
|
|
&i.Revoked,
|
|
&i.RevokedAt,
|
|
&i.CreatedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const CreateUser = `-- name: CreateUser :one
|
|
|
|
|
|
INSERT INTO users (
|
|
email,
|
|
phone,
|
|
password_hash,
|
|
first_name,
|
|
last_name,
|
|
location,
|
|
address,
|
|
city
|
|
) VALUES (
|
|
$1,
|
|
$2,
|
|
$3,
|
|
$4,
|
|
$5,
|
|
ST_SetSRID(ST_MakePoint($6, $7), 4326)::geography,
|
|
$8,
|
|
$9
|
|
) RETURNING
|
|
id,
|
|
email,
|
|
phone,
|
|
password_hash,
|
|
first_name,
|
|
last_name,
|
|
avatar_url,
|
|
ST_Y(location::geometry) as latitude,
|
|
ST_X(location::geometry) as longitude,
|
|
address,
|
|
city,
|
|
volunteer_rating,
|
|
completed_requests_count,
|
|
is_verified,
|
|
is_blocked,
|
|
email_verified,
|
|
created_at,
|
|
updated_at,
|
|
last_login_at,
|
|
deleted_at
|
|
`
|
|
|
|
type CreateUserParams struct {
|
|
Email string `json:"email"`
|
|
Phone pgtype.Text `json:"phone"`
|
|
PasswordHash string `json:"password_hash"`
|
|
FirstName string `json:"first_name"`
|
|
LastName string `json:"last_name"`
|
|
StMakepoint interface{} `json:"st_makepoint"`
|
|
StMakepoint_2 interface{} `json:"st_makepoint_2"`
|
|
Address pgtype.Text `json:"address"`
|
|
City pgtype.Text `json:"city"`
|
|
}
|
|
|
|
type CreateUserRow struct {
|
|
ID int64 `json:"id"`
|
|
Email string `json:"email"`
|
|
Phone pgtype.Text `json:"phone"`
|
|
PasswordHash string `json:"password_hash"`
|
|
FirstName string `json:"first_name"`
|
|
LastName string `json:"last_name"`
|
|
AvatarUrl pgtype.Text `json:"avatar_url"`
|
|
Latitude interface{} `json:"latitude"`
|
|
Longitude interface{} `json:"longitude"`
|
|
Address pgtype.Text `json:"address"`
|
|
City pgtype.Text `json:"city"`
|
|
VolunteerRating pgtype.Numeric `json:"volunteer_rating"`
|
|
CompletedRequestsCount pgtype.Int4 `json:"completed_requests_count"`
|
|
IsVerified pgtype.Bool `json:"is_verified"`
|
|
IsBlocked pgtype.Bool `json:"is_blocked"`
|
|
EmailVerified pgtype.Bool `json:"email_verified"`
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
|
LastLoginAt pgtype.Timestamptz `json:"last_login_at"`
|
|
DeletedAt pgtype.Timestamptz `json:"deleted_at"`
|
|
}
|
|
|
|
// Фаза 1A: Аутентификация (КРИТИЧНО)
|
|
// Запросы для регистрации, входа и управления токенами
|
|
// ============================================================================
|
|
// Пользователи
|
|
// ============================================================================
|
|
func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (CreateUserRow, error) {
|
|
row := q.db.QueryRow(ctx, CreateUser,
|
|
arg.Email,
|
|
arg.Phone,
|
|
arg.PasswordHash,
|
|
arg.FirstName,
|
|
arg.LastName,
|
|
arg.StMakepoint,
|
|
arg.StMakepoint_2,
|
|
arg.Address,
|
|
arg.City,
|
|
)
|
|
var i CreateUserRow
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.Email,
|
|
&i.Phone,
|
|
&i.PasswordHash,
|
|
&i.FirstName,
|
|
&i.LastName,
|
|
&i.AvatarUrl,
|
|
&i.Latitude,
|
|
&i.Longitude,
|
|
&i.Address,
|
|
&i.City,
|
|
&i.VolunteerRating,
|
|
&i.CompletedRequestsCount,
|
|
&i.IsVerified,
|
|
&i.IsBlocked,
|
|
&i.EmailVerified,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.LastLoginAt,
|
|
&i.DeletedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const CreateUserSession = `-- name: CreateUserSession :one
|
|
|
|
INSERT INTO user_sessions (
|
|
user_id,
|
|
session_token,
|
|
refresh_token_id,
|
|
expires_at,
|
|
user_agent,
|
|
ip_address,
|
|
device_info
|
|
) VALUES (
|
|
$1,
|
|
$2,
|
|
$3,
|
|
$4,
|
|
$5,
|
|
$6,
|
|
$7
|
|
) RETURNING id, user_id, session_token, refresh_token_id, expires_at, last_activity_at, user_agent, ip_address, device_info, created_at
|
|
`
|
|
|
|
type CreateUserSessionParams struct {
|
|
UserID int64 `json:"user_id"`
|
|
SessionToken string `json:"session_token"`
|
|
RefreshTokenID pgtype.Int8 `json:"refresh_token_id"`
|
|
ExpiresAt pgtype.Timestamptz `json:"expires_at"`
|
|
UserAgent pgtype.Text `json:"user_agent"`
|
|
IpAddress *netip.Addr `json:"ip_address"`
|
|
DeviceInfo []byte `json:"device_info"`
|
|
}
|
|
|
|
// ============================================================================
|
|
// User Sessions
|
|
// ============================================================================
|
|
func (q *Queries) CreateUserSession(ctx context.Context, arg CreateUserSessionParams) (UserSession, error) {
|
|
row := q.db.QueryRow(ctx, CreateUserSession,
|
|
arg.UserID,
|
|
arg.SessionToken,
|
|
arg.RefreshTokenID,
|
|
arg.ExpiresAt,
|
|
arg.UserAgent,
|
|
arg.IpAddress,
|
|
arg.DeviceInfo,
|
|
)
|
|
var i UserSession
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.UserID,
|
|
&i.SessionToken,
|
|
&i.RefreshTokenID,
|
|
&i.ExpiresAt,
|
|
&i.LastActivityAt,
|
|
&i.UserAgent,
|
|
&i.IpAddress,
|
|
&i.DeviceInfo,
|
|
&i.CreatedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const EmailExists = `-- name: EmailExists :one
|
|
SELECT EXISTS(
|
|
SELECT 1 FROM users
|
|
WHERE email = $1 AND deleted_at IS NULL
|
|
)
|
|
`
|
|
|
|
func (q *Queries) EmailExists(ctx context.Context, email string) (bool, error) {
|
|
row := q.db.QueryRow(ctx, EmailExists, email)
|
|
var exists bool
|
|
err := row.Scan(&exists)
|
|
return exists, err
|
|
}
|
|
|
|
const GetRefreshToken = `-- name: GetRefreshToken :one
|
|
SELECT id, user_id, token, expires_at, user_agent, ip_address, revoked, revoked_at, created_at FROM refresh_tokens
|
|
WHERE token = $1
|
|
AND revoked = FALSE
|
|
AND expires_at > CURRENT_TIMESTAMP
|
|
`
|
|
|
|
func (q *Queries) GetRefreshToken(ctx context.Context, token string) (RefreshToken, error) {
|
|
row := q.db.QueryRow(ctx, GetRefreshToken, token)
|
|
var i RefreshToken
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.UserID,
|
|
&i.Token,
|
|
&i.ExpiresAt,
|
|
&i.UserAgent,
|
|
&i.IpAddress,
|
|
&i.Revoked,
|
|
&i.RevokedAt,
|
|
&i.CreatedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const GetUserByEmail = `-- name: GetUserByEmail :one
|
|
SELECT
|
|
id,
|
|
email,
|
|
phone,
|
|
password_hash,
|
|
first_name,
|
|
last_name,
|
|
avatar_url,
|
|
ST_Y(location::geometry) as latitude,
|
|
ST_X(location::geometry) as longitude,
|
|
address,
|
|
city,
|
|
volunteer_rating,
|
|
completed_requests_count,
|
|
is_verified,
|
|
is_blocked,
|
|
email_verified,
|
|
created_at,
|
|
updated_at,
|
|
last_login_at,
|
|
deleted_at
|
|
FROM users
|
|
WHERE email = $1 AND deleted_at IS NULL
|
|
`
|
|
|
|
type GetUserByEmailRow struct {
|
|
ID int64 `json:"id"`
|
|
Email string `json:"email"`
|
|
Phone pgtype.Text `json:"phone"`
|
|
PasswordHash string `json:"password_hash"`
|
|
FirstName string `json:"first_name"`
|
|
LastName string `json:"last_name"`
|
|
AvatarUrl pgtype.Text `json:"avatar_url"`
|
|
Latitude interface{} `json:"latitude"`
|
|
Longitude interface{} `json:"longitude"`
|
|
Address pgtype.Text `json:"address"`
|
|
City pgtype.Text `json:"city"`
|
|
VolunteerRating pgtype.Numeric `json:"volunteer_rating"`
|
|
CompletedRequestsCount pgtype.Int4 `json:"completed_requests_count"`
|
|
IsVerified pgtype.Bool `json:"is_verified"`
|
|
IsBlocked pgtype.Bool `json:"is_blocked"`
|
|
EmailVerified pgtype.Bool `json:"email_verified"`
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
|
LastLoginAt pgtype.Timestamptz `json:"last_login_at"`
|
|
DeletedAt pgtype.Timestamptz `json:"deleted_at"`
|
|
}
|
|
|
|
func (q *Queries) GetUserByEmail(ctx context.Context, email string) (GetUserByEmailRow, error) {
|
|
row := q.db.QueryRow(ctx, GetUserByEmail, email)
|
|
var i GetUserByEmailRow
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.Email,
|
|
&i.Phone,
|
|
&i.PasswordHash,
|
|
&i.FirstName,
|
|
&i.LastName,
|
|
&i.AvatarUrl,
|
|
&i.Latitude,
|
|
&i.Longitude,
|
|
&i.Address,
|
|
&i.City,
|
|
&i.VolunteerRating,
|
|
&i.CompletedRequestsCount,
|
|
&i.IsVerified,
|
|
&i.IsBlocked,
|
|
&i.EmailVerified,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.LastLoginAt,
|
|
&i.DeletedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const GetUserByID = `-- name: GetUserByID :one
|
|
SELECT
|
|
id,
|
|
email,
|
|
phone,
|
|
password_hash,
|
|
first_name,
|
|
last_name,
|
|
avatar_url,
|
|
ST_Y(location::geometry) as latitude,
|
|
ST_X(location::geometry) as longitude,
|
|
address,
|
|
city,
|
|
volunteer_rating,
|
|
completed_requests_count,
|
|
is_verified,
|
|
is_blocked,
|
|
email_verified,
|
|
created_at,
|
|
updated_at,
|
|
last_login_at,
|
|
deleted_at
|
|
FROM users
|
|
WHERE id = $1 AND deleted_at IS NULL
|
|
`
|
|
|
|
type GetUserByIDRow struct {
|
|
ID int64 `json:"id"`
|
|
Email string `json:"email"`
|
|
Phone pgtype.Text `json:"phone"`
|
|
PasswordHash string `json:"password_hash"`
|
|
FirstName string `json:"first_name"`
|
|
LastName string `json:"last_name"`
|
|
AvatarUrl pgtype.Text `json:"avatar_url"`
|
|
Latitude interface{} `json:"latitude"`
|
|
Longitude interface{} `json:"longitude"`
|
|
Address pgtype.Text `json:"address"`
|
|
City pgtype.Text `json:"city"`
|
|
VolunteerRating pgtype.Numeric `json:"volunteer_rating"`
|
|
CompletedRequestsCount pgtype.Int4 `json:"completed_requests_count"`
|
|
IsVerified pgtype.Bool `json:"is_verified"`
|
|
IsBlocked pgtype.Bool `json:"is_blocked"`
|
|
EmailVerified pgtype.Bool `json:"email_verified"`
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
|
LastLoginAt pgtype.Timestamptz `json:"last_login_at"`
|
|
DeletedAt pgtype.Timestamptz `json:"deleted_at"`
|
|
}
|
|
|
|
func (q *Queries) GetUserByID(ctx context.Context, id int64) (GetUserByIDRow, error) {
|
|
row := q.db.QueryRow(ctx, GetUserByID, id)
|
|
var i GetUserByIDRow
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.Email,
|
|
&i.Phone,
|
|
&i.PasswordHash,
|
|
&i.FirstName,
|
|
&i.LastName,
|
|
&i.AvatarUrl,
|
|
&i.Latitude,
|
|
&i.Longitude,
|
|
&i.Address,
|
|
&i.City,
|
|
&i.VolunteerRating,
|
|
&i.CompletedRequestsCount,
|
|
&i.IsVerified,
|
|
&i.IsBlocked,
|
|
&i.EmailVerified,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.LastLoginAt,
|
|
&i.DeletedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const GetUserSession = `-- name: GetUserSession :one
|
|
SELECT id, user_id, session_token, refresh_token_id, expires_at, last_activity_at, user_agent, ip_address, device_info, created_at FROM user_sessions
|
|
WHERE session_token = $1
|
|
AND expires_at > CURRENT_TIMESTAMP
|
|
`
|
|
|
|
func (q *Queries) GetUserSession(ctx context.Context, sessionToken string) (UserSession, error) {
|
|
row := q.db.QueryRow(ctx, GetUserSession, sessionToken)
|
|
var i UserSession
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.UserID,
|
|
&i.SessionToken,
|
|
&i.RefreshTokenID,
|
|
&i.ExpiresAt,
|
|
&i.LastActivityAt,
|
|
&i.UserAgent,
|
|
&i.IpAddress,
|
|
&i.DeviceInfo,
|
|
&i.CreatedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const InvalidateAllUserSessions = `-- name: InvalidateAllUserSessions :exec
|
|
DELETE FROM user_sessions
|
|
WHERE user_id = $1
|
|
`
|
|
|
|
func (q *Queries) InvalidateAllUserSessions(ctx context.Context, userID int64) error {
|
|
_, err := q.db.Exec(ctx, InvalidateAllUserSessions, userID)
|
|
return err
|
|
}
|
|
|
|
const InvalidateUserSession = `-- name: InvalidateUserSession :exec
|
|
DELETE FROM user_sessions
|
|
WHERE id = $1
|
|
`
|
|
|
|
func (q *Queries) InvalidateUserSession(ctx context.Context, id int64) error {
|
|
_, err := q.db.Exec(ctx, InvalidateUserSession, id)
|
|
return err
|
|
}
|
|
|
|
const RevokeAllUserTokens = `-- name: RevokeAllUserTokens :exec
|
|
UPDATE refresh_tokens
|
|
SET revoked = TRUE, revoked_at = CURRENT_TIMESTAMP
|
|
WHERE user_id = $1 AND revoked = FALSE
|
|
`
|
|
|
|
func (q *Queries) RevokeAllUserTokens(ctx context.Context, userID int64) error {
|
|
_, err := q.db.Exec(ctx, RevokeAllUserTokens, userID)
|
|
return err
|
|
}
|
|
|
|
const RevokeRefreshToken = `-- name: RevokeRefreshToken :exec
|
|
UPDATE refresh_tokens
|
|
SET revoked = TRUE, revoked_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1
|
|
`
|
|
|
|
func (q *Queries) RevokeRefreshToken(ctx context.Context, id int64) error {
|
|
_, err := q.db.Exec(ctx, RevokeRefreshToken, id)
|
|
return err
|
|
}
|
|
|
|
const UpdateLastLogin = `-- name: UpdateLastLogin :exec
|
|
UPDATE users
|
|
SET last_login_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1
|
|
`
|
|
|
|
func (q *Queries) UpdateLastLogin(ctx context.Context, id int64) error {
|
|
_, err := q.db.Exec(ctx, UpdateLastLogin, id)
|
|
return err
|
|
}
|
|
|
|
const UpdateSessionActivity = `-- name: UpdateSessionActivity :exec
|
|
UPDATE user_sessions
|
|
SET last_activity_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1
|
|
`
|
|
|
|
func (q *Queries) UpdateSessionActivity(ctx context.Context, id int64) error {
|
|
_, err := q.db.Exec(ctx, UpdateSessionActivity, id)
|
|
return err
|
|
}
|