-- name: IsUserPending :one SELECT CASE WHEN status = 'PENDING' THEN true ELSE false END AS is_pending FROM users WHERE user_name = $1 LIMIT 1; -- name: IsUserNameUnique :one SELECT CASE WHEN COUNT(*) = 0 THEN true ELSE false END AS is_unique FROM users WHERE user_name = $1; -- name: CreateUser :one INSERT INTO users ( first_name, last_name, user_name, email, phone_number, role, password, age, education_level, country, region, email_verified, phone_verified, status, profile_completed, preferred_language, updated_at ) VALUES ( $1, -- first_name $2, -- last_name $3, -- user_name $4, -- email $5, -- phone_number $6, -- role $7, -- password (BYTEA) $8, -- age $9, -- education_level $10, -- country $11, -- region $12, -- email_verified $13, -- phone_verified $14, -- status (PENDING | ACTIVE) $15, -- profile_completed $16, -- preferred_language CURRENT_TIMESTAMP ) RETURNING id, first_name, last_name, user_name, email, phone_number, role, age, education_level, country, region, email_verified, phone_verified, status, profile_completed, preferred_language, created_at, updated_at; -- name: GetUserByID :one SELECT * FROM users WHERE id = $1; -- name: GetAllUsers :many SELECT COUNT(*) OVER () AS total_count, id, first_name, last_name, user_name, email, phone_number, role, age, education_level, country, region, email_verified, phone_verified, status, profile_completed, preferred_language, created_at, updated_at FROM users WHERE ( role = $1 OR $1 IS NULL ) AND ( first_name ILIKE '%' || sqlc.narg('query') || '%' OR last_name ILIKE '%' || sqlc.narg('query') || '%' OR phone_number ILIKE '%' || sqlc.narg('query') || '%' OR email ILIKE '%' || sqlc.narg('query') || '%' OR sqlc.narg('query') IS NULL ) AND ( created_at >= sqlc.narg('created_after') OR sqlc.narg('created_after') IS NULL ) AND ( created_at <= sqlc.narg('created_before') OR sqlc.narg('created_before') IS NULL ) LIMIT sqlc.narg('limit') OFFSET sqlc.narg('offset'); -- name: GetTotalUsers :one SELECT COUNT(*) FROM users WHERE (role = $1 OR $1 IS NULL); -- name: SearchUserByNameOrPhone :many SELECT id, first_name, last_name, user_name, email, phone_number, role, age, education_level, country, region, email_verified, phone_verified, status, profile_completed, created_at, updated_at FROM users WHERE ( first_name ILIKE '%' || $1 || '%' OR last_name ILIKE '%' || $1 || '%' OR phone_number ILIKE '%' || $1 || '%' OR email ILIKE '%' || $1 || '%' ) AND ( role = sqlc.narg('role') OR sqlc.narg('role') IS NULL ); -- name: UpdateUser :exec UPDATE users SET first_name = $1, last_name = $2, status = $3, updated_at = CURRENT_TIMESTAMP WHERE id = $4; -- name: DeleteUser :exec DELETE FROM users WHERE id = $1; -- name: CheckPhoneEmailExist :one SELECT EXISTS ( SELECT 1 FROM users u1 WHERE u1.phone_number = $1 ) AS phone_exists, EXISTS ( SELECT 1 FROM users u2 WHERE u2.email = $2 ) AS email_exists; -- name: GetUserByUserName :one SELECT id, first_name, last_name, user_name, email, phone_number, role, password, age, education_level, country, region, email_verified, phone_verified, status, profile_completed, last_login, profile_picture_url, preferred_language, created_at, updated_at FROM users WHERE user_name = $1 AND $1 IS NOT NULL LIMIT 1; -- name: GetUserByEmailPhone :one SELECT id, first_name, last_name, user_name, email, phone_number, role, password, age, education_level, country, region, email_verified, phone_verified, status, profile_completed, last_login, profile_picture_url, preferred_language, created_at, updated_at FROM users WHERE (email = $1 AND $1 IS NOT NULL) OR (phone_number = $2 AND $2 IS NOT NULL) LIMIT 1; -- name: UpdatePassword :exec UPDATE users SET password = $1, updated_at = CURRENT_TIMESTAMP WHERE email = $2 OR phone_number = $3; -- name: UpdateUserStatus :exec UPDATE users SET status = $1, updated_at = CURRENT_TIMESTAMP WHERE id = $2;