feat: implement wish list and wish features including creation, retrieval, and updates;
fix: modify ban logic to respect expiration timestamps and pardon flags; refactor: change boolean fields to non-nullable in models and use COALESCE for optional updates in SQL
This commit is contained in:
119
sqlc/query.sql
119
sqlc/query.sql
@@ -32,7 +32,9 @@ WHERE id = $1;
|
||||
|
||||
;-- name: UpdateUserByUsername :exec
|
||||
UPDATE users
|
||||
SET verified = $2, deleted = $3
|
||||
SET
|
||||
verified = COALESCE($2, verified),
|
||||
deleted = COALESCE($3, deleted)
|
||||
WHERE username = $1;
|
||||
|
||||
;-- name: DeleteUser :exec
|
||||
@@ -56,29 +58,6 @@ SELECT users.* FROM users
|
||||
JOIN login_informations linfo ON linfo.user_id = users.id
|
||||
WHERE linfo.email = @email::text;
|
||||
|
||||
;-- name: CheckUserRegistrationAvailability :one
|
||||
-- SELECT
|
||||
-- COUNT(users.username = @username::text) > 0 AS username_busy,
|
||||
-- COUNT(linfo.email = @email::text) > 0 AS email_busy
|
||||
-- FROM users
|
||||
-- JOIN login_informations AS linfo on linfo.user_id = users.id
|
||||
-- WHERE
|
||||
-- (
|
||||
-- users.username = @username::text OR
|
||||
-- linfo.email = @email::text
|
||||
-- )
|
||||
-- AND
|
||||
-- (
|
||||
-- users.verified IS TRUE OR
|
||||
-- COUNT(
|
||||
-- SELECT confirmation_codes as codes
|
||||
-- JOIN users on users.id = codes.user_id
|
||||
-- WHERE codes.code_type = 0 AND
|
||||
-- codes.deleted IS FALSE AND
|
||||
-- codes.expires_at < CURRENT_TIMESTAMP
|
||||
-- ) = 0;
|
||||
-- )
|
||||
|
||||
;-- name: GetValidUserByLoginCredentials :one
|
||||
SELECT
|
||||
users.*,
|
||||
@@ -86,12 +65,17 @@ SELECT
|
||||
linfo.totp_encrypted
|
||||
FROM users
|
||||
JOIN login_informations AS linfo ON users.id = linfo.user_id
|
||||
LEFT JOIN banned_users AS banned ON users.id = banned.user_id
|
||||
WHERE
|
||||
users.username = $1 AND
|
||||
users.verified IS TRUE AND -- Verified
|
||||
users.deleted IS FALSE AND -- Not deleted
|
||||
banned.user_id IS NULL AND -- Not banned
|
||||
NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM banned_users
|
||||
WHERE user_id = users.id AND
|
||||
pardoned IS FALSE AND
|
||||
(expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
|
||||
) AND -- Not banned
|
||||
linfo.password_hash = crypt(@password::text, linfo.password_hash); -- Password hash matches
|
||||
|
||||
;-- name: CheckUserRegistrationAvailability :one
|
||||
@@ -320,7 +304,9 @@ WHERE
|
||||
AND NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM banned_users
|
||||
WHERE user_id = u.id
|
||||
WHERE user_id = u.id AND
|
||||
pardoned IS FALSE AND
|
||||
(expires_at IS NULL OR expires_at < CURRENT_TIMESTAMP)
|
||||
)
|
||||
);
|
||||
|
||||
@@ -371,3 +357,82 @@ JOIN users ON users.id = profiles.user_id
|
||||
WHERE users.username = $1;
|
||||
|
||||
--: }}}
|
||||
|
||||
--: Wish List Object {{{
|
||||
|
||||
;-- name: CreateWishList :one
|
||||
INSERT INTO wish_lists(profile_id, hidden, name, icon_name, color, color_grad)
|
||||
VALUES (
|
||||
(SELECT p.id FROM profiles AS p
|
||||
JOIN users AS u ON u.id = p.user_id
|
||||
WHERE u.username = @username::text),
|
||||
@hidden::boolean,
|
||||
@name::text,
|
||||
@icon_name::text,
|
||||
@color::text,
|
||||
@color_grad::boolean
|
||||
)
|
||||
RETURNING *;
|
||||
|
||||
;-- name: UpdateWishListByGuid :exec
|
||||
UPDATE wish_lists wl
|
||||
SET
|
||||
hidden = COALESCE(@hidden::boolean, wl.hidden),
|
||||
name = COALESCE(@name::text, wl.name),
|
||||
icon_name = COALESCE(@icon_name::text, wl.icon_name),
|
||||
color = COALESCE(@color::text, wl.color),
|
||||
color_grad = COALESCE(@color_grad::text, wl.color_grad),
|
||||
deleted = COALESCE(@deleted::boolean, wl.deleted)
|
||||
WHERE wl.guid = (@guid::text)::uuid;
|
||||
|
||||
;-- name: GetWishlistByGuid :one
|
||||
SELECT * FROM wish_lists wl
|
||||
WHERE wl.guid = (@guid::text)::uuid;
|
||||
|
||||
-- name: GetWishlistsByUsernameWithPrivacy :many
|
||||
SELECT
|
||||
wl.*,
|
||||
CASE
|
||||
WHEN (ps.hide_profile_details OR ps.hide_for_unauthenticated) THEN FALSE
|
||||
ELSE TRUE
|
||||
END AS access_allowed
|
||||
FROM
|
||||
wish_lists wl
|
||||
JOIN
|
||||
profiles AS p ON wl.profile_id = p.id
|
||||
JOIN
|
||||
profile_settings AS ps ON ps.profile_id = p.id
|
||||
JOIN
|
||||
users AS u ON p.user_id = u.id
|
||||
WHERE
|
||||
wl.deleted IS FALSE AND
|
||||
u.username = @username::text AND
|
||||
(
|
||||
u.username = @requester::text OR
|
||||
(u.verified IS TRUE AND
|
||||
NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM banned_users
|
||||
WHERE user_id = u.id AND
|
||||
pardoned IS FALSE AND
|
||||
(expires_at IS NULL OR expires_at < CURRENT_TIMESTAMP)
|
||||
))
|
||||
);
|
||||
|
||||
--: }}}
|
||||
|
||||
--: Wish Object {{{
|
||||
|
||||
;-- name: UpdateWishByGuid :exec
|
||||
UPDATE wishes w
|
||||
SET
|
||||
name = COALESCE(@name::text, w.name),
|
||||
description = COALESCE(@description::text, w.description),
|
||||
picture_url = COALESCE(@picture_url::text, w.picture_url),
|
||||
stars = COALESCE(@stars::smallint, w.stars),
|
||||
fulfilled = COALESCE(@fulfilled::boolean, w.fulfilled),
|
||||
fulfilled_date = COALESCE(@fulfilled_date::timestamp, w.fulfilled_date),
|
||||
deleted = COALESCE(@deleted::boolean, w.deleted)
|
||||
WHERE w.guid = (@guid::text)::uuid;
|
||||
|
||||
--: }}}
|
||||
|
||||
Reference in New Issue
Block a user