Files
classroomio/supabase/migrations/20241016235827_student_analytics.sql
T

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);