diff --git a/arkindex/sql_validation/corpus_rights_filter.sql b/arkindex/sql_validation/corpus_rights_filter.sql index 5f58b9c464271829af4cd05093c59bd4f65c3839..b0b5f6ed6a6b143144388c027dce6ab7281d18ff 100644 --- a/arkindex/sql_validation/corpus_rights_filter.sql +++ b/arkindex/sql_validation/corpus_rights_filter.sql @@ -15,4 +15,5 @@ LEFT OUTER JOIN "users_right" T5 ON ("users_group"."id" = T5."content_id" WHERE (("users_right"."user_id" = {user_id} OR T5."user_id" = {user_id}) AND LEAST("users_right"."level", T5."level") >= {level}) -ORDER BY "documents_corpus"."id" ASC +ORDER BY "documents_corpus"."id" ASC, + "max_level" DESC diff --git a/arkindex/sql_validation/corpus_rights_filter_public.sql b/arkindex/sql_validation/corpus_rights_filter_public.sql index 844eb63468435ee9cc691b4f8b5d0167c37795e8..090c1a9f798f3b9d494cbc4ae7674ec38f09738e 100644 --- a/arkindex/sql_validation/corpus_rights_filter_public.sql +++ b/arkindex/sql_validation/corpus_rights_filter_public.sql @@ -1,30 +1,49 @@ -(SELECT DISTINCT ON ("documents_corpus"."id") "documents_corpus"."created", - "documents_corpus"."updated", - "documents_corpus"."id", - "documents_corpus"."name", - "documents_corpus"."description", - "documents_corpus"."repository_id", - "documents_corpus"."public", - LEAST("users_right"."level", T5."level") AS "max_level" - FROM "documents_corpus" - INNER JOIN "users_right" ON ("documents_corpus"."id" = "users_right"."content_id" +SELECT DISTINCT ON ("documents_corpus"."id") "documents_corpus"."created", + "documents_corpus"."updated", + "documents_corpus"."id", + "documents_corpus"."name", + "documents_corpus"."description", + "documents_corpus"."repository_id", + "documents_corpus"."public", + CASE + WHEN ("documents_corpus"."public" + AND NOT ("users_right"."user_id" = {user_id} + AND "users_right"."user_id" IS NOT NULL) + AND NOT (T5."user_id" = {user_id} + AND T5."user_id" IS NOT NULL)) THEN 10 + ELSE LEAST("users_right"."level", T5."level") + END AS "max_level" +FROM "documents_corpus" +LEFT OUTER JOIN "users_right" ON ("documents_corpus"."id" = "users_right"."content_id" AND ("users_right"."content_type_id" = {corpus_type_id})) - LEFT OUTER JOIN "users_group" ON ("users_right"."group_id" = "users_group"."id") - LEFT OUTER JOIN "users_right" T5 ON ("users_group"."id" = T5."content_id" - AND (T5."content_type_id" = {group_type_id})) - WHERE (("users_right"."user_id" = {user_id} - OR T5."user_id" = {user_id}) - AND LEAST("users_right"."level", T5."level") >= {level}) - ORDER BY "documents_corpus"."id" ASC, "max_level" DESC) -UNION - (SELECT "documents_corpus"."created", - "documents_corpus"."updated", - "documents_corpus"."id", - "documents_corpus"."name", - "documents_corpus"."description", - "documents_corpus"."repository_id", - "documents_corpus"."public", - 10 AS "max_level" - FROM "documents_corpus" - WHERE "documents_corpus"."public") -ORDER BY (3) ASC +LEFT OUTER JOIN "users_group" ON ("users_right"."group_id" = "users_group"."id") +LEFT OUTER JOIN "users_right" T5 ON ("users_group"."id" = T5."content_id" + AND (T5."content_type_id" = {group_type_id})) +WHERE (("users_right"."user_id" = {user_id} + OR T5."user_id" = {user_id} + OR ("documents_corpus"."public" + AND NOT ("documents_corpus"."id" IN + (SELECT U1."content_id" + FROM "users_right" U1 + WHERE (U1."user_id" = {user_id} + AND U1."content_type_id" = {corpus_type_id} + AND U1."id" = "users_right"."id"))) + AND NOT ("documents_corpus"."id" IN + (SELECT U1."content_id" + FROM "users_right" U1 + INNER JOIN "users_group" U2 ON (U1."group_id" = U2."id") + INNER JOIN "users_right" U3 ON (U2."id" = U3."content_id" + AND (U3."content_type_id" = {group_type_id})) + WHERE (U3."user_id" = {user_id} + AND U1."content_type_id" = {corpus_type_id} + AND U1."id" = "users_right"."id"))))) + AND CASE + WHEN ("documents_corpus"."public" + AND NOT ("users_right"."user_id" = {user_id} + AND "users_right"."user_id" IS NOT NULL) + AND NOT (T5."user_id" = {user_id} + AND T5."user_id" IS NOT NULL)) THEN 10 + ELSE LEAST("users_right"."level", T5."level") + END >= 10) +ORDER BY "documents_corpus"."id" ASC, + "max_level" DESC