feat: org and course student analytics page (#509)
* UI initialization * feat: structure API * feat: audience & people analytics * feat: quick changes * feat: add comments * redesign course student page * chore: make requests to db more efficient * clean up analytics page for course * feat: finish up audience analytics page * chore: minor UI tweaks * translate all * replace inserts of log in events to update * catch error if last_login isn't inserted --------- Co-authored-by: Rotimi Best <best@classroomio.com>
This commit is contained in:
co-authored by
Rotimi Best
parent
381776f388
commit
f69bf920a9
@@ -0,0 +1,122 @@
|
||||
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) THEN
|
||||
INSERT INTO public.analytics_login_events (logged_in_at, user_id)
|
||||
VALUES (NEW.updated_at, NEW.user_id);
|
||||
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);
|
||||
Reference in New Issue
Block a user