Files
phylum/server/sql/queries/trash.sql
2025-03-19 13:16:42 +05:30

92 lines
2.7 KiB
SQL

-- name: SoftDelete :exec
WITH RECURSIVE nodes(id, parent) AS (
SELECT r.id, r.parent
FROM resources r
WHERE
CASE @preserve_root::boolean
WHEN TRUE THEN r.parent = @id::uuid
ELSE r.id = @id::uuid
END
UNION ALL
SELECT r.id, r.parent
FROM resources r JOIN nodes n on r.parent = n.id
WHERE deleted IS NULL
)
UPDATE resources
SET modified = NOW(), deleted = NOW()
FROM nodes
WHERE nodes.id = resources.id;
-- name: HardDelete :many
WITH RECURSIVE nodes(id, parent) AS (
SELECT r.id, r.parent
FROM resources r
WHERE
CASE @preserve_root::boolean
WHEN TRUE THEN r.parent = @id::uuid
ELSE r.id = @id::uuid
END
UNION ALL
SELECT r.id, r.parent
FROM resources r JOIN nodes n on r.parent = n.id
WHERE deleted IS NULL
)
DELETE FROM resources
WHERE id IN (SELECT id FROM nodes)
RETURNING id, dir;
-- name: HardDeleteExpired :many
DELETE FROM resources WHERE deleted < @t::TIMESTAMP RETURNING id, dir;
-- name: RestoreDeleted :many
WITH RECURSIVE nodes(id, parent, ts) AS (
SELECT r.id, r.parent, r.deleted
FROM resources r
WHERE r.id = @resource_id::UUID
AND CASE
WHEN sqlc.narg('username')::TEXT IS NULL THEN TRUE
ELSE permissions[@username::TEXT]::integer <> 0 END
UNION ALL
SELECT r.id, r.parent, n.ts
FROM resources r
JOIN nodes n ON r.parent = n.id
WHERE r.deleted = n.ts
)
UPDATE resources
SET modified = NOW(), deleted = NULL
FROM nodes
WHERE resources.id = nodes.id
RETURNING resources.content_length;
SELECT r.*
FROM nodes n
JOIN resources r
ON n.id = r.id
WHERE n.depth >= @min_depth::INTEGER;
-- name: TrashList :many
SELECT * FROM resources
WHERE CASE
WHEN sqlc.narg('last_timestamp')::TIMESTAMP IS NULL THEN deleted IS NOT NULL
ELSE deleted < @last_timestamp::TIMESTAMP OR (deleted = @last_timestamp::TIMESTAMP AND id < @last_id::UUID) END
AND CASE
WHEN sqlc.narg('username')::TEXT IS NULL THEN TRUE
ELSE permissions[@username::TEXT]::integer <> 0 END
ORDER BY deleted DESC, id DESC
LIMIT @n::INTEGER;
-- name: TrashSummary :one
SELECT COALESCE(SUM(content_length), 0)::INTEGER AS size, COUNT(*) AS items
FROM resources
WHERE deleted IS NOT NULL
AND CASE
WHEN sqlc.narg('username')::TEXT IS NULL THEN TRUE
ELSE permissions[@username::TEXT]::integer <> 0 END;
-- name: EmptyTrash :many
DELETE FROM resources
WHERE deleted IS NOT NULL
AND CASE
WHEN sqlc.narg('username')::TEXT IS NULL THEN TRUE
ELSE permissions[@username::TEXT]::integer & 32 <> 0 END
RETURNING id, dir;