mirror of
https://github.com/supabase/supabase.git
synced 2026-10-07 10:25:06 +03:00
162 lines
6.0 KiB
PL/PgSQL
162 lines
6.0 KiB
PL/PgSQL
create schema if not exists graphql_public;
|
|
|
|
-- GraphQL Placeholder Entrypoint
|
|
create or replace function graphql_public.graphql(
|
|
"operationName" text default null,
|
|
query text default null,
|
|
variables jsonb default null,
|
|
extensions jsonb default null
|
|
)
|
|
returns jsonb
|
|
language plpgsql
|
|
as $$
|
|
DECLARE
|
|
server_version float;
|
|
BEGIN
|
|
server_version = (SELECT (SPLIT_PART((select version()), ' ', 2))::float);
|
|
|
|
IF server_version >= 14 THEN
|
|
RETURN jsonb_build_object(
|
|
'errors', jsonb_build_array(
|
|
jsonb_build_object(
|
|
'message', 'pg_graphql extension is not enabled.'
|
|
)
|
|
)
|
|
);
|
|
ELSE
|
|
RETURN jsonb_build_object(
|
|
'errors', jsonb_build_array(
|
|
jsonb_build_object(
|
|
'message', 'pg_graphql is only available on projects running Postgres 14 onwards.'
|
|
)
|
|
)
|
|
);
|
|
END IF;
|
|
END;
|
|
$$;
|
|
|
|
grant usage on schema graphql_public to postgres, anon, authenticated, service_role;
|
|
alter default privileges in schema graphql_public grant all on tables to postgres, anon, authenticated, service_role;
|
|
alter default privileges in schema graphql_public grant all on functions to postgres, anon, authenticated, service_role;
|
|
alter default privileges in schema graphql_public grant all on sequences to postgres, anon, authenticated, service_role;
|
|
|
|
alter default privileges for user supabase_admin in schema graphql_public grant all
|
|
on sequences to postgres, anon, authenticated, service_role;
|
|
alter default privileges for user supabase_admin in schema graphql_public grant all
|
|
on tables to postgres, anon, authenticated, service_role;
|
|
alter default privileges for user supabase_admin in schema graphql_public grant all
|
|
on functions to postgres, anon, authenticated, service_role;
|
|
|
|
-- Trigger upon enabling pg_graphql
|
|
create or replace function extensions.grant_pg_graphql_access()
|
|
returns event_trigger
|
|
language plpgsql
|
|
AS $func$
|
|
DECLARE
|
|
func_is_graphql_resolve bool;
|
|
BEGIN
|
|
func_is_graphql_resolve = (
|
|
SELECT n.proname = 'resolve'
|
|
FROM pg_event_trigger_ddl_commands() AS ev
|
|
LEFT JOIN pg_catalog.pg_proc AS n
|
|
ON ev.objid = n.oid
|
|
);
|
|
|
|
IF func_is_graphql_resolve
|
|
THEN
|
|
grant usage on schema graphql to postgres, anon, authenticated, service_role;
|
|
grant all on function graphql.resolve to postgres, anon, authenticated, service_role;
|
|
|
|
alter default privileges in schema graphql grant all on tables to postgres, anon, authenticated, service_role;
|
|
alter default privileges in schema graphql grant all on functions to postgres, anon, authenticated, service_role;
|
|
alter default privileges in schema graphql grant all on sequences to postgres, anon, authenticated, service_role;
|
|
|
|
-- Update public wrapper to pass all arguments through to the pg_graphql resolve func
|
|
create or replace function graphql_public.graphql(
|
|
"operationName" text default null,
|
|
query text default null,
|
|
variables jsonb default null,
|
|
extensions jsonb default null
|
|
)
|
|
returns jsonb
|
|
language sql
|
|
as $$
|
|
select graphql.resolve(
|
|
query := query,
|
|
variables := coalesce(variables, '{}'),
|
|
"operationName" := "operationName",
|
|
extensions := extensions
|
|
);
|
|
$$;
|
|
|
|
grant select on graphql.field, graphql.type, graphql.enum_value to postgres, anon, authenticated, service_role;
|
|
grant execute on function graphql.resolve to postgres, anon, authenticated, service_role;
|
|
END IF;
|
|
|
|
END;
|
|
$func$;
|
|
|
|
CREATE EVENT TRIGGER issue_pg_graphql_access ON ddl_command_end WHEN TAG in ('CREATE FUNCTION')
|
|
EXECUTE PROCEDURE extensions.grant_pg_graphql_access();
|
|
COMMENT ON FUNCTION extensions.grant_pg_graphql_access IS 'Grants access to pg_graphql';
|
|
|
|
-- Trigger upon dropping the pg_graphql extension
|
|
CREATE OR REPLACE FUNCTION extensions.set_graphql_placeholder()
|
|
RETURNS event_trigger
|
|
LANGUAGE plpgsql
|
|
AS $func$
|
|
DECLARE
|
|
graphql_is_dropped bool;
|
|
BEGIN
|
|
graphql_is_dropped = (
|
|
SELECT ev.schema_name = 'graphql_public'
|
|
FROM pg_event_trigger_dropped_objects() AS ev
|
|
WHERE ev.schema_name = 'graphql_public'
|
|
);
|
|
|
|
IF graphql_is_dropped
|
|
THEN
|
|
create or replace function graphql_public.graphql(
|
|
"operationName" text default null,
|
|
query text default null,
|
|
variables jsonb default null,
|
|
extensions jsonb default null
|
|
)
|
|
returns jsonb
|
|
language plpgsql
|
|
as $$
|
|
DECLARE
|
|
server_version float;
|
|
BEGIN
|
|
server_version = (SELECT (SPLIT_PART((select version()), ' ', 2))::float);
|
|
|
|
IF server_version >= 14 THEN
|
|
RETURN jsonb_build_object(
|
|
'errors', jsonb_build_array(
|
|
jsonb_build_object(
|
|
'message', 'pg_graphql extension is not enabled.'
|
|
)
|
|
)
|
|
);
|
|
ELSE
|
|
RETURN jsonb_build_object(
|
|
'errors', jsonb_build_array(
|
|
jsonb_build_object(
|
|
'message', 'pg_graphql is only available on projects running Postgres 14 onwards.'
|
|
)
|
|
)
|
|
);
|
|
END IF;
|
|
END;
|
|
$$;
|
|
END IF;
|
|
|
|
END;
|
|
$func$;
|
|
|
|
CREATE EVENT TRIGGER issue_graphql_placeholder ON sql_drop WHEN TAG in ('DROP EXTENSION')
|
|
EXECUTE PROCEDURE extensions.set_graphql_placeholder();
|
|
COMMENT ON FUNCTION extensions.set_graphql_placeholder IS 'Reintroduces placeholder function for graphql_public.graphql';
|
|
|
|
drop extension if exists pg_graphql;
|
|
create extension if not exists pg_graphql; |