195 lines
4.0 KiB
SQL
195 lines
4.0 KiB
SQL
-- Фаза 1A: Аутентификация (КРИТИЧНО)
|
|
-- Запросы для регистрации, входа и управления токенами
|
|
|
|
-- ============================================================================
|
|
-- Пользователи
|
|
-- ============================================================================
|
|
|
|
-- 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;
|
|
|
|
-- 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;
|
|
|
|
-- 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;
|
|
|
|
-- name: EmailExists :one
|
|
SELECT EXISTS(
|
|
SELECT 1 FROM users
|
|
WHERE email = $1 AND deleted_at IS NULL
|
|
);
|
|
|
|
-- name: UpdateLastLogin :exec
|
|
UPDATE users
|
|
SET last_login_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1;
|
|
|
|
-- ============================================================================
|
|
-- Refresh Tokens
|
|
-- ============================================================================
|
|
|
|
-- name: CreateRefreshToken :one
|
|
INSERT INTO refresh_tokens (
|
|
user_id,
|
|
token,
|
|
expires_at,
|
|
user_agent,
|
|
ip_address
|
|
) VALUES (
|
|
$1,
|
|
$2,
|
|
$3,
|
|
$4,
|
|
$5
|
|
) RETURNING *;
|
|
|
|
-- name: GetRefreshToken :one
|
|
SELECT * FROM refresh_tokens
|
|
WHERE token = $1
|
|
AND revoked = FALSE
|
|
AND expires_at > CURRENT_TIMESTAMP;
|
|
|
|
-- name: RevokeRefreshToken :exec
|
|
UPDATE refresh_tokens
|
|
SET revoked = TRUE, revoked_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1;
|
|
|
|
-- name: RevokeAllUserTokens :exec
|
|
UPDATE refresh_tokens
|
|
SET revoked = TRUE, revoked_at = CURRENT_TIMESTAMP
|
|
WHERE user_id = $1 AND revoked = FALSE;
|
|
|
|
-- name: CleanupExpiredTokens :exec
|
|
DELETE FROM refresh_tokens
|
|
WHERE expires_at < CURRENT_TIMESTAMP
|
|
OR (revoked = TRUE AND revoked_at < CURRENT_TIMESTAMP - INTERVAL '30 days');
|
|
|
|
-- ============================================================================
|
|
-- User Sessions
|
|
-- ============================================================================
|
|
|
|
-- 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 *;
|
|
|
|
-- name: GetUserSession :one
|
|
SELECT * FROM user_sessions
|
|
WHERE session_token = $1
|
|
AND expires_at > CURRENT_TIMESTAMP;
|
|
|
|
-- name: UpdateSessionActivity :exec
|
|
UPDATE user_sessions
|
|
SET last_activity_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1;
|
|
|
|
-- name: InvalidateUserSession :exec
|
|
DELETE FROM user_sessions
|
|
WHERE id = $1;
|
|
|
|
-- name: InvalidateAllUserSessions :exec
|
|
DELETE FROM user_sessions
|
|
WHERE user_id = $1;
|
|
|
|
-- name: CleanupExpiredSessions :exec
|
|
DELETE FROM user_sessions
|
|
WHERE expires_at < CURRENT_TIMESTAMP
|
|
OR last_activity_at < CURRENT_TIMESTAMP - INTERVAL '7 days';
|