myheats

Live heats, scoring and leaderboard for sport events
git clone https://git.in0rdr.ch/myheats.git
Log | Files | Refs | Pull requests | README | LICENSE

commit 3cd768e8ed9a51d7c6eda4789e94a6873d219d45
parent 76915c567445254e11c4629c6850613abc32c6c0
Author: Andreas Gruhler <andreas.gruhler@adfinis.com>
Date:   Fri, 20 Sep 2024 23:08:10 +0200

doc(readme): remove Supabase

Diffstat:
MREADME.md | 113++++++++++++-------------------------------------------------------------------
Dassets/supabase-schema.png | 0
2 files changed, 16 insertions(+), 97 deletions(-)

diff --git a/README.md b/README.md @@ -5,8 +5,8 @@ This React application was build using [Vite](https://vitejs.dev) (`npm create vite@latest . --template react`) and the following core componentes: * [`react-router-dom`](https://reactrouter.com) for routing between the React components -* [`@supabase/supabase-js`](https://supabase.com/docs/guides/getting-started/quickstarts/reactjs) - for connection to the Supabase database +* [`postgres`](https://github.com/porsager/postgres#realtime-subscribe) for + realtime subscription to leaderboard changes with PostgreSQL publication * [`react-select`](https://react-select.com) for the selectbox widgets ## Running the App @@ -14,9 +14,7 @@ vite@latest . --template react`) and the following core componentes: # Install dependencies npm install -# Export Supabase URI and database access key -export VITE_APP_SUPABASE_URL= -export VITE_APP_SUPABASE_KEY= +# Export all required environment variables, see example in .env # Start authentication API backend npm run api @@ -35,115 +33,36 @@ function. Following ranking options can be selected. Rank by: * Total: Ranks by sum of all selected heats ## Database schema -The Supabase schema is stored in the `schema` folder and can be created using plain psql. +The PostgreSQL database schema is stored in the `schema` folder and can be +created using plain psql. -![supabase-schema](assets/supabase-schema.png) - -To update the schema from the current database, use (example for table `startlist`): +To update the schema from the current database, use (example for table +`startlist`): ```bash -pg_dump -h db.youruniquedb.supabase.co -U postgres -t 'public.startlist' --schema-only > schema/startlist.sql -``` - -Additionally, following views and functions are required: - -```sql --- Summarize all scores of a heat -create or replace view score_summary - with (security_invoker=on) - as - select a.id as athlete_id, s.heat as heat_id, SUM(s.score) as score_summary - from scores s - join athletes as a on a.id = s.athlete - group by a.id, s.heat; - --- Create distinct set of athletes (startlist) from a set of heats -create or replace function distinct_startlist(heat_ids numeric[]) -returns table(id bigint, athlete bigint, nr bigint, firstname text, lastname text, -birthday date, school text) -language plpgsql -set search_path = '' -as $$ -begin - return query - select distinct on (a.id) s.id, a.id, a.nr, a.firstname, a.lastname, a.birthday, a.school - from public.startlist as s - join public.athletes as a on s.athlete = a.id - where s.heat = any (heat_ids); -end; -$$; +pg_dump -h 127.0.0.1 -U postgres -t 'public.startlist' --schema-only > schema/04-startlist.sql ``` -Add a trigger for connecting users with judges: -```sql --- https://supabase.com/docs/guides/auth/managing-user-data#using-triggers --- inserts a row into public.judges ---drop trigger if exists on_auth_user_created on auth.users; -create or replace function public.handle_new_judge() -returns trigger -language plpgsql -security definer set search_path = '' -as $$ -begin - insert into public.judges (id) - values (new.id); - return new; -end; -$$; - --- trigger the function every time a user is created -create trigger on_auth_user_created - after insert on auth.users - for each row execute procedure public.handle_new_judge(); -``` - -Lastly, enable [PostgreSQL publication](https://www.postgresql.org/docs/current/logical-replication-publication.html) for the [Supabase realtime feature on Postgres changes](https://supabase.com/docs/guides/realtime/extensions/postgres-changes): -```sql -begin; - --- remove the supabase_realtime publication -drop - publication if exists supabase_realtime; - --- re-create the supabase_realtime publication with no tables -create publication supabase_realtime; - -commit; - --- add a table to the publication -alter - publication supabase_realtime add table scores; -``` - -This is required for the leaderboard to automatically update scores when they are created or changed by judges. +The views and functions from `./schema/99-init-db.sql` are required. Among +others, this enables [PostgreSQL +publication](https://www.postgresql.org/docs/current/logical-replication-publication.html) +so the leaderboard can automatically update scores when they are created or +changed by judges ("realtime functionality"). ## Authentication with magic links -Authentication of judges is performed using [Supabase Magic -Links](https://supabase.com/docs/guides/auth/auth-magic-link). - -The basic code for the authentication flow was taken from the [official React -Getting Started -Tutorial](https://supabase.com/docs/guides/getting-started/tutorials/with-react). +Authentication of judges is performed using Magic links. Sign up process for new judges: * The judge is required to have a valid email address -* Judges can be invied to the scoring backend by invite only (Click - ["Invite"](https://app.supabase.com/project/_/auth/users) in Supabase -backend) -* The UUID is referenced automatically in the `judges` table, row can be - amended with name of the judge +* Judges can be invied to the scoring backend by invite only (table `public.judges`) Sign in process: * For sign in, the judge enters her email adress and receives a login link * The login information is stored in the browser session until sign out -### Supabase rate limits -* 4 emails per hour (e.g., sign-in magic links) -* https://supabase.com/docs/guides/auth/rate-limits - ## Bulk import/export Use direct postgres database access: ```bash -psql -h db.youruniquedb.supabase.co -U postgres +psql -h 127.0.0.1 -U postgres ``` To import data from local csv: diff --git a/assets/supabase-schema.png b/assets/supabase-schema.png Binary files differ.