Files
upstream-atomic-crm/supabase/migrations/20260127140209_imports.sql
upstream-mirror 93ecc1a6f8
Some checks failed
✅ Check / 🔬 ESLint (push) Failing after 21s
✅ Check / 🏷️ Typecheck (push) Failing after 11s
✅ Check / 🔎 Test (push) Failing after 11s
✅ Check / e2e-test (push) Failing after 11s
✅ Check / 🔨 Build (push) Failing after 11s
🚀 Deploy / 🚀 Deploy (doc) (push) Failing after 12s
🚀 Deploy / 🚀 Deploy (demo) (push) Failing after 12s
🚀 Deploy / 🚀 Deploy (supabase) (push) Failing after 18s
snapshot of https://github.com/marmelab/atomic-crm.git (main, 2026-09-18; blobs > 131072B omitted)
2026-09-18 01:48:50 +05:00

201 lines
5.9 KiB
PL/PgSQL

create extension if not exists "http" with schema "extensions";
create table "public"."favicons_excluded_domains" (
"id" bigint generated by default as identity not null,
"domain" text not null
);
alter table "public"."favicons_excluded_domains" enable row level security;
CREATE UNIQUE INDEX favicons_excluded_domains_pkey ON public.favicons_excluded_domains USING btree (id);
alter table "public"."favicons_excluded_domains" add constraint "favicons_excluded_domains_pkey" PRIMARY KEY using index "favicons_excluded_domains_pkey";
alter table "public"."tasks" alter column "due_date" drop not null;
set check_function_bodies = off;
CREATE OR REPLACE FUNCTION public.get_avatar_for_email(email text)
RETURNS text
LANGUAGE plpgsql
AS $function$declare email_hash text;
declare gravatar_url text;
declare gravatar_status int8;
declare email_domain text;
declare favicon_url text;
declare domain_status int8;
begin
-- Try to fetch a gravatar image
email_hash = encode(digest(email, 'sha256'), 'hex');
gravatar_url = concat('https://www.gravatar.com/avatar/', email_hash, '?d=404');
select status from http_get(gravatar_url) into gravatar_status;
if gravatar_status = 200 then
return gravatar_url;
end if;
-- Fallback to email's domain favicon if not excluded
email_domain = split_part(email, '@', 2);
return get_domain_favicon(email_domain);
exception
when others then
return 'ERROR';
end;$function$
;
CREATE OR REPLACE FUNCTION public.get_domain_favicon(domain_name text)
RETURNS text
LANGUAGE plpgsql
AS $function$declare domain_status int8;
begin
if exists (select from favicons_excluded_domains as fav where fav.domain = domain_name) then
return null;
end if;
return concat(
'https://favicon.show/',
(regexp_matches(domain_name, '^(?:https?:\/\/)?(?:[^@\/\n]+@)?(?:www\.)?([^:\/?\n]+)', 'i'))[1]
);
end;$function$
;
CREATE OR REPLACE FUNCTION public.handle_contact_saved()
RETURNS trigger
LANGUAGE plpgsql
AS $function$declare contact_avatar text;
declare emails_length int8;
declare item jsonb;
begin
if new.avatar is not null then
return new;
end if;
select coalesce(jsonb_array_length(new.email_jsonb), 0) into emails_length;
if emails_length = 0 then
return new;
end if;
for item in select jsonb_array_elements(new.email_jsonb)
loop
select public.get_avatar_for_email(item->>'email') into contact_avatar;
if (contact_avatar is not null) then
exit;
end if;
end loop;
if contact_avatar is null then
return new;
end if;
new.avatar = concat('{"src":"', contact_avatar, '"}');
return new;
end;$function$
;
CREATE TRIGGER contact_saved BEFORE INSERT OR UPDATE ON public.contacts FOR EACH ROW EXECUTE FUNCTION public.handle_contact_saved();
grant delete on table "public"."favicons_excluded_domains" to "authenticated";
grant insert on table "public"."favicons_excluded_domains" to "authenticated";
grant references on table "public"."favicons_excluded_domains" to "authenticated";
grant select on table "public"."favicons_excluded_domains" to "authenticated";
grant trigger on table "public"."favicons_excluded_domains" to "authenticated";
grant truncate on table "public"."favicons_excluded_domains" to "authenticated";
grant update on table "public"."favicons_excluded_domains" to "authenticated";
grant delete on table "public"."favicons_excluded_domains" to "postgres";
grant insert on table "public"."favicons_excluded_domains" to "postgres";
grant references on table "public"."favicons_excluded_domains" to "postgres";
grant select on table "public"."favicons_excluded_domains" to "postgres";
grant trigger on table "public"."favicons_excluded_domains" to "postgres";
grant truncate on table "public"."favicons_excluded_domains" to "postgres";
grant update on table "public"."favicons_excluded_domains" to "postgres";
grant delete on table "public"."favicons_excluded_domains" to "service_role";
grant insert on table "public"."favicons_excluded_domains" to "service_role";
grant references on table "public"."favicons_excluded_domains" to "service_role";
grant select on table "public"."favicons_excluded_domains" to "service_role";
grant trigger on table "public"."favicons_excluded_domains" to "service_role";
grant truncate on table "public"."favicons_excluded_domains" to "service_role";
grant update on table "public"."favicons_excluded_domains" to "service_role";
create policy "Enable access for authenticated users only"
on "public"."favicons_excluded_domains"
as permissive
for all
to authenticated
using (true)
with check (true);
CREATE OR REPLACE FUNCTION public.handle_company_saved()
RETURNS trigger
LANGUAGE plpgsql
AS $function$declare company_logo text;
begin
if new.logo is not null then
return new;
end if;
company_logo = get_domain_favicon(new.website);
if company_logo is null then
return new;
end if;
new.logo = concat('{"src":"', company_logo, '","title":"Company favicon"}');
return new;
end;$function$
;
CREATE TRIGGER company_saved BEFORE INSERT OR UPDATE ON public.companies FOR EACH ROW EXECUTE FUNCTION public.handle_company_saved();
CREATE OR REPLACE FUNCTION public.handle_contact_note_created_or_updated()
RETURNS trigger
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path TO ''
AS $function$
begin
update public.contacts set last_seen = new.date where contacts.id = new.contact_id and contacts.last_seen < new.date;
return new;
end;
$function$
;
CREATE TRIGGER on_public_contact_notes_created_or_updated AFTER INSERT ON public.contact_notes FOR EACH ROW EXECUTE FUNCTION public.handle_contact_note_created_or_updated();
CREATE OR REPLACE FUNCTION get_user_id_by_email(email TEXT)
RETURNS TABLE (id uuid)
SECURITY definer
AS $$
BEGIN
RETURN QUERY SELECT au.id FROM auth.users au WHERE au.email = $1;
END;
$$ LANGUAGE plpgsql;
revoke execute on function public.get_user_id_by_email from anon, authenticated, public;