teldrive/internal/database/migrations/20240607114052_modify_functions.sql

50 lines
1.2 KiB
MySQL
Raw Normal View History

-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE FUNCTION teldrive.get_file_from_path(full_path text,u_id bigint)
RETURNS setof teldrive.files AS $$
DECLARE
target_id text;
begin
IF full_path = '/' then
RETURN QUERY select * from teldrive.files as root where root.parent_id = 'root' and root.user_id = u_id;
END IF;
WITH RECURSIVE dir_hierarchy AS (
SELECT
root.id,
root.name,
root.parent_id,
0 AS depth,
'' as path
FROM
teldrive.files as root
WHERE
root.parent_id = 'root' AND root.user_id = u_id
UNION ALL
SELECT
f.id,
f.name,
f.parent_id,
dh.depth + 1 AS depth,
dh.path || '/' || f.name
FROM
teldrive.files f
JOIN
dir_hierarchy dh ON dh.id = f.parent_id
WHERE f.type = 'folder' AND f.user_id = u_id
)
SELECT id into target_id FROM dir_hierarchy dh
WHERE dh.path = full_path
ORDER BY dh.depth DESC
LIMIT 1;
RETURN QUERY select * from teldrive.files where id=target_id;
END;
$$ LANGUAGE plpgsql;
-- +goose StatementEnd