126 lines
4.4 KiB
PL/PgSQL
126 lines
4.4 KiB
PL/PgSQL
create table "public"."analytics_login_events" (
|
|
"id" uuid not null default uuid_generate_v4(),
|
|
"user_id" uuid not null,
|
|
"logged_in_at" timestamp with time zone default now()
|
|
);
|
|
|
|
alter table "public"."analytics_login_events" enable row level security;
|
|
|
|
CREATE UNIQUE INDEX analytics_login_events_pkey ON public.analytics_login_events USING btree (id);
|
|
|
|
CREATE INDEX idx_analytics_login_events_logged_in_at ON public.analytics_login_events USING btree (logged_in_at);
|
|
|
|
CREATE INDEX idx_analytics_login_events_user_id ON public.analytics_login_events USING btree (user_id);
|
|
|
|
CREATE UNIQUE INDEX analytics_login_events_user_id_unique ON public.analytics_login_events USING btree (user_id);
|
|
|
|
alter table "public"."analytics_login_events" add constraint "analytics_login_events_pkey" PRIMARY KEY using index "analytics_login_events_pkey";
|
|
|
|
alter table "public"."analytics_login_events" add constraint "analytics_login_events_user_id_fkey" FOREIGN KEY (user_id) REFERENCES auth.users(id) not valid;
|
|
|
|
alter table "public"."analytics_login_events" validate constraint "analytics_login_events_user_id_fkey";
|
|
|
|
alter table "public"."analytics_login_events" add constraint "analytics_login_events_user_id_unique" UNIQUE using index "analytics_login_events_user_id_unique";
|
|
|
|
set check_function_bodies = off;
|
|
|
|
CREATE OR REPLACE FUNCTION public.insert_login_event_on_user_login()
|
|
RETURNS trigger
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
AS $function$
|
|
BEGIN
|
|
IF (NEW.last_sign_in_at IS NOT NULL) THEN
|
|
INSERT INTO public.analytics_login_events (logged_in_at, user_id)
|
|
VALUES (NEW.last_sign_in_at, NEW.id)
|
|
ON CONFLICT (user_id) DO UPDATE
|
|
SET logged_in_at = NEW.last_sign_in_at;
|
|
END IF;
|
|
RETURN NEW;
|
|
END;
|
|
$function$
|
|
;
|
|
|
|
CREATE TRIGGER insert_login_event_on_user_login_trigger
|
|
AFTER UPDATE OF last_sign_in_at ON auth.users
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION public.insert_login_event_on_user_login();
|
|
|
|
CREATE OR REPLACE FUNCTION public.insert_login_event_on_user_session_update()
|
|
RETURNS trigger
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
AS $function$
|
|
BEGIN
|
|
IF (NEW.updated_at IS NOT NULL AND NEW.updated_at != OLD.updated_at) THEN
|
|
INSERT INTO public.analytics_login_events (logged_in_at, user_id)
|
|
VALUES (NEW.updated_at, NEW.user_id)
|
|
ON CONFLICT (user_id) DO UPDATE
|
|
SET logged_in_at = EXCLUDED.logged_in_at
|
|
WHERE analytics_login_events.logged_in_at < EXCLUDED.logged_in_at;
|
|
END IF;
|
|
RETURN NEW;
|
|
END;
|
|
$function$
|
|
;
|
|
|
|
CREATE TRIGGER insert_login_event_on_user_session_update_trigger
|
|
AFTER UPDATE OF updated_at ON auth.sessions
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION public.insert_login_event_on_user_session_update();
|
|
|
|
grant delete on table "public"."analytics_login_events" to "anon";
|
|
|
|
grant insert on table "public"."analytics_login_events" to "anon";
|
|
|
|
grant references on table "public"."analytics_login_events" to "anon";
|
|
|
|
grant select on table "public"."analytics_login_events" to "anon";
|
|
|
|
grant trigger on table "public"."analytics_login_events" to "anon";
|
|
|
|
grant truncate on table "public"."analytics_login_events" to "anon";
|
|
|
|
grant update on table "public"."analytics_login_events" to "anon";
|
|
|
|
grant delete on table "public"."analytics_login_events" to "authenticated";
|
|
|
|
grant insert on table "public"."analytics_login_events" to "authenticated";
|
|
|
|
grant references on table "public"."analytics_login_events" to "authenticated";
|
|
|
|
grant select on table "public"."analytics_login_events" to "authenticated";
|
|
|
|
grant trigger on table "public"."analytics_login_events" to "authenticated";
|
|
|
|
grant truncate on table "public"."analytics_login_events" to "authenticated";
|
|
|
|
grant update on table "public"."analytics_login_events" to "authenticated";
|
|
|
|
grant delete on table "public"."analytics_login_events" to "service_role";
|
|
|
|
grant insert on table "public"."analytics_login_events" to "service_role";
|
|
|
|
grant references on table "public"."analytics_login_events" to "service_role";
|
|
|
|
grant select on table "public"."analytics_login_events" to "service_role";
|
|
|
|
grant trigger on table "public"."analytics_login_events" to "service_role";
|
|
|
|
grant truncate on table "public"."analytics_login_events" to "service_role";
|
|
|
|
grant update on table "public"."analytics_login_events" to "service_role";
|
|
|
|
create policy "Users can insert their own login events"
|
|
on "public"."analytics_login_events"
|
|
as permissive
|
|
for insert
|
|
to authenticated
|
|
with check ((auth.uid() = user_id));
|
|
|
|
CREATE POLICY "Enable delete for users based on user_id"
|
|
ON "public"."analytics_login_events"
|
|
AS PERMISSIVE FOR DELETE
|
|
TO public
|
|
USING (auth.uid() = user_id);
|