138 lines
3.4 KiB
SQL
138 lines
3.4 KiB
SQL
-- Фаза 1C: Управление профилем (КРИТИЧНО)
|
|
-- Запросы для получения и обновления профилей пользователей
|
|
|
|
-- ============================================================================
|
|
-- Профиль пользователя
|
|
-- ============================================================================
|
|
|
|
-- name: GetUserProfile :one
|
|
SELECT
|
|
id,
|
|
email,
|
|
phone,
|
|
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
|
|
FROM users
|
|
WHERE id = $1 AND deleted_at IS NULL;
|
|
|
|
-- name: UpdateUserProfile :exec
|
|
UPDATE users SET
|
|
phone = COALESCE(sqlc.narg('phone'), phone),
|
|
first_name = COALESCE(sqlc.narg('first_name'), first_name),
|
|
last_name = COALESCE(sqlc.narg('last_name'), last_name),
|
|
avatar_url = COALESCE(sqlc.narg('avatar_url'), avatar_url),
|
|
address = COALESCE(sqlc.narg('address'), address),
|
|
city = COALESCE(sqlc.narg('city'), city),
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = sqlc.arg('user_id');
|
|
|
|
-- name: UpdateUserLocation :exec
|
|
UPDATE users SET
|
|
location = ST_SetSRID(ST_MakePoint($2, $3), 4326)::geography,
|
|
address = COALESCE(sqlc.narg('address'), address),
|
|
city = COALESCE(sqlc.narg('city'), city),
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1;
|
|
|
|
-- name: VerifyUserEmail :exec
|
|
UPDATE users SET
|
|
email_verified = TRUE,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1;
|
|
|
|
-- name: UpdateUserPassword :exec
|
|
UPDATE users SET
|
|
password_hash = $2,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1;
|
|
|
|
-- name: BlockUser :exec
|
|
UPDATE users SET
|
|
is_blocked = TRUE,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1;
|
|
|
|
-- name: UnblockUser :exec
|
|
UPDATE users SET
|
|
is_blocked = FALSE,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1;
|
|
|
|
-- name: SoftDeleteUser :exec
|
|
UPDATE users SET
|
|
deleted_at = CURRENT_TIMESTAMP,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1;
|
|
|
|
-- ============================================================================
|
|
-- Поиск пользователей
|
|
-- ============================================================================
|
|
|
|
-- name: GetUsersByIDs :many
|
|
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 = ANY($1::bigint[])
|
|
AND deleted_at IS NULL;
|
|
|
|
-- name: SearchUsersByName :many
|
|
SELECT
|
|
id,
|
|
email,
|
|
first_name,
|
|
last_name,
|
|
avatar_url,
|
|
volunteer_rating,
|
|
completed_requests_count,
|
|
is_verified
|
|
FROM users
|
|
WHERE (first_name ILIKE '%' || $1 || '%' OR last_name ILIKE '%' || $1 || '%' OR (first_name || ' ' || last_name) ILIKE '%' || $1 || '%')
|
|
AND deleted_at IS NULL
|
|
AND is_blocked = FALSE
|
|
ORDER BY volunteer_rating DESC NULLS LAST
|
|
LIMIT $2 OFFSET $3;
|
|
|
|
-- name: GetVolunteerStatistics :one
|
|
SELECT
|
|
id,
|
|
first_name,
|
|
last_name,
|
|
volunteer_rating,
|
|
completed_requests_count,
|
|
created_at as member_since
|
|
FROM users
|
|
WHERE id = $1
|
|
AND deleted_at IS NULL;
|