Supabase trigger not being called

86 Views Asked by At

I'm following this guide Build a User Management App with Flutter and I'm at theStorage Management section but even after enabling the http extension and defining the SQL functions in the SQL Editor to delete the user avatar when a new one is uploaded, nothing happens. The old avatar remains and a new one is created in the storage bucket. I don't see any error logs and I'm not sure I set it up correctly. I also ran each function at least once but they all returned success. These are the functions:

delete_storage_object

create or replace function delete_storage_object(bucket text, object text, out status int, out content text)
returns record
language 'plpgsql'
security definer
as $$
declare
  project_url text := '<YOURPROJECTURL>';
  service_role_key text := '<YOURSERVICEROLEKEY>'; --  full access needed
  url text := project_url||'/storage/v1/object/'||bucket||'/'||object;
begin
  select
      into status, content
           result.status::int, result.content::text
      FROM extensions.http((
    'DELETE',
    url,
    ARRAY[extensions.http_header('authorization','Bearer '||service_role_key)],
    NULL,
    NULL)::extensions.http_request) as result;
end;
$$;

delete_avatar

    create or replace function delete_avatar(avatar_url text, out status int, out content text)
    returns record
    language 'plpgsql'
    security definer
    as $$
    begin
      select
          into status, content
               result.status, result.content
          from public.delete_storage_object('avatars', avatar_url) as result;
    end;
    $$;

create or replace function delete_old_avatar()
returns trigger
language 'plpgsql'
security definer
as $$
declare
  status int;
  content text;
  avatar_name text;
begin
  if coalesce(old.avatar_url, '') <> ''
      and (tg_op = 'DELETE' or (old.avatar_url <> coalesce(new.avatar_url, ''))) then
    -- extract avatar name
    avatar_name := old.avatar_url;
    select
      into status, content
      result.status, result.content
      from public.delete_avatar(avatar_name) as result;
    if status <> 200 then
      raise warning 'Could not delete avatar: % %', status, content;
    end if;
  end if;
  if tg_op = 'DELETE' then
    return old;
  end if;
  return new;
end;
$$;

create trigger before_profile_changes
  before update of avatar_url or delete on public.profiles
  for each row execute function public.delete_old_avatar();

I would like to know how to fix this.

0

There are 0 best solutions below